From 70c147281aaaacd69ad1f7afd02671d524a9ce1e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 10 Mar 2009 15:45:13 +0000 Subject: [PATCH] also fix handling of wxSP_ARROW_KEYS|wxSP_WRAP (see #10565) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59473 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/generic/spinctlg.h | 5 +++++ src/generic/spinctlg.cpp | 22 ++++++++++++++-------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index ed23baec67..fda269e22e 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -557,6 +557,7 @@ wxMSW: by modern apps. - Ellipsize long strings in wxStatusBar (Francesco Montorsi) - Fix spurious repaint when changing tooltip text (Jonathan Liu). +- Fix wxSP_WRAP and wxSP_ARROW_KEYS in wxSpinCtrlDouble (Andrew Radke). wxX11: diff --git a/include/wx/generic/spinctlg.h b/include/wx/generic/spinctlg.h index d01f8ba5bc..dbae5a17f0 100644 --- a/include/wx/generic/spinctlg.h +++ b/include/wx/generic/spinctlg.h @@ -110,8 +110,13 @@ protected: // Send the correct event type virtual void DoSendEvent() = 0; + // check if the value is in range bool InRange(double n) const { return (n >= m_min) && (n <= m_max); } + // ensure that the value is in range wrapping it round if necessary + double AdjustToFitInRange(double value) const; + + double m_value; double m_min; double m_max; diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp index 21e2d60d97..853b967500 100644 --- a/src/generic/spinctlg.cpp +++ b/src/generic/spinctlg.cpp @@ -338,13 +338,7 @@ void wxSpinCtrlGenericBase::OnSpinButton(wxSpinEvent& event) if (((spin_value >= 0) && (m_spin_value >= 0)) || ((spin_value <= 0) && (m_spin_value <= 0))) step *= abs(spin_value - m_spin_value); - double value = m_value + step*m_increment; - - // Check for over/underflow wrapping around if necessary - if (value < m_min) - value = HasFlag(wxSP_WRAP) ? m_max : m_min; - if (value > m_max) - value = HasFlag(wxSP_WRAP) ? m_min : m_max; + double value = AdjustToFitInRange(m_value + step*m_increment); // Ignore the edges when it wraps since the up/down event may be opposite // They are in GTK and Mac @@ -356,7 +350,7 @@ void wxSpinCtrlGenericBase::OnSpinButton(wxSpinEvent& event) m_spin_value = spin_value; - if (InRange(value) && DoSetValue(value)) + if ( DoSetValue(value) ) DoSendEvent(); } @@ -399,6 +393,8 @@ void wxSpinCtrlGenericBase::OnTextChar(wxKeyEvent& event) return; } + value = AdjustToFitInRange(value); + if ( m_textCtrl && m_textCtrl->IsModified() ) SyncSpinToText(); @@ -489,6 +485,16 @@ bool wxSpinCtrlGenericBase::DoSetValue(double val) return false; } +double wxSpinCtrlGenericBase::AdjustToFitInRange(double value) const +{ + if (value < m_min) + value = HasFlag(wxSP_WRAP) ? m_max : m_min; + if (value > m_max) + value = HasFlag(wxSP_WRAP) ? m_min : m_max; + + return value; +} + void wxSpinCtrlGenericBase::DoSetRange(double min, double max) { m_min = min; -- 2.45.2