Really fix spurious asserts in wxGTK wxDataViewCtrl::EditItem()

This replaces the changes of 24c0401e81
which, for some reason, used a global variable for storing whether the
selection function had been already set or not, when this clearly is a
per-control (or per-selection, but this seems one and the same) bit of
information.

Replace global ms_firstTime with a wxDataViewCtrlInternal field to avoid
asserts as soon as EditItem() is called on more than one wxDataViewCtrl.

Closes #17946.
This commit is contained in:
Vadim Zeitlin
2017-09-13 17:25:48 +02:00
parent e48676cf4a
commit 81d9952dfe

View File

@@ -115,16 +115,16 @@ gboolean wxdataview_selection_func(GtkTreeSelection * WXUNUSED(selection),
class wxGtkTreeSelectionLock class wxGtkTreeSelectionLock
{ {
public: public:
wxGtkTreeSelectionLock(GtkTreeSelection *selection) wxGtkTreeSelectionLock(GtkTreeSelection *selection, bool& alreadySet)
: m_selection(selection) : m_selection(selection)
{ {
wxASSERT_MSG( !ms_instance, "this class is not reentrant currently" ); wxASSERT_MSG( !ms_instance, "this class is not reentrant currently" );
ms_instance = this; ms_instance = this;
if ( ms_firstTime ) if ( !alreadySet )
{ {
ms_firstTime = false; alreadySet = true;
CheckCurrentSelectionFunc(NULL); CheckCurrentSelectionFunc(NULL);
} }
else else
@@ -177,7 +177,6 @@ private:
} }
static wxGtkTreeSelectionLock *ms_instance; static wxGtkTreeSelectionLock *ms_instance;
static bool ms_firstTime;
GtkTreeSelection * const m_selection; GtkTreeSelection * const m_selection;
@@ -185,7 +184,6 @@ private:
}; };
wxGtkTreeSelectionLock *wxGtkTreeSelectionLock::ms_instance = NULL; wxGtkTreeSelectionLock *wxGtkTreeSelectionLock::ms_instance = NULL;
bool wxGtkTreeSelectionLock::ms_firstTime = true;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxDataViewCtrlInternal // wxDataViewCtrlInternal
@@ -296,6 +294,11 @@ private:
wxGtkDataViewModelNotifier *m_notifier; wxGtkDataViewModelNotifier *m_notifier;
bool m_dirty; bool m_dirty;
public:
// Allow direct access to this one from wxDataViewCtrl as it's just a
// simple flag and it doesn't make much sense to encapsulate it.
bool m_selectionFuncSet;
}; };
@@ -3515,6 +3518,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataVie
m_dropDataObject = NULL; m_dropDataObject = NULL;
m_dirty = false; m_dirty = false;
m_selectionFuncSet = false;
m_gtk_model = wxgtk_tree_model_new(); m_gtk_model = wxgtk_tree_model_new();
m_gtk_model->internal = this; m_gtk_model->internal = this;
@@ -4908,7 +4912,8 @@ void wxDataViewCtrl::DoSetCurrentItem(const wxDataViewItem& item)
// Unfortunately the only way to do it seems to use our own selection // Unfortunately the only way to do it seems to use our own selection
// function and forbid any selection changes during set cursor call. // function and forbid any selection changes during set cursor call.
wxGtkTreeSelectionLock wxGtkTreeSelectionLock
lock(gtk_tree_view_get_selection(GTK_TREE_VIEW(m_treeview))); lock(gtk_tree_view_get_selection(GTK_TREE_VIEW(m_treeview)),
m_internal->m_selectionFuncSet);
// Do move the cursor now. // Do move the cursor now.
GtkTreeIter iter; GtkTreeIter iter;
@@ -4949,7 +4954,8 @@ void wxDataViewCtrl::EditItem(const wxDataViewItem& item, const wxDataViewColumn
// Unfortunately the only way to do it seems to use our own selection // Unfortunately the only way to do it seems to use our own selection
// function and forbid any selection changes during set cursor call. // function and forbid any selection changes during set cursor call.
wxGtkTreeSelectionLock wxGtkTreeSelectionLock
lock(gtk_tree_view_get_selection(GTK_TREE_VIEW(m_treeview))); lock(gtk_tree_view_get_selection(GTK_TREE_VIEW(m_treeview)),
m_internal->m_selectionFuncSet);
// Do move the cursor now. // Do move the cursor now.
GtkTreeIter iter; GtkTreeIter iter;