]> git.saurik.com Git - wxWidgets.git/commitdiff
Add the possibility to disable invisible wxDataViewCtrl items.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 19 Dec 2010 15:02:56 +0000 (15:02 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 19 Dec 2010 15:02:56 +0000 (15:02 +0000)
Add new wxDataViewModel::IsEnabled() and wxDataViewListStore::IsEnabledByRow()
methods and implement support for actually disabling the items in wxOSX/Cocoa
native implementation of wxDataViewCtrl and limited support for it in the
generic version.

We need to implement this in wxGTK using GtkCellRenderer "sensitive" propriety
later.

Closes #12686.

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

docs/changes.txt
include/wx/dataview.h
include/wx/dvrenderers.h
include/wx/osx/dvrenderer.h
interface/wx/dataview.h
samples/dataview/dataview.cpp
samples/dataview/mymodels.cpp
samples/dataview/mymodels.h
src/common/datavcmn.cpp
src/generic/datavgen.cpp
src/osx/cocoa/dataview.mm

index 67205aed91d19448b02ad62e271c8e43858177f0..02f58a6a30dda84493f9c7b5386f154e101f5901 100644 (file)
@@ -434,6 +434,7 @@ All (GUI):
 - Added wxUIActionSimulator (Steven Lamerton, GSoC 2010 project).
 - wxAUI: support auto-orientable toolbars (wsu).
 - Added wxDataViewCtrl::Set/GetCurrentItem().
+- Added possibility to disable individual wxDataViewCtrl items (Neno Ganchev).
 - wxHTML: render in RTL order inside RTL window (Richard Bullington-McGuire).
 - wxRibbon: added EVT_RIBBONGALLERY_CLICKED event (John Roberts).
 - Add support for CP-866 encoding to wxEncodingConverter (madnut).
index 8950f405671fd50910c5bf52f4949431c2f278f8..46b5e997abc1c7b7f18c0b3cff7fd08c04322628 100644 (file)
@@ -234,6 +234,13 @@ public:
         return false;
     }
 
+    // Override this if you want to disable specific items
+    virtual bool IsEnabled(const wxDataViewItem &WXUNUSED(item),
+                           unsigned int WXUNUSED(col)) const
+    {
+        return true;
+    }
+
     // define hierachy
     virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const = 0;
     virtual bool IsContainer( const wxDataViewItem &item ) const = 0;
@@ -304,6 +311,12 @@ public:
         return false;
     }
 
+    virtual bool IsEnabledByRow(unsigned int WXUNUSED(row),
+                                unsigned int WXUNUSED(col)) const
+    {
+        return true;
+    }
+
 
     // helper methods provided by list models only
     virtual unsigned GetRow( const wxDataViewItem &item ) const = 0;
@@ -344,6 +357,11 @@ public:
         return GetAttrByRow( GetRow(item), col, attr );
     }
 
+    virtual bool IsEnabled(const wxDataViewItem &item, unsigned int col) const
+    {
+        return IsEnabledByRow( GetRow(item), col );
+    }
+
 
     virtual bool IsListModel() const { return true; }
 };
index 1be414ffb760ddfef238b44e936f4f2f01a445a1..717f73608a4c2e2ab59cf7e7de9e724e310fc47e 100644 (file)
@@ -116,6 +116,8 @@ public:
 
     virtual void SetAttr(const wxDataViewItemAttr& WXUNUSED(attr)) { }
 
+    virtual void SetEnabled(bool WXUNUSED(enabled)) { }
+
     wxString GetVariantType() const             { return m_variantType; }
 
     // helper that calls SetValue and SetAttr:
@@ -261,6 +263,11 @@ public:
     virtual void SetAttr(const wxDataViewItemAttr& attr) { m_attr = attr; }
     const wxDataViewItemAttr& GetAttr() const { return m_attr; }
 
+    // Store the enabled state of the item so that it can be accessed from
+    // Render() via GetEnabled() if needed.
+    virtual void SetEnabled(bool enabled) { m_enabled = enabled; }
+    bool GetEnabled() const { return m_enabled; }
+
 
     // Implementation only from now on
 
@@ -277,6 +284,7 @@ protected:
 
 private:
     wxDataViewItemAttr m_attr;
+    bool m_enabled;
 
     wxDECLARE_NO_COPY_CLASS(wxDataViewCustomRendererBase);
 };
index b0513b2e359d351207a0264b8cec0f008861975b..3128952f29208f2d39d0b9fde6524b3ac7f9ffae 100644 (file)
@@ -87,6 +87,9 @@ public:
     // called to ensure that the given attribute will be used for rendering the
     // next cell (which had been already associated with this renderer before)
     virtual void OSXApplyAttr(const wxDataViewItemAttr& attr);
+
+    // called to set the state of the next cell to be rendered
+    virtual void OSXApplyEnabled(bool enabled);
 #endif // Cocoa
 
 private:
index bfbf14018c8bed1e8f82b3ae37c2c481362ace86..e9da457e58a8a6187fa4cdfb8fec1d1c54b9f395 100644 (file)
@@ -167,6 +167,32 @@ public:
     virtual bool GetAttr(const wxDataViewItem& item, unsigned int col,
                          wxDataViewItemAttr& attr) const;
 
+    /**
+        Override this to indicate that the item should be disabled.
+
+        Disabled items are displayed differently (e.g. grayed out) and cannot
+        be interacted with.
+
+        The base class version always returns @true, thus making all items
+        enabled by default.
+
+        @param item
+            The item whose enabled status is requested.
+        @param col
+            The column of the item whose enabled status is requested.
+        @return
+            @true if this item should be enabled, @false otherwise.
+
+        @note Currently disabling items is fully implemented only for the
+              native control implementation in wxOSX/Cocoa. This feature is
+              partially supported in the generic version but not in wxGTK or
+              wxOSX/Carbon native implementations.
+
+        @since 2.9.2
+    */
+    virtual bool IsEnabled(const wxDataViewItem &item,
+                           unsigned int col) const;
+
     /**
         Override this so the control can query the child items of an item.
         Returns the number of items.
@@ -371,6 +397,28 @@ public:
     virtual bool GetAttrByRow(unsigned int row, unsigned int col,
                          wxDataViewItemAttr& attr) const;
 
+    /**
+        Override this if you want to disable specific items.
+
+        The base class version always returns @true, thus making all items
+        enabled by default.
+
+        @param row
+            The row of the item whose enabled status is requested.
+        @param col
+            The column of the item whose enabled status is requested.
+        @return
+            @true if the item at this row and column should be enabled,
+            @false otherwise.
+
+        @note See wxDataViewModel::IsEnabled() for the current status of
+              support for disabling the items under different platforms.
+
+        @since 2.9.2
+    */
+    virtual bool IsEnabledByRow(unsigned int row,
+                                unsigned int col) const;
+
     /**
         Returns the number of items (i.e. rows) in the list.
     */
index 252cca4655a49d62ba0bc19f1f7f08f0e2e95027..baf7166263b093e198de195a767c771e79c921eb 100644 (file)
@@ -653,6 +653,10 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned l
                                         wxDefaultSize, style );
             m_ctrl[2] = lc;
 
+            MyListStoreDerivedModel* page2_model = new MyListStoreDerivedModel();
+            lc->AssociateModel(page2_model);
+            page2_model->DecRef();
+
             lc->AppendToggleColumn( "Toggle" );
             lc->AppendTextColumn( "Text" );
             lc->AppendProgressColumn( "Progress" );
index 79fc7170bbef77c8741f8740862cc2c56ee33408..a3cb11119813bf39b0a076c624199e5b3f95c6c1 100644 (file)
@@ -244,6 +244,17 @@ bool MyMusicTreeModel::SetValue( const wxVariant &variant,
     return false;
 }
 
+bool MyMusicTreeModel::IsEnabled( const wxDataViewItem &item,
+                                  unsigned int col ) const
+{
+    wxASSERT(item.IsOk());
+
+    MyMusicTreeModelNode *node = (MyMusicTreeModelNode*) item.GetID();
+
+    // disable Beethoven's ratings, his pieces can only be good
+    return !(col == 3 && node->m_artist.EndsWith("Beethoven"));
+}
+
 wxDataViewItem MyMusicTreeModel::GetParent( const wxDataViewItem &item ) const
 {
     // the invisible root node has no parent
@@ -525,3 +536,14 @@ bool MyListModel::SetValueByRow( const wxVariant &variant,
 
     return false;
 }
+
+
+// ----------------------------------------------------------------------------
+// MyListStoreDerivedModel
+// ----------------------------------------------------------------------------
+
+bool MyListStoreDerivedModel::IsEnabledByRow(unsigned int row, unsigned int col) const
+{
+    // disabled the last two checkboxes
+    return !(col == 0 && 8 <= row && row <= 9);
+}
index bb9ca8f6532f8761255c59906361da266751ec43..996bd3ec6e5936b2a75ade1259182c5bf4ce02a3 100644 (file)
@@ -163,6 +163,9 @@ public:
     virtual bool SetValue( const wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col );
 
+    virtual bool IsEnabled( const wxDataViewItem &item,
+                            unsigned int col ) const;
+
     virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
     virtual bool IsContainer( const wxDataViewItem &item ) const;
     virtual unsigned int GetChildren( const wxDataViewItem &parent,
@@ -235,3 +238,12 @@ private:
     wxIcon           m_icon[2];
 };
 
+// ----------------------------------------------------------------------------
+// MyListStoreDerivedModel
+// ----------------------------------------------------------------------------
+
+class MyListStoreDerivedModel : public wxDataViewListStore
+{
+public:
+    virtual bool IsEnabledByRow(unsigned int row, unsigned int col) const;
+};
index 94ddc67dc272a1fdcb2f1f006c360843525a4048..3e52749a09e6a6cd7154bcdbc1e27c18b206baab 100644 (file)
@@ -790,6 +790,8 @@ void wxDataViewRendererBase::PrepareForItem(const wxDataViewModel *model,
     wxDataViewItemAttr attr;
     model->GetAttr(item, column, attr);
     SetAttr(attr);
+
+    SetEnabled(model->IsEnabled(item, column));
 }
 
 
index a8bd2239a7cd6f6a98d97cee39beeeb5fd42d5cb..90a1241631cbba77757413803bb66c352fc9c5bf 100644 (file)
@@ -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
index 29d412a26b0356296af38b2bbecce69e0073fe41..80505a0f3c704ea7376c2ffda9aea2199a606634 100644 (file)
@@ -1695,6 +1695,9 @@ outlineView:(NSOutlineView*)outlineView
     model->GetAttr(dvItem, colIdx, attr);
     renderer->OSXApplyAttr(attr);
 
+    // set the state (enabled/disabled) of the item
+    renderer->OSXApplyEnabled(model->IsEnabled(dvItem, colIdx));
+
     // and finally do draw it
     renderer->MacRender();
 }
@@ -2487,6 +2490,11 @@ void wxDataViewRenderer::OSXApplyAttr(const wxDataViewItemAttr& attr)
         [(id)cell setTextColor:colText];
 }
 
+void wxDataViewRenderer::OSXApplyEnabled(bool enabled)
+{
+    [GetNativeData()->GetItemCell() setEnabled:enabled];
+}
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
 
 // ---------------------------------------------------------