Remove m_blockEvents and use Disable/Enable instead, some more rearraging

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53706 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2008-05-22 20:53:10 +00:00
parent 021b67941a
commit 1e6ffd6691
2 changed files with 44 additions and 42 deletions

View File

@@ -93,11 +93,13 @@ public:
bool m_hasCheckBoxes; bool m_hasCheckBoxes;
#endif // wxUSE_CHECKLISTBOX #endif // wxUSE_CHECKLISTBOX
bool m_blockEvent;
struct _GtkTreeEntry* GtkGetEntry(unsigned pos) const; struct _GtkTreeEntry* GtkGetEntry(unsigned pos) const;
void GtkDeselectAll();
void GtkSetSelection(int n, const bool select, const bool blockEvent); void GtkDisableEvents();
void GtkEnableEvents();
wxArrayInt m_oldSelection;
void GtkUpdateOldSelection();
protected: protected:
virtual void DoClear(); virtual void DoClear();

View File

@@ -119,8 +119,6 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection),
{ {
if (g_blockEventsOnDrag) return; if (g_blockEventsOnDrag) return;
if (listbox->m_blockEvent) return;
wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
event.SetEventObject( listbox ); event.SetEventObject( listbox );
@@ -367,8 +365,6 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
long style, const wxValidator& validator, long style, const wxValidator& validator,
const wxString &name ) const wxString &name )
{ {
m_blockEvent = false;
if (!PreCreation( parent, pos, size ) || if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name )) !CreateBase( parent, id, pos, size, style, validator, name ))
{ {
@@ -435,12 +431,6 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
gtk_tree_view_set_enable_search(m_treeview, FALSE); gtk_tree_view_set_enable_search(m_treeview, FALSE);
GtkTreeSelection* selection = gtk_tree_view_get_selection( m_treeview );
g_signal_connect_after (selection, "changed",
G_CALLBACK (gtk_listitem_changed_callback), this);
GtkSelectionMode mode; GtkSelectionMode mode;
if (style & wxLB_MULTIPLE) if (style & wxLB_MULTIPLE)
{ {
@@ -457,6 +447,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
mode = GTK_SELECTION_SINGLE; mode = GTK_SELECTION_SINGLE;
} }
GtkTreeSelection* selection = gtk_tree_view_get_selection( m_treeview );
gtk_tree_selection_set_mode( selection, mode ); gtk_tree_selection_set_mode( selection, mode );
// Handle sortable stuff // Handle sortable stuff
@@ -497,6 +488,9 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
PostCreation(size); PostCreation(size);
SetInitialSize(size); // need this too because this is a wxControlWithItems SetInitialSize(size); // need this too because this is a wxControlWithItems
g_signal_connect_after (selection, "changed",
G_CALLBACK (gtk_listitem_changed_callback), this);
return true; return true;
} }
@@ -507,6 +501,24 @@ wxListBox::~wxListBox()
Clear(); Clear();
} }
void wxListBox::GtkDisableEvents()
{
GtkTreeSelection* selection = gtk_tree_view_get_selection( m_treeview );
g_signal_handlers_block_by_func(selection,
(gpointer) gtk_listitem_changed_callback, this);
}
void wxListBox::GtkEnableEvents()
{
GtkTreeSelection* selection = gtk_tree_view_get_selection( m_treeview );
g_signal_handlers_unblock_by_func(selection,
(gpointer) gtk_listitem_changed_callback, this);
GtkUpdateOldSelection();
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// adding items // adding items
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -793,44 +805,26 @@ bool wxListBox::IsSelected( int n ) const
void wxListBox::DoSetSelection( int n, bool select ) void wxListBox::DoSetSelection( int n, bool select )
{ {
wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") );
GtkDisableEvents();
GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview);
// passing -1 to SetSelection() is documented to deselect all items // passing -1 to SetSelection() is documented to deselect all items
if ( n == wxNOT_FOUND ) if ( n == wxNOT_FOUND )
{ {
// ... and not generate any events in the process gtk_tree_selection_unselect_all(selection);
GtkDeselectAll(); GtkEnableEvents();
return; return;
} }
wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetSelection") ); wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetSelection") );
// don't generate the selection event
GtkSetSelection(n, select, true);
}
void wxListBox::GtkDeselectAll()
{
wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") );
GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview);
m_blockEvent = true;
gtk_tree_selection_unselect_all(selection);
m_blockEvent = false;
}
void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent)
{
wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") );
GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview);
GtkTreeIter iter; GtkTreeIter iter;
wxCHECK_RET( GtkGetIteratorFor(n, &iter), wxT("Invalid index") ); wxCHECK_RET( GtkGetIteratorFor(n, &iter), wxT("Invalid index") );
m_blockEvent = blockEvent;
if (select) if (select)
gtk_tree_selection_select_iter(selection, &iter); gtk_tree_selection_select_iter(selection, &iter);
else else
@@ -843,7 +837,13 @@ void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent)
gtk_tree_path_free(path); gtk_tree_path_free(path);
m_blockEvent = false; GtkEnableEvents();
}
void wxListBox::GtkUpdateOldSelection()
{
if (HasFlag(wxLB_MULTIPLE))
GetSelections( m_oldSelection );
} }
void wxListBox::DoScrollToCell(int n, float alignY, float alignX) void wxListBox::DoScrollToCell(int n, float alignY, float alignX)