X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4322df68b099e5e983acc0a3dad4ad5841b57b5..d76a558d4d5216b0590907b92d3182f82057c1ae:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index f814a661f6..8618280d37 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -480,6 +480,15 @@ static gboolean gtk_wx_cell_renderer_activate( GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState flags ); +static GtkCellEditable *gtk_wx_cell_renderer_start_editing( + GtkCellRenderer *cell, + GdkEvent *event, + GtkWidget *widget, + const gchar *path, + GdkRectangle *background_area, + GdkRectangle *cell_area, + GtkCellRendererState flags ); + static GObjectClass *cell_parent_class = NULL; @@ -532,6 +541,7 @@ gtk_wx_cell_renderer_class_init (GtkWxCellRendererClass *klass) cell_class->get_size = gtk_wx_cell_renderer_get_size; cell_class->render = gtk_wx_cell_renderer_render; cell_class->activate = gtk_wx_cell_renderer_activate; + cell_class->start_editing = gtk_wx_cell_renderer_start_editing; } static void @@ -547,6 +557,48 @@ gtk_wx_cell_renderer_new (void) return (GtkCellRenderer*) g_object_new (GTK_TYPE_WX_CELL_RENDERER, NULL); } + + +static GtkCellEditable *gtk_wx_cell_renderer_start_editing( + GtkCellRenderer *renderer, + GdkEvent *event, + GtkWidget *widget, + const gchar *path, + GdkRectangle *background_area, + GdkRectangle *cell_area, + GtkCellRendererState flags ) +{ + GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer; + wxDataViewCustomRenderer *cell = wxrenderer->cell; + if (!cell->HasEditorCtrl()) + return NULL; + + GdkRectangle rect; + gtk_wx_cell_renderer_get_size (renderer, widget, cell_area, + &rect.x, + &rect.y, + &rect.width, + &rect.height); + + rect.x += cell_area->x; + rect.y += cell_area->y; +// rect.width -= renderer->xpad * 2; +// rect.height -= renderer->ypad * 2; + +// wxRect renderrect( rect.x, rect.y, rect.width, rect.height ); + wxRect renderrect( cell_area->x, cell_area->y, cell_area->width, cell_area->height ); + + wxDataViewListModel *model = cell->GetOwner()->GetOwner()->GetModel(); + + GtkTreePath *treepath = gtk_tree_path_new_from_string( path ); + unsigned int model_row = (unsigned int)gtk_tree_path_get_indices (treepath)[0]; + gtk_tree_path_free( treepath ); + + cell->StartEditing( model_row, renderrect ); + + return NULL; +} + static void gtk_wx_cell_renderer_get_size (GtkCellRenderer *renderer, GtkWidget *widget, @@ -678,7 +730,17 @@ gtk_wx_cell_renderer_activate( unsigned int model_col = cell->GetOwner()->GetModelColumn(); - if (event->type == GDK_BUTTON_PRESS) + if (!event) + { + bool ret = false; + + // activated by + if (cell->Activate( renderrect, model, model_col, model_row )) + ret = true; + + return ret; + } + else if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *button_event = (GdkEventButton*) event; wxPoint pt( ((int) button_event->x) - renderrect.x, @@ -716,6 +778,7 @@ class wxGtkDataViewListModelNotifier: public wxDataViewListModelNotifier { public: wxGtkDataViewListModelNotifier( GtkWxListStore* gtk_store, wxDataViewListModel *wx_model ); + ~wxGtkDataViewListModelNotifier(); virtual bool RowAppended(); virtual bool RowPrepended(); @@ -726,13 +789,6 @@ public: virtual bool RowsReordered( unsigned int *new_order ); virtual bool Cleared(); - virtual bool Freed() - { - m_wx_model = NULL; - m_gtk_store = NULL; - return wxDataViewListModelNotifier::Freed(); - } - GtkWxListStore *m_gtk_store; wxDataViewListModel *m_wx_model; }; @@ -748,6 +804,12 @@ wxGtkDataViewListModelNotifier::wxGtkDataViewListModelNotifier( m_wx_model = wx_model; } +wxGtkDataViewListModelNotifier::~wxGtkDataViewListModelNotifier() +{ + m_wx_model = NULL; + m_gtk_store = NULL; +} + bool wxGtkDataViewListModelNotifier::RowAppended() { unsigned int pos = m_wx_model->GetRowCount()-1; @@ -817,7 +879,8 @@ bool wxGtkDataViewListModelNotifier::RowChanged( unsigned int row ) bool wxGtkDataViewListModelNotifier::ValueChanged( unsigned int model_col, unsigned int model_row ) { // This adds GTK+'s missing MVC logic for ValueChanged - wxNode *node = GetOwner()->m_viewingColumns.GetFirst(); + wxObjectList::compatibility_iterator + node = GetOwner()->m_viewingColumns.GetFirst(); while (node) { wxDataViewViewingColumn* viewing_column = (wxDataViewViewingColumn*) node->GetData(); @@ -833,10 +896,14 @@ bool wxGtkDataViewListModelNotifier::ValueChanged( unsigned int model_col, unsig gtk_tree_view_get_cell_area( widget, path, column, &cell_area ); gtk_tree_path_free( path ); + GtkAdjustment* hadjust = gtk_tree_view_get_hadjustment( widget ); + double d = gtk_adjustment_get_value( hadjust ); + int xdiff = (int) d; + int ydiff = column->button->allocation.height; // Redraw gtk_widget_queue_draw_area( GTK_WIDGET(widget), - cell_area.x, ydiff + cell_area.y, cell_area.width, cell_area.height ); + cell_area.x - xdiff, ydiff + cell_area.y, cell_area.width, cell_area.height ); } node = node->GetNext(); @@ -854,7 +921,8 @@ bool wxGtkDataViewListModelNotifier::RowsReordered( unsigned int *new_order ) gtk_tree_path_free (path); // This adds GTK+'s missing MVC logic for RowsReordered - wxNode *node = GetOwner()->m_viewingColumns.GetFirst(); + wxObjectList::compatibility_iterator + node = GetOwner()->m_viewingColumns.GetFirst(); while (node) { wxDataViewViewingColumn* viewing_column = (wxDataViewViewingColumn*) node->GetData(); @@ -1017,7 +1085,7 @@ static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer, { wxDataViewTextRenderer *cell = (wxDataViewTextRenderer*) user_data; - wxString tmp = wxGTK_CONV_BACK( arg2 ); + wxString tmp = wxGTK_CONV_BACK_FONT(arg2, cell->GetOwner()->GetOwner()->GetFont()); wxVariant value = tmp; if (!cell->Validate( value )) return; @@ -1040,7 +1108,7 @@ wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxD int align ) : wxDataViewRenderer( varianttype, mode, align ) { - m_renderer = (GtkWidget*) gtk_cell_renderer_text_new(); + m_renderer = (GtkCellRenderer*) gtk_cell_renderer_text_new(); if (mode & wxDATAVIEW_CELL_EDITABLE) { @@ -1075,7 +1143,8 @@ bool wxDataViewTextRenderer::GetValue( wxVariant &value ) const GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_STRING ); g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); - wxString tmp = wxGTK_CONV_BACK( g_value_get_string( &gvalue ) ); + wxString tmp = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), + wx_const_cast(wxDataViewTextRenderer*, this)->GetOwner()->GetOwner()->GetFont() ); g_value_unset( &gvalue ); value = tmp; @@ -1087,8 +1156,10 @@ void wxDataViewTextRenderer::SetAlignment( int align ) { wxDataViewRenderer::SetAlignment(align); - // horizontal alignment: + if (gtk_check_version(2,10,0)) + return; + // horizontal alignment: PangoAlignment pangoAlign = PANGO_ALIGN_LEFT; if (align & wxALIGN_RIGHT) pangoAlign = PANGO_ALIGN_RIGHT; @@ -1112,7 +1183,7 @@ wxDataViewBitmapRenderer::wxDataViewBitmapRenderer( const wxString &varianttype, int align ) : wxDataViewRenderer( varianttype, mode, align ) { - m_renderer = (GtkWidget*) gtk_cell_renderer_pixbuf_new(); + m_renderer = (GtkCellRenderer*) gtk_cell_renderer_pixbuf_new(); SetMode(mode); SetAlignment(align); @@ -1209,7 +1280,7 @@ wxDataViewToggleRenderer::wxDataViewToggleRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align ) : wxDataViewRenderer( varianttype, mode, align ) { - m_renderer = (GtkWidget*) gtk_cell_renderer_toggle_new(); + m_renderer = (GtkCellRenderer*) gtk_cell_renderer_toggle_new(); if (mode & wxDATAVIEW_CELL_ACTIVATABLE) { @@ -1304,7 +1375,7 @@ bool wxDataViewCustomRenderer::Init(wxDataViewCellMode mode, int align) GtkWxCellRenderer *renderer = (GtkWxCellRenderer *) gtk_wx_cell_renderer_new(); renderer->cell = this; - m_renderer = (GtkWidget*) renderer; + m_renderer = (GtkCellRenderer*) renderer; SetMode(mode); SetAlignment(align); @@ -1348,7 +1419,7 @@ wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label, #ifdef __WXGTK26__ if (!gtk_check_version(2,6,0)) { - m_renderer = (GtkWidget*) gtk_cell_renderer_progress_new(); + m_renderer = (GtkCellRenderer*) gtk_cell_renderer_progress_new(); GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_STRING ); @@ -1584,6 +1655,19 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column, cell->GetVariantType().c_str() ); cell->SetValue( value ); + +/* + To set the background to this + + wxColour colour(30,100,255); + GdkColor *gcol = colour.GetColor(); + + GValue gvalue = { 0, }; + g_value_init( &gvalue, GDK_TYPE_COLOR ); + g_value_set_boxed( &gvalue, gcol ); + g_object_set_property( G_OBJECT(renderer), "cell-background_gdk", &gvalue ); + g_value_unset( &gvalue ); +*/ } IMPLEMENT_CLASS(wxDataViewColumn, wxDataViewColumnBase) @@ -1855,6 +1939,49 @@ wxdataview_row_activated_callback( GtkTreeView* treeview, GtkTreePath *path, // wxDataViewCtrl //----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// InsertChild for wxDataViewCtrl +//----------------------------------------------------------------------------- + +static void wxInsertChildInDataViewCtrl( wxWindowGTK* parent, wxWindowGTK* child ) +{ + wxDataViewCtrl * dvc = (wxDataViewCtrl*) parent; + GtkWidget *treeview = dvc->GtkGetTreeView(); + + // Insert widget in GtkTreeView + if (GTK_WIDGET_REALIZED(treeview)) + gtk_widget_set_parent_window( child->m_widget, + gtk_tree_view_get_bin_window( GTK_TREE_VIEW(treeview) ) ); + gtk_widget_set_parent( child->m_widget, treeview ); +} + +static +void gtk_dataviewctrl_size_callback( GtkWidget *WXUNUSED(widget), + GtkAllocation *alloc, + wxDataViewCtrl *win ) +{ + + wxWindowList::Node *node = win->GetChildren().GetFirst(); + while (node) + { + wxWindow *child = node->GetData(); + + GtkRequisition req; + gtk_widget_size_request( child->m_widget, &req ); + + GtkAllocation alloc; + alloc.x = child->m_x; + alloc.y = child->m_y; + alloc.width = child->m_width; + alloc.height = child->m_height; + gtk_widget_size_allocate( child->m_widget, &alloc ); + + node = node->GetNext(); + } +} + + + IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl, wxDataViewCtrlBase) wxDataViewCtrl::~wxDataViewCtrl() @@ -1878,9 +2005,6 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, { Init(); - m_needParent = true; - m_acceptsFocus = true; - if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator )) { @@ -1888,6 +2012,8 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, return false; } + m_insertCallback = wxInsertChildInDataViewCtrl; + m_widget = gtk_scrolled_window_new (NULL, NULL); GtkScrolledWindowSetBorder(m_widget, style); @@ -1895,6 +2021,9 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, m_treeview = gtk_tree_view_new(); gtk_container_add (GTK_CONTAINER (m_widget), m_treeview); + g_signal_connect (m_treeview, "size_allocate", + G_CALLBACK (gtk_dataviewctrl_size_callback), this); + #ifdef __WXGTK26__ if (!gtk_check_version(2,6,0)) gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), TRUE ); @@ -1925,7 +2054,9 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, } else #endif + { gtk_tree_view_set_rules_hint( GTK_TREE_VIEW(m_treeview), (style & wxDV_HORIZ_RULES) != 0 ); + } gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);