void DoSetRange(double min_val, double max_val);
void DoSetIncrement(double inc);
- // Ensure that the textctrl shows correct value
- void SyncSpinToText();
+ // update our value to reflect the text control contents (if it has been
+ // modified by user, do nothing otherwise)
+ //
+ // can also change the text control if its value is invalid
+ //
+ // return true if our value has changed
+ bool SyncSpinToText();
// Send the correct event type
virtual void DoSendEvent() = 0;
{
if (m_spin)
{
- m_spin->SyncSpinToText();
- m_spin->DoSendEvent();
+ if ( m_spin->SyncSpinToText() )
+ m_spin->DoSendEvent();
}
event.Skip();
// Sync the textctrl since the user expects that the button will modify
// what they see in the textctrl.
- if ( m_textCtrl && m_textCtrl->IsModified() )
- SyncSpinToText();
+ SyncSpinToText();
int spin_value = event.GetPosition();
double step = (event.GetEventType() == wxEVT_SCROLL_LINEUP) ? 1 : -1;
value = AdjustToFitInRange(value);
- if ( m_textCtrl && m_textCtrl->IsModified() )
- SyncSpinToText();
+ SyncSpinToText();
if ( DoSetValue(value) )
DoSendEvent();
// Textctrl functions
// ----------------------------------------------------------------------------
-void wxSpinCtrlGenericBase::SyncSpinToText()
+bool wxSpinCtrlGenericBase::SyncSpinToText()
{
- if (!m_textCtrl)
- return;
+ if ( !m_textCtrl || !m_textCtrl->IsModified() )
+ return false;
double textValue;
if ( m_textCtrl->GetValue().ToDouble(&textValue) )
textValue = m_max;
else if (textValue < m_min)
textValue = m_min;
-
- // we must always set the value here, even if it's equal to m_value, as
- // otherwise we could be left with an out of range value when leaving
- // the text control and the current value is already m_max for example
- DoSetValue(textValue);
}
- else
+ else // text contents is not a valid number at all
{
- // textctrl is out of sync, discard and reset
- DoSetValue(m_value);
+ // replace its contents with the last valid value
+ textValue = m_value;
}
+
+ // we must always set the value here, even if it's equal to m_value, as
+ // otherwise we could be left with an out of range value when leaving the
+ // text control and the current value is already m_max for example
+ return DoSetValue(textValue);
}
// ----------------------------------------------------------------------------