X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/30715fa19575aca89b9fee91cdd3d7f0d295548e..b9e7f0115d7a932932c8b2ee602ae28ceb74762d:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index b784bad68e..46bea947cc 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -311,7 +311,7 @@ wxgtk_list_store_get_value (GtkTreeModel *tree_model, g_value_init( value, G_TYPE_STRING ); model->GetValue( variant, (unsigned int) column, - (unsigned int) iter->user_data ); + wxPtrToUInt(iter->user_data) ); // FIXME: we should support different encodings here g_value_set_string( value, wxGTK_CONV_SYS(variant.GetString()) ); @@ -488,7 +488,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState flags ); - + static GObjectClass *cell_parent_class = NULL; @@ -572,7 +572,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( wxDataViewCustomRenderer *cell = wxrenderer->cell; if (!cell->HasEditorCtrl()) return NULL; - + GdkRectangle rect; gtk_wx_cell_renderer_get_size (renderer, widget, cell_area, &rect.x, @@ -588,7 +588,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( // 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(); + // 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]; @@ -733,11 +733,11 @@ gtk_wx_cell_renderer_activate( 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) @@ -777,7 +777,10 @@ gtk_wx_cell_renderer_activate( class wxGtkDataViewListModelNotifier: public wxDataViewListModelNotifier { public: - wxGtkDataViewListModelNotifier( GtkWxListStore* gtk_store, wxDataViewListModel *wx_model ); + wxGtkDataViewListModelNotifier( GtkWxListStore* gtk_store, + wxDataViewListModel *wx_model, + wxDataViewCtrl* ctrl ); + ~wxGtkDataViewListModelNotifier(); virtual bool RowAppended(); virtual bool RowPrepended(); @@ -788,15 +791,9 @@ 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; + wxDataViewCtrl *m_owner; }; // --------------------------------------------------------- @@ -804,10 +801,18 @@ public: // --------------------------------------------------------- wxGtkDataViewListModelNotifier::wxGtkDataViewListModelNotifier( - GtkWxListStore* gtk_store, wxDataViewListModel *wx_model ) + GtkWxListStore* gtk_store, wxDataViewListModel *wx_model, + wxDataViewCtrl *ctrl ) { m_gtk_store = gtk_store; m_wx_model = wx_model; + m_owner = ctrl; +} + +wxGtkDataViewListModelNotifier::~wxGtkDataViewListModelNotifier() +{ + m_wx_model = NULL; + m_gtk_store = NULL; } bool wxGtkDataViewListModelNotifier::RowAppended() @@ -879,30 +884,31 @@ 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 - wxObjectList::compatibility_iterator - node = GetOwner()->m_viewingColumns.GetFirst(); - while (node) + unsigned int index; + for (index = 0; index < m_owner->GetColumnCount(); index++) { - wxDataViewViewingColumn* viewing_column = (wxDataViewViewingColumn*) node->GetData(); - if (viewing_column->m_modelColumn == model_col) + wxDataViewColumn *column = m_owner->GetColumn( index ); + if (column->GetModelColumn() == model_col) { - GtkTreeView *widget = GTK_TREE_VIEW(viewing_column->m_viewColumn->GetOwner()->m_treeview); - GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(viewing_column->m_viewColumn->GetGtkHandle()); + GtkTreeView *widget = GTK_TREE_VIEW(m_owner->m_treeview); + GtkTreeViewColumn *gcolumn = GTK_TREE_VIEW_COLUMN(column->GetGtkHandle()); // Get cell area GtkTreePath *path = gtk_tree_path_new(); gtk_tree_path_append_index( path, model_row ); GdkRectangle cell_area; - gtk_tree_view_get_cell_area( widget, path, column, &cell_area ); + gtk_tree_view_get_cell_area( widget, path, gcolumn, &cell_area ); gtk_tree_path_free( path ); - int ydiff = column->button->allocation.height; + GtkAdjustment* hadjust = gtk_tree_view_get_hadjustment( widget ); + double d = gtk_adjustment_get_value( hadjust ); + int xdiff = (int) d; + + int ydiff = gcolumn->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(); } return true; @@ -917,17 +923,9 @@ bool wxGtkDataViewListModelNotifier::RowsReordered( unsigned int *new_order ) gtk_tree_path_free (path); // This adds GTK+'s missing MVC logic for RowsReordered - wxObjectList::compatibility_iterator - node = GetOwner()->m_viewingColumns.GetFirst(); - while (node) - { - wxDataViewViewingColumn* viewing_column = (wxDataViewViewingColumn*) node->GetData(); - GtkTreeView *widget = GTK_TREE_VIEW(viewing_column->m_viewColumn->GetOwner()->m_treeview); - // Doesn't work yet... - gtk_widget_queue_draw( GTK_WIDGET(widget) ); - - node = node->GetNext(); - } + GtkTreeView *widget = GTK_TREE_VIEW(m_owner->m_treeview); + // Doesn't work yet... + gtk_widget_queue_draw( GTK_WIDGET(widget) ); return true; } @@ -1104,7 +1102,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) { @@ -1179,7 +1177,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); @@ -1276,7 +1274,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) { @@ -1371,7 +1369,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); @@ -1415,7 +1413,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 ); @@ -1640,7 +1638,7 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column, wxDataViewRenderer *cell = (wxDataViewRenderer*) data; - unsigned int model_row = (unsigned int) iter->user_data; + unsigned int model_row = wxPtrToUInt(iter->user_data); wxVariant value; list_store->model->GetValue( value, cell->GetOwner()->GetModelColumn(), model_row ); @@ -1651,6 +1649,29 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column, cell->GetVariantType().c_str() ); cell->SetValue( value ); + + wxListItemAttr attr; + list_store->model->GetAttr( attr, cell->GetOwner()->GetModelColumn(), model_row ); + + if (attr.HasBackgroundColour()) + { + wxColour colour = attr.GetBackgroundColour(); + const GdkColor * const 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 ); + } + else + { + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_BOOLEAN ); + g_value_set_boolean( &gvalue, FALSE ); + g_object_set_property( G_OBJECT(renderer), "cell-background-set", &gvalue ); + g_value_unset( &gvalue ); + } } IMPLEMENT_CLASS(wxDataViewColumn, wxDataViewColumnBase) @@ -1933,7 +1954,7 @@ static void wxInsertChildInDataViewCtrl( wxWindowGTK* parent, wxWindowGTK* child // Insert widget in GtkTreeView if (GTK_WIDGET_REALIZED(treeview)) - gtk_widget_set_parent_window( child->m_widget, + 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 ); } @@ -1943,22 +1964,22 @@ 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(); } } @@ -1988,8 +2009,6 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, { Init(); - m_needParent = true; - if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator )) { @@ -2005,7 +2024,7 @@ 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); @@ -2039,7 +2058,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); @@ -2049,9 +2070,8 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, PostCreation(size); - GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); - g_signal_connect_after (selection, "changed", - G_CALLBACK (wxdataview_selection_changed_callback), this); + GtkEnableSelectionEvents(); + g_signal_connect_after (m_treeview, "row_activated", G_CALLBACK (wxdataview_row_activated_callback), this); @@ -2079,7 +2099,7 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewListModel *model ) GtkWxListStore *gtk_store = wxgtk_list_store_new(); gtk_store->model = model; - m_notifier = new wxGtkDataViewListModelNotifier( gtk_store, model ); + m_notifier = new wxGtkDataViewListModelNotifier( gtk_store, model, this ); model->AddNotifier( m_notifier ); @@ -2101,8 +2121,24 @@ bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col ) return true; } +void wxDataViewCtrl::GtkDisableSelectionEvents() +{ + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); + g_signal_connect_after (selection, "changed", + G_CALLBACK (wxdataview_selection_changed_callback), this); +} + +void wxDataViewCtrl::GtkEnableSelectionEvents() +{ + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); + g_signal_handlers_disconnect_by_func( selection, + (gpointer) (wxdataview_selection_changed_callback), this); +} + void wxDataViewCtrl::SetSelection( int row ) { + GtkDisableSelectionEvents(); + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); if (row < 0) @@ -2118,10 +2154,14 @@ void wxDataViewCtrl::SetSelection( int row ) gtk_tree_path_free( path ); } + + GtkEnableSelectionEvents(); } void wxDataViewCtrl::Unselect( unsigned int row ) { + GtkDisableSelectionEvents(); + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); GtkTreePath *path = gtk_tree_path_new (); @@ -2130,14 +2170,54 @@ void wxDataViewCtrl::Unselect( unsigned int row ) gtk_tree_selection_unselect_path( selection, path ); gtk_tree_path_free( path ); + + GtkEnableSelectionEvents(); } void wxDataViewCtrl::SetSelectionRange( unsigned int from, unsigned int to ) { + GtkDisableSelectionEvents(); + + if (from > to) + { + unsigned int tmp = from; + from = to; + to = tmp; + } + + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); + + GtkTreePath *path_from = gtk_tree_path_new (); + gtk_tree_path_append_index( path_from, from ); + GtkTreePath *path_to = gtk_tree_path_new (); + gtk_tree_path_append_index( path_to, to ); + + gtk_tree_selection_select_range( selection, path_from, path_to ); + + gtk_tree_path_free( path_to ); + gtk_tree_path_free( path_from ); + + GtkEnableSelectionEvents(); } void wxDataViewCtrl::SetSelections( const wxArrayInt& aSelections) { + GtkDisableSelectionEvents(); + + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); + + unsigned int i; + for (i = 0; i < aSelections.GetCount(); i++) + { + GtkTreePath *path = gtk_tree_path_new (); + gtk_tree_path_append_index( path, aSelections[i] ); + + gtk_tree_selection_select_path( selection, path ); + + gtk_tree_path_free( path ); + } + + GtkEnableSelectionEvents(); } bool wxDataViewCtrl::IsSelected( unsigned int row ) const