From dcbf35f87c75ed0f829daceee46969fe7c038cd9 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 6 Aug 2013 17:00:10 +0000 Subject: [PATCH] Use RIAA wrapper for wxSpinCtrl event disabling in wxGTK. The use of wxSpinCtrlEventDisabler class ensures that we never forget to reenable the events after disabling them. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74633 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/spinctrl.h | 2 ++ src/gtk/spinctrl.cpp | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/include/wx/gtk/spinctrl.h b/include/wx/gtk/spinctrl.h index ed0dbdceb0..ef7b6edb7d 100644 --- a/include/wx/gtk/spinctrl.h +++ b/include/wx/gtk/spinctrl.h @@ -79,6 +79,8 @@ protected: // override this and return true. virtual bool UseGTKStyleBase() const { return true; } + friend class wxSpinCtrlEventDisabler; + DECLARE_EVENT_TABLE() }; diff --git a/src/gtk/spinctrl.cpp b/src/gtk/spinctrl.cpp index 588e5ce4d7..b036e0bdb0 100644 --- a/src/gtk/spinctrl.cpp +++ b/src/gtk/spinctrl.cpp @@ -76,6 +76,30 @@ gtk_changed(GtkSpinButton* spinbutton, wxSpinCtrl* win) } } +// ---------------------------------------------------------------------------- +// wxSpinCtrlEventDisabler: helper to temporarily disable GTK+ events +// ---------------------------------------------------------------------------- + +class wxSpinCtrlEventDisabler +{ +public: + wxEXPLICIT wxSpinCtrlEventDisabler(wxSpinCtrlGTKBase* spin) + : m_spin(spin) + { + m_spin->GtkDisableEvents(); + } + + ~wxSpinCtrlEventDisabler() + { + m_spin->GtkEnableEvents(); + } + +private: + wxSpinCtrlGTKBase* const m_spin; + + wxDECLARE_NO_COPY_CLASS(wxSpinCtrlEventDisabler); +}; + //----------------------------------------------------------------------------- // wxSpinCtrlGTKBase //----------------------------------------------------------------------------- @@ -207,18 +231,16 @@ void wxSpinCtrlGTKBase::SetValue( const wxString& value ) } // invalid number - set text as is (wxMSW compatible) - GtkDisableEvents(); + wxSpinCtrlEventDisabler disable(this); gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) ); - GtkEnableEvents(); } void wxSpinCtrlGTKBase::DoSetValue( double value ) { wxCHECK_RET( (m_widget != NULL), wxT("invalid spin button") ); - GtkDisableEvents(); + wxSpinCtrlEventDisabler disable(this); gtk_spin_button_set_value( GTK_SPIN_BUTTON(m_widget), value); - GtkEnableEvents(); } void wxSpinCtrlGTKBase::SetSnapToTicks(bool snap_to_ticks) @@ -245,23 +267,21 @@ void wxSpinCtrlGTKBase::DoSetRange(double minVal, double maxVal) { wxCHECK_RET( (m_widget != NULL), wxT("invalid spin button") ); - GtkDisableEvents(); + wxSpinCtrlEventDisabler disable(this); gtk_spin_button_set_range( GTK_SPIN_BUTTON(m_widget), minVal, maxVal); - GtkEnableEvents(); } void wxSpinCtrlGTKBase::DoSetIncrement(double inc) { wxCHECK_RET( m_widget, "invalid spin button" ); - GtkDisableEvents(); + wxSpinCtrlEventDisabler disable(this); // Preserve the old page value when changing just the increment. double page = 10*inc; gtk_spin_button_get_increments( GTK_SPIN_BUTTON(m_widget), NULL, &page); gtk_spin_button_set_increments( GTK_SPIN_BUTTON(m_widget), inc, page); - GtkEnableEvents(); } void wxSpinCtrlGTKBase::GtkDisableEvents() const @@ -471,9 +491,8 @@ void wxSpinCtrlDouble::SetDigits(unsigned digits) { wxCHECK_RET( m_widget, "invalid spin button" ); - GtkDisableEvents(); + wxSpinCtrlEventDisabler disable(this); gtk_spin_button_set_digits( GTK_SPIN_BUTTON(m_widget), digits); - GtkEnableEvents(); } #endif // wxUSE_SPINCTRL -- 2.45.2