From 3a1625030314f501effb9620f5b39b470b2435c3 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 31 Jan 2018 03:11:07 +0100 Subject: [PATCH] Don't make inert toggle/choice wxDataViewCtrl cell editable in wxOSX Don't disable all inert renderers as this results in ugly "disabled" look for some of them (see 6e885992f52f73b7b0c636167c5e9717f0d9b293), but do disable the renderers that would be editable otherwise, such as wxDataViewChoiceRenderer and wxDataViewToggleRenderer, in wxOSX as it shouldn't be possible to change value of the inert cells. See https://github.com/wxWidgets/wxWidgets/pull/707 Closes #18056. --- include/wx/osx/dvrenderers.h | 29 +++++++++++++++++++++++++++-- src/common/datavcmn.cpp | 15 +-------------- src/osx/cocoa/dataview.mm | 10 ++-------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/include/wx/osx/dvrenderers.h b/include/wx/osx/dvrenderers.h index c62a19ffb5..0aa10473dc 100644 --- a/include/wx/osx/dvrenderers.h +++ b/include/wx/osx/dvrenderers.h @@ -42,6 +42,29 @@ private: wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer); }; +// --------------------------------------------------------------------------- +// This is a Mac-specific class that should be used as the base class for the +// renderers that should be disabled when they're inert, to prevent the user +// from editing them. +// --------------------------------------------------------------------------- + +class wxOSXDataViewDisabledInertRenderer : public wxDataViewRenderer +{ +protected: + wxOSXDataViewDisabledInertRenderer(const wxString& varianttype, + wxDataViewCellMode mode, + int alignment) + : wxDataViewRenderer(varianttype, mode, alignment) + { + } + + virtual void SetEnabled(bool enabled) wxOVERRIDE + { + wxDataViewRenderer::SetEnabled(enabled && + GetMode() != wxDATAVIEW_CELL_INERT); + } +}; + // --------------------------------------------------------- // wxDataViewTextRenderer // --------------------------------------------------------- @@ -97,7 +120,8 @@ private: // wxDataViewChoiceRenderer // ------------------------------------- -class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewRenderer +class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer + : public wxOSXDataViewDisabledInertRenderer { public: wxDataViewChoiceRenderer(const wxArrayString& choices, @@ -164,7 +188,8 @@ private: // wxDataViewToggleRenderer // --------------------------------------------------------- -class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer +class WXDLLIMPEXP_ADV wxDataViewToggleRenderer + : public wxOSXDataViewDisabledInertRenderer { public: static wxString GetDefaultType() { return wxS("bool"); } diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 0f2ccc24b8..008a61ad3d 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -862,20 +862,7 @@ wxDataViewRendererBase::PrepareForItem(const wxDataViewModel *model, // Finally determine the enabled/disabled state and apply it, even to the // empty cells. - bool enabled = true; - switch ( GetMode() ) - { - case wxDATAVIEW_CELL_INERT: - enabled = false; - break; - - case wxDATAVIEW_CELL_ACTIVATABLE: - case wxDATAVIEW_CELL_EDITABLE: - enabled = model->IsEnabled(item, column); - break; - } - - SetEnabled(enabled); + SetEnabled(model->IsEnabled(item, column)); } wxCATCH_ALL diff --git a/src/osx/cocoa/dataview.mm b/src/osx/cocoa/dataview.mm index c48c9c976e..eac9a0fbda 100644 --- a/src/osx/cocoa/dataview.mm +++ b/src/osx/cocoa/dataview.mm @@ -2897,12 +2897,6 @@ void wxDataViewRenderer::SetAttr(const wxDataViewItemAttr& attr) void wxDataViewRenderer::SetEnabled(bool enabled) { - // setting the appearance to disabled grey should only be done for - // the active cells which are disabled, not for the cells which can - // never be edited at all - if ( GetMode() == wxDATAVIEW_CELL_INERT ) - enabled = true; - [GetNativeData()->GetItemCell() setEnabled:enabled]; } @@ -3071,7 +3065,7 @@ wxIMPLEMENT_CLASS(wxDataViewBitmapRenderer, wxDataViewRenderer); wxDataViewChoiceRenderer::wxDataViewChoiceRenderer(const wxArrayString& choices, wxDataViewCellMode mode, int alignment) - : wxDataViewRenderer(wxT("string"), mode, alignment), + : wxOSXDataViewDisabledInertRenderer(wxT("string"), mode, alignment), m_choices(choices) { NSPopUpButtonCell* cell; @@ -3318,7 +3312,7 @@ wxIMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer); wxDataViewToggleRenderer::wxDataViewToggleRenderer(const wxString& varianttype, wxDataViewCellMode mode, int align) - : wxDataViewRenderer(varianttype,mode) + : wxOSXDataViewDisabledInertRenderer(varianttype, mode, align) { NSButtonCell* cell;