X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca81b52e62e67e75bf65eba59469484ea8886dfb..29188693b3b8ba4b07762df012cc652d421dae79:/src/generic/datavgen.cpp?ds=sidebyside diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index df22e987ea..68c7d4bd09 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -435,7 +435,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(); void Resort() { @@ -845,7 +845,8 @@ bool wxDataViewToggleRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state int flags = 0; if (m_toggle) flags |= wxCONTROL_CHECKED; - if (GetMode() != wxDATAVIEW_CELL_ACTIVATABLE) + if (GetMode() != wxDATAVIEW_CELL_ACTIVATABLE || + GetEnabled() == false) flags |= wxCONTROL_DISABLED; // check boxes we draw must always have the same, standard size (if it's @@ -868,7 +869,10 @@ void wxDataViewToggleRenderer::WXOnActivate(wxDataViewModel *model, const wxDataViewItem & item, unsigned int col) { - model->ChangeValue(!valueOld.GetBool(), item, col); + if (model->IsEnabled(item, col)) + { + model->ChangeValue(!valueOld.GetBool(), item, col); + } } wxSize wxDataViewToggleRenderer::GetSize() const @@ -2069,9 +2073,23 @@ bool wxDataViewMainWindow::ItemChanged(const wxDataViewItem & item) return true; } -bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned int col ) +bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned int model_column ) { - GetOwner()->InvalidateColBestWidth(col); + int view_column = -1; + unsigned int n_col = m_owner->GetColumnCount(); + for (unsigned i = 0; i < n_col; i++) + { + wxDataViewColumn *column = m_owner->GetColumn( i ); + if (column->GetModelColumn() == model_column) + { + view_column = (int) i; + break; + } + } + if (view_column == -1) + return false; + + GetOwner()->InvalidateColBestWidth(view_column); // NOTE: to be valid, we cannot use e.g. INT_MAX - 1 /*#define MAX_VIRTUAL_WIDTH 100000 @@ -2091,8 +2109,8 @@ bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned i le.SetEventObject(parent); le.SetModel(GetOwner()->GetModel()); le.SetItem(item); - le.SetColumn(col); - le.SetDataViewColumn(GetOwner()->GetColumn(col)); + le.SetColumn(view_column); + le.SetDataViewColumn(GetOwner()->GetColumn(view_column)); parent->GetEventHandler()->ProcessEvent(le); return true; @@ -2150,6 +2168,8 @@ void wxDataViewMainWindow::RecalculateDisplay() void wxDataViewMainWindow::ScrollWindow( int dx, int dy, const wxRect *rect ) { + m_underMouse = NULL; + wxWindow::ScrollWindow( dx, dy, rect ); if (GetOwner()->m_headerArea) @@ -2158,6 +2178,8 @@ void wxDataViewMainWindow::ScrollWindow( int dx, int dy, const wxRect *rect ) void wxDataViewMainWindow::ScrollTo( int rows, int column ) { + m_underMouse = NULL; + int x, y; m_owner->GetScrollPixelsPerUnit( &x, &y ); int sy = GetLineStart( rows )/y; @@ -3469,13 +3491,17 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) xpos += c->GetWidth(); } if (!col) + { + event.Skip(); return; + } wxDataViewRenderer *cell = col->GetRenderer(); unsigned int current = GetLineAt( y ); if ((current >= GetRowCount()) || (x > GetEndOfLastCol())) { // Unselect all if below the last row ? + event.Skip(); return; } @@ -4608,7 +4634,8 @@ void wxDataViewCtrl::StartEditor( const wxDataViewItem & item, unsigned int colu wxRect itemRect = GetItemRect(item, col); wxDataViewRenderer* renderer = col->GetRenderer(); - renderer->StartEditing(item, itemRect); + if (renderer->GetMode() == wxDATAVIEW_CELL_EDITABLE) + renderer->StartEditing(item, itemRect); } #endif // !wxUSE_GENERICDATAVIEWCTRL