]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxDataViewModel::ChangeValue() and use it in wxDVC implementation.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 23 Oct 2009 23:49:16 +0000 (23:49 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 23 Oct 2009 23:49:16 +0000 (23:49 +0000)
ChangeValue() is a trivial wrapper calling both SetValue() and ValueChanged().
It allows to replace many calls to SetValue() immediately followed by
ValueChanged() with a single function call which is significantly shorter and
less error-prone (e.g. most of the existing code didn't test SetValue() return
code at all).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62489 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dataview.h
interface/wx/dataview.h
src/common/datavcmn.cpp
src/generic/datavgen.cpp
src/gtk/dataview.cpp
src/osx/carbon/dataview.cpp
src/osx/cocoa/dataview.mm

index ef5cc45dbd671c0bec97e93ea5d9711c562a2896..f02ad00a19b11e1ba454f13cd1e405372f9dee5b 100644 (file)
@@ -186,9 +186,20 @@ public:
     virtual void GetValue( wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col ) const = 0;
 
-    // set value, call ValueChanged() afterwards!
-    virtual bool SetValue( const wxVariant &variant,
-                           const wxDataViewItem &item, unsigned int col ) = 0;
+    // usually ValueChanged() should be called after changing the value in the
+    // model to update the control, ChangeValue() does it on its own while
+    // SetValue() does not -- so while you will override SetValue(), you should
+    // be usually calling ChangeValue()
+    virtual bool SetValue(const wxVariant &variant,
+                          const wxDataViewItem &item,
+                          unsigned int col) = 0;
+
+    bool ChangeValue(const wxVariant& variant,
+                     const wxDataViewItem& item,
+                     unsigned int col)
+    {
+        return SetValue(variant, item, col) && ValueChanged(item, col);
+    }
 
     // Get text attribute, return false of default attributes should be used
     virtual bool GetAttr( const wxDataViewItem &WXUNUSED(item), unsigned int WXUNUSED(col), wxDataViewItemAttr &WXUNUSED(attr) )
index a76c28ae673f3bd45f24fb390293e4a4fa55b848..debcecdb438682052928b8cf26b81f07f5d6b83f 100644 (file)
@@ -23,7 +23,7 @@
     Since you will usually also allow the wxDataViewCtrl to change your data
     through its graphical interface, you will also have to override
     wxDataViewModel::SetValue which the wxDataViewCtrl will call when a change
-    to some data has been commited.
+    to some data has been committed.
 
     wxDataViewModel (as indeed the entire wxDataViewCtrl code) is using wxVariant
     to store data and its type in a generic way. wxVariant can be extended to contain
@@ -91,6 +91,28 @@ public:
     */
     void AddNotifier(wxDataViewModelNotifier* notifier);
 
+    /**
+        Change the value of the given item and update the control to reflect
+        it.
+
+        This function simply calls SetValue() and, if it succeeded,
+        ValueChanged().
+
+        @since 2.9.1
+
+        @param variable
+            The new value.
+        @param item
+            The item (row) to update.
+        @param col
+            The column to update.
+        @return
+            @true if both SetValue() and ValueChanged() returned @true.
+     */
+    bool ChangeValue(const wxVariant& variant,
+                     const wxDataViewItem& item,
+                     unsigned int col);
+
     /**
         Called to inform the model that all data has been cleared.
         The control will reread the data from the model again.
@@ -229,12 +251,17 @@ public:
 
     /**
         This gets called in order to set a value in the data model.
+
         The most common scenario is that the wxDataViewCtrl calls this method
         after the user changed some data in the view.
 
-        Afterwards ValueChanged() has to be called!
+        This is the function you need to override in your derived class but if
+        you want to call it, ChangeValue() is usually more convenient as
+        otherwise you need to manually call ValueChanged() to update the
+        control itself.
     */
-    virtual bool SetValue(const wxVariant& variant, const wxDataViewItem& item,
+    virtual bool SetValue(const wxVariant& variant,
+                          const wxDataViewItem& item,
                           unsigned int col) = 0;
 
     /**
index fd3ccde0b82fdc30851e21e9efc05e62351166c1..e37e6d38c7d105a7224cafeb971a9633d39686d4 100644 (file)
@@ -751,8 +751,7 @@ bool wxDataViewRendererBase::FinishEditing()
         return false;
 
     unsigned int col = GetOwner()->GetModelColumn();
-    dv_ctrl->GetModel()->SetValue( value, m_item, col );
-    dv_ctrl->GetModel()->ValueChanged( m_item, col );
+    dv_ctrl->GetModel()->ChangeValue(value, m_item, col);
 
     // Now we should send Editing Done event
     wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() );
index 1eeff556add8542d14ee731d34e542a971cf091e..74aba29bd9a6fb895dd96f721ce2c0ebf61b5fb7 100644 (file)
@@ -933,10 +933,7 @@ bool wxDataViewToggleRenderer::Activate( wxRect WXUNUSED(cell),
                                         wxDataViewModel *model,
                                         const wxDataViewItem & item, unsigned int col)
 {
-    bool value = !m_toggle;
-    wxVariant variant = value;
-    model->SetValue( variant, item, col);
-    model->ValueChanged( item, col );
+    model->ChangeValue(!m_toggle, item, col);
     return true;
 }
 
@@ -1051,10 +1048,7 @@ END_EVENT_TABLE()
 
 void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event )
 {
-    wxDateTime date = event.GetDate();
-    wxVariant value = date;
-    m_model->SetValue( value, m_item, m_col );
-    m_model->ValueChanged( m_item, m_col );
+    m_model->ChangeValue( event.GetDate(), m_item, m_col );
     DismissAndNotify();
 }
 
index 3f8eb008c11fb8696b7d2b678339acd982c0c2ea..62fbd52fe2587436ee93ad85f7912916d04229d6 100644 (file)
@@ -1742,8 +1742,7 @@ wxDataViewRenderer::GtkOnCellChanged(const wxVariant& value,
                                      unsigned col)
 {
     wxDataViewModel *model = GetOwner()->GetOwner()->GetModel();
-    model->SetValue( value, item, col );
-    model->ValueChanged( item, col );
+    model->ChangeValue( value, item, col );
 }
 
 // ---------------------------------------------------------
@@ -1933,8 +1932,7 @@ static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer,
 
     unsigned int model_col = cell->GetOwner()->GetModelColumn();
 
-    model->SetValue( value, item, model_col );
-    model->ValueChanged( item, model_col );
+    model->ChangeValue( value, item, model_col );
 }
 
 IMPLEMENT_CLASS(wxDataViewToggleRenderer, wxDataViewRenderer)
@@ -2371,10 +2369,7 @@ END_EVENT_TABLE()
 
 void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event )
 {
-    wxDateTime date = event.GetDate();
-    wxVariant value = date;
-    m_model->SetValue( value, m_item, m_col );
-    m_model->ValueChanged( m_item, m_col );
+    m_model->ChangeValue( event.GetDate(), m_item, m_col );
     DismissAndNotify();
 }
 
index 38f94678c90de7cc61f7ead5f7abb5203681f6d9..30d3d20ef1c0d60cafd22c2f48586f051cba3af5 100644 (file)
@@ -1318,8 +1318,7 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(
                // variable definition and initialization:
                 wxVariant modifiedData(true);
 
-                if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
-                    dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
+                if (dataViewCtrlPtr->GetModel()->ChangeValue(modifiedData, dvItem, col))
                     return noErr;
                 else
                     return errDataBrowserInvalidPropertyData;
@@ -1329,8 +1328,7 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(
                // variable definition and initialization:
                 wxVariant modifiedData(false);
 
-                if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
-                    dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
+                if (dataViewCtrlPtr->GetModel()->ChangeValue(modifiedData, dvItem, col))
                     return noErr;
                 else
                     return errDataBrowserInvalidPropertyData;
@@ -1357,8 +1355,7 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(
 #endif
               wxVariant           modifiedData(modifiedString.AsString());
 
-                if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
-                    dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
+                if (dataViewCtrlPtr->GetModel()->ChangeValue(modifiedData, dvItem, col))
                     return noErr;
                 else
                     return errDataBrowserInvalidPropertyData;
index 243ac2515ccc8b12a73395cd20ccd0b9ddc6bc68..1d63bdf4fa5a2602077295950d4f3eaccf83384e 100644 (file)
@@ -2236,8 +2236,7 @@ void wxDataViewRenderer::OSXOnCellChanged(const wxVariant& value,
                                           unsigned col)
 {
     wxDataViewModel *model = GetOwner()->GetOwner()->GetModel();
-    model->SetValue(value, item, col);
-    model->ValueChanged(item, col);
+    model->ChangeValue(value, item, col);
 }
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)