From 621860064662aa80ba4fdc21ca55b6d33c1bea11 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Jun 2010 17:43:30 +0000 Subject: [PATCH] Fix activation handling in generic wxDataViewCtrl renderers. Handling of activation in the generic implementation of standard renderers was broken since r62589 which stopped calling their Activate() method. Restore it by introducing a special WXOnActivate() replacing it (but clearly marked as private and implementation-only) and calling it instead. Closes #11460. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64654 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/dvrenderer.h | 14 +++++++++++- include/wx/generic/dvrenderers.h | 17 +++++++++----- src/generic/datavgen.cpp | 39 ++++++++++++++++++-------------- 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/include/wx/generic/dvrenderer.h b/include/wx/generic/dvrenderer.h index 59e8a5782d..3abf273181 100644 --- a/include/wx/generic/dvrenderer.h +++ b/include/wx/generic/dvrenderer.h @@ -47,12 +47,24 @@ public: // intentionally returns NULL for all the other renderer classes as the // user should _not_ be able to override Activate/LeftClick() when deriving // from them for consistency with the other ports and while we can't - // prevent this from working at compile-time because all renderer are + // prevent this from working at compile-time because all renderers are // custom renderers in the generic implementation, we at least make sure // that it doesn't work at run-time because Activate/LeftClick() would // never be called virtual wxDataViewCustomRenderer *WXGetAsCustom() { return NULL; } + // The generic implementation of some standard renderers reacts to item + // activation, so provide this internal function which is called by + // wxDataViewCtrl for them. It is called with the old value of the cell and + // is passed the model and cell coordinates to be able to change the model + // value for this cell. + virtual void WXOnActivate(wxDataViewModel * WXUNUSED(model), + const wxVariant& WXUNUSED(valueOld), + const wxDataViewItem& WXUNUSED(item), + unsigned int WXUNUSED(col)) + { + } + private: int m_align; wxDataViewCellMode m_mode; diff --git a/include/wx/generic/dvrenderers.h b/include/wx/generic/dvrenderers.h index 3ebe0d0f3e..62670c787b 100644 --- a/include/wx/generic/dvrenderers.h +++ b/include/wx/generic/dvrenderers.h @@ -100,10 +100,13 @@ public: bool GetValue( wxVariant &value ) const; bool Render( wxRect cell, wxDC *dc, int state ); - bool Activate( wxRect cell, wxDataViewModel *model, const wxDataViewItem & item, - unsigned int col ); wxSize GetSize() const; + // Implementation only, don't use nor override + virtual void WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem& item, + unsigned int col); private: bool m_toggle; @@ -182,10 +185,12 @@ public: virtual bool Render( wxRect cell, wxDC *dc, int state ); virtual wxSize GetSize() const; - virtual bool Activate( wxRect cell, - wxDataViewModel *model, - const wxDataViewItem& item, - unsigned int col ); + + // Implementation only, don't use nor override + virtual void WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem& item, + unsigned int col); private: wxDateTime m_date; diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 0823c1752b..dc1bf273c0 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -844,12 +844,12 @@ bool wxDataViewToggleRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state return true; } -bool wxDataViewToggleRenderer::Activate( wxRect WXUNUSED(cell), - wxDataViewModel *model, - const wxDataViewItem & item, unsigned int col) +void wxDataViewToggleRenderer::WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem & item, + unsigned int col) { - model->ChangeValue(!m_toggle, item, col); - return true; + model->ChangeValue(!valueOld.GetBool(), item, col); } wxSize wxDataViewToggleRenderer::GetSize() const @@ -1005,24 +1005,23 @@ wxSize wxDataViewDateRenderer::GetSize() const return wxSize(x,y+d); } -bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *model, - const wxDataViewItem & item, unsigned int col ) +void wxDataViewDateRenderer::WXOnActivate(wxDataViewModel *model, + const wxVariant& valueOld, + const wxDataViewItem & item, + unsigned int col ) { - wxVariant variant; - model->GetValue( variant, item, col ); - wxDateTime value = variant.GetDateTime(); + wxDateTime dtOld = valueOld.GetDateTime(); #if wxUSE_DATE_RENDERER_POPUP wxDataViewDateRendererPopupTransient *popup = new wxDataViewDateRendererPopupTransient( - GetOwner()->GetOwner()->GetParent(), &value, model, item, col); + GetOwner()->GetOwner()->GetParent(), &dtOld, model, item, col); wxPoint pos = wxGetMousePosition(); popup->Move( pos ); popup->Layout(); popup->Popup( popup->m_cal ); #else // !wxUSE_DATE_RENDERER_POPUP - wxMessageBox(value.Format()); + wxMessageBox(dtOld.Format()); #endif // wxUSE_DATE_RENDERER_POPUP/!wxUSE_DATE_RENDERER_POPUP - return true; } // --------------------------------------------------------- @@ -3585,14 +3584,20 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) { if ((!ignore_other_columns) && (cell->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE)) { + const unsigned colIdx = col->GetModelColumn(); + + wxVariant value; + model->GetValue( value, item, colIdx ); + + cell->WXOnActivate(model, value, item, colIdx); + if ( wxDataViewCustomRenderer *custom = cell->WXGetAsCustom() ) { - wxVariant value; - model->GetValue( value, item, col->GetModelColumn() ); - custom->SetValue( value ); + cell->SetValue( value ); + wxRect cell_rect( xpos, GetLineStart( current ), col->GetWidth(), GetLineHeight( current ) ); - custom->Activate( cell_rect, model, item, col->GetModelColumn() ); + custom->Activate( cell_rect, model, item, colIdx ); } } else -- 2.45.2