diff --git a/docs/doxygen/overviews/xrc_format.h b/docs/doxygen/overviews/xrc_format.h
index 42fb8f73d4..fa222b0f34 100644
--- a/docs/doxygen/overviews/xrc_format.h
+++ b/docs/doxygen/overviews/xrc_format.h
@@ -2057,6 +2057,8 @@ exactly one non-toplevel window as its child.
Minimum allowed value (default: 0).}
@row3col{max, integer,
Maximum allowed value (default: 100).}
+@row3col{inc, integer,
+ Increment (default: 1). Available since wxWidgets 3.1.6.}
@endTable
diff --git a/include/wx/msw/spinbutt.h b/include/wx/msw/spinbutt.h
index 494cc38f2e..64fb1fb1ad 100644
--- a/include/wx/msw/spinbutt.h
+++ b/include/wx/msw/spinbutt.h
@@ -58,6 +58,8 @@ public:
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const wxOVERRIDE { return false; }
+ virtual void SetIncrement(int value) wxOVERRIDE;
+ virtual int GetIncrement() const wxOVERRIDE;
protected:
virtual wxSize DoGetBestSize() const wxOVERRIDE;
diff --git a/include/wx/osx/cocoa/private.h b/include/wx/osx/cocoa/private.h
index bd4657b146..cbe2b4aa21 100644
--- a/include/wx/osx/cocoa/private.h
+++ b/include/wx/osx/cocoa/private.h
@@ -149,8 +149,10 @@ public :
bool ButtonClickDidStateChange() wxOVERRIDE { return true; }
void SetMinimum( wxInt32 v ) wxOVERRIDE;
void SetMaximum( wxInt32 v ) wxOVERRIDE;
+ void SetIncrement(int value) wxOVERRIDE;
wxInt32 GetMinimum() const wxOVERRIDE;
wxInt32 GetMaximum() const wxOVERRIDE;
+ int GetIncrement() const wxOVERRIDE;
void PulseGauge() wxOVERRIDE;
void SetScrollThumb( wxInt32 value, wxInt32 thumbSize ) wxOVERRIDE;
diff --git a/include/wx/osx/core/private.h b/include/wx/osx/core/private.h
index ffbcb1312f..bf56446f69 100644
--- a/include/wx/osx/core/private.h
+++ b/include/wx/osx/core/private.h
@@ -347,8 +347,10 @@ public :
virtual void Enable( bool enable ) = 0;
virtual void SetMinimum( wxInt32 v ) = 0;
virtual void SetMaximum( wxInt32 v ) = 0;
+ virtual void SetIncrement(int value) = 0;
virtual wxInt32 GetMinimum() const = 0;
virtual wxInt32 GetMaximum() const = 0;
+ virtual int GetIncrement() const = 0;
virtual void PulseGauge() = 0;
virtual void SetScrollThumb( wxInt32 value, wxInt32 thumbSize ) = 0;
diff --git a/include/wx/osx/iphone/private.h b/include/wx/osx/iphone/private.h
index e4225e8086..011434fbcc 100644
--- a/include/wx/osx/iphone/private.h
+++ b/include/wx/osx/iphone/private.h
@@ -100,8 +100,10 @@ public :
bool ButtonClickDidStateChange() { return true ;}
void SetMinimum( wxInt32 v );
void SetMaximum( wxInt32 v );
+ void SetIncrement(int WXUNUSED(value)) { }
wxInt32 GetMinimum() const;
wxInt32 GetMaximum() const;
+ int GetIncrement() const { return 1; }
void PulseGauge();
void SetScrollThumb( wxInt32 value, wxInt32 thumbSize );
diff --git a/include/wx/osx/spinbutt.h b/include/wx/osx/spinbutt.h
index 8b7c5b843c..645f52f34c 100644
--- a/include/wx/osx/spinbutt.h
+++ b/include/wx/osx/spinbutt.h
@@ -54,6 +54,8 @@ public:
virtual void SetRange(int minVal, int maxVal) wxOVERRIDE;
virtual int GetValue() const wxOVERRIDE;
virtual void SetValue(int val) wxOVERRIDE;
+ virtual void SetIncrement(int value) wxOVERRIDE;
+ virtual int GetIncrement() const wxOVERRIDE;
// implementation
diff --git a/include/wx/spinbutt.h b/include/wx/spinbutt.h
index 7370ebf600..5204b95261 100644
--- a/include/wx/spinbutt.h
+++ b/include/wx/spinbutt.h
@@ -61,12 +61,13 @@ public:
// is this spin button vertically oriented?
bool IsVertical() const { return (m_windowStyle & wxSP_VERTICAL) != 0; }
+ virtual void SetIncrement(int WXUNUSED(value)) { }
+ virtual int GetIncrement() const { return 1; }
protected:
// the range value
int m_min;
int m_max;
-
wxDECLARE_NO_COPY_CLASS(wxSpinButtonBase);
};
diff --git a/interface/wx/spinbutt.h b/interface/wx/spinbutt.h
index 7acf76a5bb..67fe44b421 100644
--- a/interface/wx/spinbutt.h
+++ b/interface/wx/spinbutt.h
@@ -54,7 +54,7 @@ public:
A wxSpinButton has two small up and down (or left and right) arrow buttons.
- It is often used next to a text control for increment and decrementing a value.
+ It is often used next to a text control for incrementing and decrementing a value.
Portable programs should try to use wxSpinCtrl instead as wxSpinButton is not
implemented for all platforms but wxSpinCtrl is as it degenerates to a simple
wxTextCtrl on such platforms.
@@ -146,6 +146,15 @@ public:
long style = wxSP_VERTICAL,
const wxString& name = "wxSpinButton");
+ /**
+ Get the value for increment for a spin control.
+
+ The default value is 1 but it can be changed using SetIncrement().
+
+ @since 3.1.6
+ */
+ int GetIncrement() const;
+
/**
Returns the maximum permissible value.
@@ -167,6 +176,23 @@ public:
*/
virtual int GetValue() const;
+ /**
+ Sets the increment for the control.
+
+ The increment is the number by which the value changes when the up or
+ down arrow is used.
+
+ The default is 1.
+
+ This function is currently implemented only in wxMSW and does nothing
+ under the other platforms.
+
+ @since 3.1.6
+
+ @see wxSpinCtrl::SetIncrement()
+ */
+ void SetIncrement(int value);
+
/**
Sets the range of the spin button.
diff --git a/interface/wx/spinctrl.h b/interface/wx/spinctrl.h
index bb41ccd909..1786768ac6 100644
--- a/interface/wx/spinctrl.h
+++ b/interface/wx/spinctrl.h
@@ -145,6 +145,15 @@ public:
*/
int GetValue() const;
+ /**
+ Get the value for increment for a spin control.
+
+ The default value is 1 but it can be changed using SetIncrement().
+
+ @since 3.1.6
+ */
+ int GetIncrement() const;
+
/**
Sets the base to use for the numbers in this control.
@@ -214,6 +223,22 @@ public:
Calling this method doesn't generate any @c wxEVT_SPINCTRL events.
*/
void SetValue(int value);
+
+ /**
+ Sets the increment for the control.
+
+ The increment is the number by which the value changes when the up or
+ down arrow is used.
+
+ The default is 1, but it can be useful to set it to a higher value when
+ using the control for bigger numbers.
+
+ Note that it is still possible to enter any value (in the valid range)
+ into the control manually, whatever is the value of the increment.
+
+ @since 3.1.6
+ */
+ void SetIncrement(int value);
};
/**
diff --git a/misc/schema/xrc_schema.rnc b/misc/schema/xrc_schema.rnc
index 49f56405f8..7d490ae7c8 100644
--- a/misc/schema/xrc_schema.rnc
+++ b/misc/schema/xrc_schema.rnc
@@ -1482,7 +1482,8 @@ wxSpinButton =
stdWindowProperties &
[xrc:p="o"] element value {_, t_integer }* &
[xrc:p="o"] element min {_, t_integer }* &
- [xrc:p="o"] element max {_, t_integer }*
+ [xrc:p="o"] element max {_, t_integer }* &
+ [xrc:p="o"] element inc {_, t_integer }*
}
@@ -1494,7 +1495,8 @@ wxSpinCtrl =
[xrc:p="o"] element value {_, t_integer }* &
[xrc:p="o"] element min {_, t_integer }* &
[xrc:p="o"] element max {_, t_integer }* &
- [xrc:p="o"] element base {_, ("10" | "16") }*
+ [xrc:p="o"] element base {_, ("10" | "16") }* &
+ [xrc:p="o"] element inc {_, t_integer }*
}
diff --git a/samples/widgets/spinbtn.cpp b/samples/widgets/spinbtn.cpp
index 609fc36ada..65780f4b73 100644
--- a/samples/widgets/spinbtn.cpp
+++ b/samples/widgets/spinbtn.cpp
@@ -55,11 +55,13 @@ enum
SpinBtnPage_SetValue,
SpinBtnPage_SetMinAndMax,
SpinBtnPage_SetBase,
+ SpinBtnPage_SetIncrement,
SpinBtnPage_CurValueText,
SpinBtnPage_ValueText,
SpinBtnPage_MinText,
SpinBtnPage_MaxText,
SpinBtnPage_BaseText,
+ SpinBtnPage_SetIncrementText,
SpinBtnPage_SpinBtn,
SpinBtnPage_SpinCtrl,
SpinBtnPage_SpinCtrlDouble
@@ -103,7 +105,7 @@ protected:
void OnButtonSetValue(wxCommandEvent& event);
void OnButtonSetMinAndMax(wxCommandEvent& event);
void OnButtonSetBase(wxCommandEvent& event);
-
+ void OnButtonSetIncrement(wxCommandEvent &event);
void OnCheckOrRadioBox(wxCommandEvent& event);
void OnSpinBtn(wxSpinEvent& event);
@@ -138,6 +140,9 @@ protected:
// and numeric base
int m_base;
+ // the increment
+ int m_increment;
+
// the controls
// ------------
@@ -159,7 +164,8 @@ protected:
wxTextCtrl *m_textValue,
*m_textMin,
*m_textMax,
- *m_textBase;
+ *m_textBase,
+ *m_textIncrement;
private:
wxDECLARE_EVENT_TABLE();
@@ -175,6 +181,7 @@ wxBEGIN_EVENT_TABLE(SpinBtnWidgetsPage, WidgetsPage)
EVT_BUTTON(SpinBtnPage_SetValue, SpinBtnWidgetsPage::OnButtonSetValue)
EVT_BUTTON(SpinBtnPage_SetMinAndMax, SpinBtnWidgetsPage::OnButtonSetMinAndMax)
EVT_BUTTON(SpinBtnPage_SetBase, SpinBtnWidgetsPage::OnButtonSetBase)
+ EVT_BUTTON(SpinBtnPage_SetIncrement, SpinBtnWidgetsPage::OnButtonSetIncrement)
EVT_UPDATE_UI(SpinBtnPage_SetValue, SpinBtnWidgetsPage::OnUpdateUIValueButton)
EVT_UPDATE_UI(SpinBtnPage_SetMinAndMax, SpinBtnWidgetsPage::OnUpdateUIMinMaxButton)
@@ -227,12 +234,14 @@ SpinBtnWidgetsPage::SpinBtnWidgetsPage(WidgetsBookCtrl *book,
m_textValue =
m_textMin =
m_textMax =
- m_textBase = NULL;
+ m_textBase =
+ m_textIncrement = NULL;
m_min = 0;
m_max = 10;
m_base = 10;
+ m_increment = 1;
m_sizerSpin = NULL;
}
@@ -311,6 +320,13 @@ void SpinBtnWidgetsPage::CreateContent()
m_textBase->SetValue("10");
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
+ sizerRow = CreateSizerWithTextAndButton( SpinBtnPage_SetIncrement,
+ "Set Increment",
+ SpinBtnPage_SetIncrementText,
+ &m_textIncrement );
+ m_textIncrement->SetValue( "1" );
+ sizerMiddle->Add( sizerRow, 0, wxALL | wxGROW, 5 );
+
// right pane
wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
sizerRight->SetMinSize(150, 0);
@@ -481,6 +497,20 @@ void SpinBtnWidgetsPage::OnButtonSetBase(wxCommandEvent& WXUNUSED(event))
m_sizerSpin->Layout();
}
+void SpinBtnWidgetsPage::OnButtonSetIncrement(wxCommandEvent& WXUNUSED (event))
+{
+ int increment = wxAtoi( m_textIncrement->GetValue() );
+ if ( !increment )
+ {
+ wxLogWarning("Invalid increment value.");
+ return;
+ }
+
+ m_increment = increment;
+ m_spinctrl->SetIncrement(m_increment);
+ wxLogWarning("Setting increment to %d.", m_increment);
+}
+
void SpinBtnWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event))
{
if ( m_textValue->IsEmpty() )
diff --git a/samples/xrc/rc/controls.xrc b/samples/xrc/rc/controls.xrc
index 16853bffa9..ed0cadffc9 100644
--- a/samples/xrc/rc/controls.xrc
+++ b/samples/xrc/rc/controls.xrc
@@ -962,6 +962,7 @@ lay them out using wxSizers, absolute positioning, everything you like!
100
0
+ 2
@@ -985,6 +986,7 @@ lay them out using wxSizers, absolute positioning, everything you like!
100
17
16
+ 2
diff --git a/src/msw/spinbutt.cpp b/src/msw/spinbutt.cpp
index b22d2965df..a6f69cced4 100644
--- a/src/msw/spinbutt.cpp
+++ b/src/msw/spinbutt.cpp
@@ -288,4 +288,24 @@ bool wxSpinButton::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD WXUNUSED(id))
return false;
}
+void wxSpinButton::SetIncrement(int value)
+{
+ UDACCEL accel;
+ accel.nSec = 0;
+ accel.nInc = value;
+ ::SendMessage(GetHwnd(), UDM_SETACCEL, 1, (LPARAM) &accel);
+}
+
+int wxSpinButton::GetIncrement() const
+{
+ UDACCEL accel;
+
+ // If the message is unsupported, this default value won't be modified and
+ // will be returned below.
+ accel.nInc = 1;
+
+ ::SendMessage(GetHwnd(), UDM_GETACCEL, 1, (LPARAM) &accel);
+
+ return accel.nInc;
+}
#endif // wxUSE_SPINBTN
diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp
index 2fd2525a67..202351ed4f 100644
--- a/src/msw/spinctrl.cpp
+++ b/src/msw/spinctrl.cpp
@@ -877,5 +877,4 @@ void wxSpinCtrl::DoClientToScreen(int *x, int *y) const
{
wxWindow::MSWDoClientToScreen(GetBuddyHwnd(), x, y);
}
-
#endif // wxUSE_SPINCTRL
diff --git a/src/osx/cocoa/spinbutt.mm b/src/osx/cocoa/spinbutt.mm
index 6649a31e4b..3689ff129c 100644
--- a/src/osx/cocoa/spinbutt.mm
+++ b/src/osx/cocoa/spinbutt.mm
@@ -51,6 +51,8 @@ public :
virtual void SetValue(wxInt32 v) wxOVERRIDE;
virtual void SetMinimum(wxInt32 v) wxOVERRIDE;
virtual void SetMaximum(wxInt32 v) wxOVERRIDE;
+ virtual void SetIncrement(int value) wxOVERRIDE;
+ virtual int GetIncrement() const wxOVERRIDE;
virtual void controlAction(WXWidget slf, void* _cmd, void *sender) wxOVERRIDE;
virtual void mouseEvent(WX_NSEvent event, WXWidget slf, void* _cmd) wxOVERRIDE;
private:
@@ -123,6 +125,16 @@ void wxSpinButtonCocoaImpl::controlAction( WXWidget WXUNUSED(slf), void *WXUNUSE
}
}
+void wxSpinButtonCocoaImpl::SetIncrement(int value)
+{
+ [(NSStepper*)m_osxView setIncrement:value];
+}
+
+int wxSpinButtonCocoaImpl::GetIncrement() const
+{
+ return [(NSStepper *) m_osxView increment];
+}
+
wxWidgetImplType* wxWidgetImpl::CreateSpinButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(id),
diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm
index 82efa9ae54..be92a9b632 100644
--- a/src/osx/cocoa/window.mm
+++ b/src/osx/cocoa/window.mm
@@ -181,8 +181,10 @@ NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const
- (double)minValue;
- (double)maxValue;
+- (int)increment;
- (void)setMinValue:(double)aDouble;
- (void)setMaxValue:(double)aDouble;
+- (void)setIncrement:(int)value;
- (void)sizeToFit;
@@ -3420,6 +3422,23 @@ wxInt32 wxWidgetCocoaImpl::GetMinimum() const
return 0;
}
+void wxWidgetCocoaImpl::SetIncrement(int value)
+{
+ if ( [m_osxView respondsToSelector:@selector(setIncrement:)] )
+ {
+ [m_osxView setIncrement:value];
+ }
+}
+
+int wxWidgetCocoaImpl::GetIncrement() const
+{
+ if( [m_osxView respondsToSelector:@selector(increment)] )
+ {
+ return (int) [m_osxView increment];
+ }
+ return 0;
+}
+
wxInt32 wxWidgetCocoaImpl::GetMaximum() const
{
if ( [m_osxView respondsToSelector:@selector(maxValue)] )
diff --git a/src/osx/spinbutt_osx.cpp b/src/osx/spinbutt_osx.cpp
index 306576705b..ec06f25e06 100644
--- a/src/osx/spinbutt_osx.cpp
+++ b/src/osx/spinbutt_osx.cpp
@@ -142,4 +142,14 @@ void wxSpinButton::TriggerScrollEvent(wxEventType scrollEvent)
SendThumbTrackEvent() ;
}
+void wxSpinButton::SetIncrement(int value)
+{
+ GetPeer()->SetIncrement( value );
+}
+
+int wxSpinButton::GetIncrement() const
+{
+ return GetPeer()->GetIncrement();
+}
+
#endif // wxUSE_SPINBTN
diff --git a/src/xrc/xh_spin.cpp b/src/xrc/xh_spin.cpp
index 70a5700330..6bd3c4a9e9 100644
--- a/src/xrc/xh_spin.cpp
+++ b/src/xrc/xh_spin.cpp
@@ -22,6 +22,7 @@
static const long DEFAULT_VALUE = 0;
static const long DEFAULT_MIN = 0;
static const long DEFAULT_MAX = 100;
+static const int DEFAULT_INCREMENT = 1;
wxIMPLEMENT_DYNAMIC_CLASS(wxSpinButtonXmlHandler, wxXmlResourceHandler);
@@ -48,6 +49,7 @@ wxObject *wxSpinButtonXmlHandler::DoCreateResource()
control->SetValue(GetLong( wxT("value"), DEFAULT_VALUE));
control->SetRange(GetLong( wxT("min"), DEFAULT_MIN),
GetLong(wxT("max"), DEFAULT_MAX));
+ control->SetValue(GetLong(wxT( "inc" ), DEFAULT_INCREMENT));
SetupWindow(control);
return control;
@@ -98,6 +100,7 @@ wxObject *wxSpinCtrlXmlHandler::DoCreateResource()
GetLong(wxT("max"), DEFAULT_MAX),
GetLong(wxT("value"), DEFAULT_VALUE),
GetName());
+ control->SetIncrement(GetLong(wxT("inc"), DEFAULT_INCREMENT));
const long base = GetLong(wxS("base"), 10);
if ( base != 10 )
diff --git a/tests/controls/spinctrltest.cpp b/tests/controls/spinctrltest.cpp
index e7262e83ed..5c22c62817 100644
--- a/tests/controls/spinctrltest.cpp
+++ b/tests/controls/spinctrltest.cpp
@@ -368,4 +368,30 @@ TEST_CASE_METHOD(SpinCtrlTestCase3, "SpinCtrl::SetValueInsideEventHandler", "[sp
#endif // wxUSE_UIACTIONSIMULATOR
}
+TEST_CASE_METHOD(SpinCtrlTestCase1, "SpinCtrl::Increment", "[spinctrl]")
+{
+#if wxUSE_UIACTIONSIMULATOR
+ m_spin->Create(wxTheApp->GetTopWindow(), wxID_ANY, "",
+ wxDefaultPosition, wxDefaultSize,
+ wxSP_ARROW_KEYS | wxSP_WRAP);
+
+ wxUIActionSimulator sim;
+
+ CHECK( m_spin->GetIncrement() == 1 );
+
+ m_spin->SetFocus();
+ wxYield();
+ m_spin->SetIncrement( 5 );
+ sim.Char(WXK_UP);
+
+ wxYield();
+
+ CHECK(m_spin->GetValue() == 5);
+
+ int increment = m_spin->GetIncrement();
+
+ CHECK( increment == 5 );
+#endif
+}
+
#endif