X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce00f59b5b169752d2f05ce3bb1a88ddc1b38b4c..e8fd252ef87d8ff6409d405218ff02c91b980e0a:/src/gtk/dataview.cpp?ds=sidebyside diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 96ea64b8c6..da2b6d4e67 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -231,7 +231,7 @@ public: bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ); bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ); bool ItemChanged( const wxDataViewItem &item ); - bool ValueChanged( const wxDataViewItem &item, unsigned int col ); + bool ValueChanged( const wxDataViewItem &item, unsigned int model_column ); bool Cleared(); bool BeforeReset(); bool AfterReset(); @@ -1490,7 +1490,7 @@ public: virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ); virtual bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ); virtual bool ItemChanged( const wxDataViewItem &item ); - virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ); + virtual bool ValueChanged( const wxDataViewItem &item, unsigned int model_column ); virtual bool Cleared(); virtual void Resort(); virtual bool BeforeReset(); @@ -1591,7 +1591,7 @@ bool wxGtkDataViewModelNotifier::ItemChanged( const wxDataViewItem &item ) return true; } -bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsigned int model_col ) +bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsigned int model_column ) { GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel(); wxDataViewCtrl *ctrl = m_internal->GetOwner(); @@ -1601,7 +1601,7 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig for (index = 0; index < ctrl->GetColumnCount(); index++) { wxDataViewColumn *column = ctrl->GetColumn( index ); - if (column->GetModelColumn() == model_col) + if (column->GetModelColumn() == model_column) { GtkTreeView *widget = GTK_TREE_VIEW(ctrl->GtkGetTreeView()); GtkTreeViewColumn *gcolumn = GTK_TREE_VIEW_COLUMN(column->GetGtkHandle()); @@ -1624,7 +1624,7 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig gtk_widget_queue_draw_area( GTK_WIDGET(widget), cell_area.x - xdiff, ydiff + cell_area.y, cell_area.width, cell_area.height ); - m_internal->ValueChanged( item, model_col ); + m_internal->ValueChanged( item, model_column ); return true; } @@ -1731,6 +1731,7 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewC wxDataViewRendererBase( varianttype, mode, align ) { m_renderer = NULL; + m_mode = mode; // we haven't changed them yet m_usingDefaultAttrs = true; @@ -1776,6 +1777,8 @@ void wxDataViewRenderer::SetMode( wxDataViewCellMode mode ) return; } + m_mode = mode; + // This value is most often ignored in GtkTreeView GValue gvalue = { 0, }; g_value_init( &gvalue, gtk_cell_renderer_mode_get_type() ); @@ -2755,7 +2758,7 @@ wxSize wxDataViewDateRenderer::GetSize() const return wxSize(x,y+d); } -bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *model, +bool wxDataViewDateRenderer::Activate( const wxRect& WXUNUSED(cell), wxDataViewModel *model, const wxDataViewItem &item, unsigned int col ) { wxVariant variant; @@ -2929,6 +2932,22 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), cell->SetValue( value ); + // deal with disabled items + bool enabled = wx_model->IsEnabled( item, cell->GetOwner()->GetModelColumn() ); + + // a) this sets the appearance to disabled grey + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_BOOLEAN ); + g_value_set_boolean( &gvalue, enabled ); + g_object_set_property( G_OBJECT(renderer), "sensitive", &gvalue ); + g_value_unset( &gvalue ); + + // b) this actually disables the control/renderer + if (enabled) + cell->SetMode( cell->GtkGetMode() ); + else + cell->SetMode( wxDATAVIEW_CELL_INERT ); + // deal with attributes: if the renderer doesn't support them at all, we // don't even need to query the model for them @@ -2945,6 +2964,7 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), } // else: no custom attributes specified and we're already using the default // ones -- nothing to do + } } // extern "C" @@ -3205,23 +3225,20 @@ int wxDataViewColumn::GetWidth() const void wxDataViewColumn::SetWidth( int width ) { - if (width < 0) + if ( width == wxCOL_WIDTH_AUTOSIZE ) { -#if 1 - gtk_tree_view_column_set_sizing( GTK_TREE_VIEW_COLUMN(m_column), GTK_TREE_VIEW_COLUMN_FIXED ); - - // TODO find a better calculation - gtk_tree_view_column_set_fixed_width( GTK_TREE_VIEW_COLUMN(m_column), wxDVC_DEFAULT_WIDTH ); -#else - // this is unpractical for large numbers of items and disables - // user resizing, which is totally unexpected + // NB: this disables user resizing gtk_tree_view_column_set_sizing( GTK_TREE_VIEW_COLUMN(m_column), GTK_TREE_VIEW_COLUMN_AUTOSIZE ); -#endif } else { - gtk_tree_view_column_set_sizing( GTK_TREE_VIEW_COLUMN(m_column), GTK_TREE_VIEW_COLUMN_FIXED ); + if ( width == wxCOL_WIDTH_DEFAULT ) + { + // TODO find a better calculation + width = wxDVC_DEFAULT_WIDTH; + } + gtk_tree_view_column_set_sizing( GTK_TREE_VIEW_COLUMN(m_column), GTK_TREE_VIEW_COLUMN_FIXED ); gtk_tree_view_column_set_fixed_width( GTK_TREE_VIEW_COLUMN(m_column), width ); } } @@ -3516,6 +3533,9 @@ gboolean wxDataViewCtrlInternal::row_draggable( GtkTreeDragSource *WXUNUSED(drag event.SetEventObject( m_owner ); event.SetItem( item ); event.SetModel( m_wx_model ); + gint x, y; + gtk_widget_get_pointer(m_owner->GtkGetTreeView(), &x, &y); + event.SetPosition(x, y); if (!m_owner->HandleWindowEvent( event )) return FALSE; @@ -3687,13 +3707,13 @@ bool wxDataViewCtrlInternal::ItemChanged( const wxDataViewItem &item ) return true; } -bool wxDataViewCtrlInternal::ValueChanged( const wxDataViewItem &item, unsigned int col ) +bool wxDataViewCtrlInternal::ValueChanged( const wxDataViewItem &item, unsigned int view_column ) { wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, m_owner->GetId() ); event.SetEventObject( m_owner ); event.SetModel( m_owner->GetModel() ); - event.SetColumn( col ); - event.SetDataViewColumn( GetOwner()->GetColumn(col) ); + event.SetColumn( view_column ); + event.SetDataViewColumn( GetOwner()->GetColumn(view_column) ); event.SetItem( item ); m_owner->HandleWindowEvent( event ); @@ -4967,12 +4987,54 @@ void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item, gtk_tree_view_scroll_to_cell( GTK_TREE_VIEW(m_treeview), path, NULL, false, 0.0, 0.0 ); } -void wxDataViewCtrl::HitTest(const wxPoint& WXUNUSED(point), +void wxDataViewCtrl::HitTest(const wxPoint& point, wxDataViewItem& item, wxDataViewColumn *& column) const { - item = wxDataViewItem(0); - column = NULL; + // gtk_tree_view_get_dest_row_at_pos() is the right one. But it does not tell the column. + // gtk_tree_view_get_path_at_pos() is the wrong function. It doesn't mind the header but returns column. + // See http://mail.gnome.org/archives/gtkmm-list/2005-January/msg00080.html + // So we have to use both of them. + // Friedrich Haase 2010-9-20 + wxGtkTreePath path, pathScratch; + GtkTreeViewColumn* GtkColumn = NULL; + GtkTreeViewDropPosition pos = GTK_TREE_VIEW_DROP_INTO_OR_AFTER; + gint cell_x = 0; + gint cell_y = 0; + + // cannot directly call GtkGetTreeView(), HitTest is const and so is this pointer + wxDataViewCtrl* ctrl = (wxDataViewCtrl*)this; // ugly workaround, ctrl is NOT const + GtkTreeView* treeView = GTK_TREE_VIEW(ctrl->GtkGetTreeView()); + + // is there possibly a better suited function to get the column? + gtk_tree_view_get_path_at_pos( // and this is the wrong call but it delivers the column + treeView, + (int) point.x, (int) point.y, + pathScratch.ByRef(), + &GtkColumn, // here we get the GtkColumn + &cell_x, + &cell_y ); + + if ( GtkColumn != NULL ) + { + // we got GTK column + // the right call now which takes the header into account + gtk_tree_view_get_dest_row_at_pos( treeView, (int) point.x, (int) point.y, path.ByRef(), &pos); + + if (path) + item = wxDataViewItem(GTKPathToItem(path)); + // else we got a GTK column but the position is not over an item, e.g. below last item + for ( unsigned int i=0, cols=GetColumnCount(); iGetGtkHandle()) == GtkColumn ) + { + column = col; // here we get the wx column + break; + } + } + } + // else no column and thus no item, both null } wxRect