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
This commit is contained in:
Vadim Zeitlin
2013-08-06 17:00:10 +00:00
parent 6f026b5b63
commit dcbf35f87c
2 changed files with 31 additions and 10 deletions

View File

@@ -79,6 +79,8 @@ protected:
// override this and return true. // override this and return true.
virtual bool UseGTKStyleBase() const { return true; } virtual bool UseGTKStyleBase() const { return true; }
friend class wxSpinCtrlEventDisabler;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };

View File

@@ -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 // wxSpinCtrlGTKBase
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -207,18 +231,16 @@ void wxSpinCtrlGTKBase::SetValue( const wxString& value )
} }
// invalid number - set text as is (wxMSW compatible) // invalid number - set text as is (wxMSW compatible)
GtkDisableEvents(); wxSpinCtrlEventDisabler disable(this);
gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) ); gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) );
GtkEnableEvents();
} }
void wxSpinCtrlGTKBase::DoSetValue( double value ) void wxSpinCtrlGTKBase::DoSetValue( double value )
{ {
wxCHECK_RET( (m_widget != NULL), wxT("invalid spin button") ); wxCHECK_RET( (m_widget != NULL), wxT("invalid spin button") );
GtkDisableEvents(); wxSpinCtrlEventDisabler disable(this);
gtk_spin_button_set_value( GTK_SPIN_BUTTON(m_widget), value); gtk_spin_button_set_value( GTK_SPIN_BUTTON(m_widget), value);
GtkEnableEvents();
} }
void wxSpinCtrlGTKBase::SetSnapToTicks(bool snap_to_ticks) 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") ); 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); gtk_spin_button_set_range( GTK_SPIN_BUTTON(m_widget), minVal, maxVal);
GtkEnableEvents();
} }
void wxSpinCtrlGTKBase::DoSetIncrement(double inc) void wxSpinCtrlGTKBase::DoSetIncrement(double inc)
{ {
wxCHECK_RET( m_widget, "invalid spin button" ); wxCHECK_RET( m_widget, "invalid spin button" );
GtkDisableEvents(); wxSpinCtrlEventDisabler disable(this);
// Preserve the old page value when changing just the increment. // Preserve the old page value when changing just the increment.
double page = 10*inc; double page = 10*inc;
gtk_spin_button_get_increments( GTK_SPIN_BUTTON(m_widget), NULL, &page); gtk_spin_button_get_increments( GTK_SPIN_BUTTON(m_widget), NULL, &page);
gtk_spin_button_set_increments( GTK_SPIN_BUTTON(m_widget), inc, page); gtk_spin_button_set_increments( GTK_SPIN_BUTTON(m_widget), inc, page);
GtkEnableEvents();
} }
void wxSpinCtrlGTKBase::GtkDisableEvents() const void wxSpinCtrlGTKBase::GtkDisableEvents() const
@@ -471,9 +491,8 @@ void wxSpinCtrlDouble::SetDigits(unsigned digits)
{ {
wxCHECK_RET( m_widget, "invalid spin button" ); wxCHECK_RET( m_widget, "invalid spin button" );
GtkDisableEvents(); wxSpinCtrlEventDisabler disable(this);
gtk_spin_button_set_digits( GTK_SPIN_BUTTON(m_widget), digits); gtk_spin_button_set_digits( GTK_SPIN_BUTTON(m_widget), digits);
GtkEnableEvents();
} }
#endif // wxUSE_SPINCTRL #endif // wxUSE_SPINCTRL