TGUI 1.10
Loading...
Searching...
No Matches
SpinControl.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2025 Bruno Van de Velde (vdv_b@tgui.eu)
5//
6// This software is provided 'as-is', without any express or implied warranty.
7// In no event will the authors be held liable for any damages arising from the use of this software.
8//
9// Permission is granted to anyone to use this software for any purpose,
10// including commercial applications, and to alter it and redistribute it freely,
11// subject to the following restrictions:
12//
13// 1. The origin of this software must not be misrepresented;
14// you must not claim that you wrote the original software.
15// If you use this software in a product, an acknowledgment
16// in the product documentation would be appreciated but is not required.
17//
18// 2. Altered source versions must be plainly marked as such,
19// and must not be misrepresented as being the original software.
20//
21// 3. This notice may not be removed or altered from any source distribution.
22//
24
25#ifndef TGUI_SPIN_CONTROL_HPP
26#define TGUI_SPIN_CONTROL_HPP
27
28#include <TGUI/SubwidgetContainer.hpp>
29#include <TGUI/Widgets/SpinButton.hpp>
30#include <TGUI/Widgets/EditBox.hpp>
31
33
34TGUI_MODULE_EXPORT namespace tgui
35{
39 class TGUI_API SpinControl : public SubwidgetContainer
40 {
41 public:
42
43 using Ptr = std::shared_ptr<SpinControl>;
44 using ConstPtr = std::shared_ptr<const SpinControl>;
45
46 static constexpr const char StaticWidgetType[] = "SpinControl";
47
55 SpinControl(const char* typeName = StaticWidgetType, bool initRenderer = true);
56
60 SpinControl(const SpinControl& copy);
61
65 SpinControl(SpinControl&& copy) noexcept;
66
70 SpinControl& operator= (const SpinControl& right);
71
75 SpinControl& operator= (SpinControl&& right) noexcept;
76
88 TGUI_NODISCARD static SpinControl::Ptr create(float min = 0.0f, float max = 10.0f, float value = 0.0f, unsigned int decimal = 0, float step = 1.0f);
89
97 TGUI_NODISCARD static SpinControl::Ptr copy(const SpinControl::ConstPtr& SpinCtrl);
98
104 TGUI_NODISCARD const SpinButtonRenderer* getSpinButtonSharedRenderer() const;
105
112
118 TGUI_NODISCARD const EditBoxRenderer* getSpinTextSharedRenderer() const;
119
126
132 void setSize(const Layout2d& size) override;
134
143 void setMinimum(float minimum);
144
152 TGUI_NODISCARD float getMinimum() const;
153
162 void setMaximum(float maximum);
163
171 TGUI_NODISCARD float getMaximum() const;
172
182 template <typename T, typename = typename std::enable_if_t<std::is_arithmetic<T>::value, T>>
183 bool setValue(T value)
184 {
185 // TGUI_NEXT: For backwards compatibility, this function needs to accept a float without conversion warnings.
186 // We however need the function to take a double as parameter to actually make use of the extra significant digits.
187 if (m_spinButton->getValue() != static_cast<float>(value) && inRange(static_cast<float>(value)))
188 {
189 m_spinButton->setValue(value);
190 setString(String::fromNumberRounded(value, m_decimalPlaces));
191 return true;
192 }
193 return false;
194 }
195
203 TGUI_NODISCARD float getValue() const;
204
210 template <typename T, typename = typename std::enable_if_t<std::is_arithmetic<T>::value, T>>
211 void setStep(T step)
212 {
213 // TGUI_NEXT: For backwards compatibility, this function needs to accept a float without conversion warnings.
214 // We however need the function to take a double as parameter to actually make use of the extra significant digits in calculations.
215 m_spinButton->setStep(step);
216 }
217
225 TGUI_NODISCARD float getStep() const;
226
233 void setDecimalPlaces(unsigned int decimalPlaces);
234
242 TGUI_NODISCARD unsigned int getDecimalPlaces() const;
243
248 TGUI_DEPRECATED("Use setSpinButtonWidth(\"100%\") or setSpinButtonWidth(\"50%\") instead") void setUseWideArrows(bool useWideArrows);
249
254 TGUI_DEPRECATED("Use getSpinButtonWidth() instead") TGUI_NODISCARD bool getUseWideArrows() const;
255
266
272 TGUI_NODISCARD float getSpinButtonWidth() const;
273
275 protected:
276
286 TGUI_NODISCARD Signal& getSignal(String signalName) override;
287
289 // Makes a copy of the widget
291 TGUI_NODISCARD Widget::Ptr clone() const override;
292
296 TGUI_NODISCARD std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
297
301 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
302
304 private:
305
307 // Helper function that initializes the widget when constructing a new widget or loading one from a file
309 void init();
310
312 // Checks whether a value lies between the minimum and maximum
314 bool inRange(const float value) const;
315
317 // Updates the text in the edit box
319 void setString(const String& str);
320
322 public:
323
324 SignalFloat onValueChange = {"ValueChanged"};
325
327 protected:
328
329 unsigned int m_decimalPlaces = 0;
330 bool m_useWideArrows = false; // TGUI_NEXT: Remove
331 AbsoluteOrRelativeValue m_spinButtonWidth;
332
334 private:
335 SpinButton::Ptr m_spinButton = SpinButton::create();
336 EditBox::Ptr m_spinText = EditBox::create();
337 };
338
340}
341
343
344#endif // TGUI_SPIN_CONTROL_HPP
Class to store the a value that is either a constant or a ratio.
Definition AbsoluteOrRelativeValue.hpp:45
Definition EditBoxRenderer.hpp:35
static EditBox::Ptr create()
Creates a new edit box widget.
std::shared_ptr< EditBox > Ptr
Shared widget pointer.
Definition EditBox.hpp:51
Class to store the position or size of a widget.
Definition Layout.hpp:323
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:61
Definition SpinButtonRenderer.hpp:35
static SpinButton::Ptr create(float minimum=0, float maximum=10)
Creates a new spin button widget.
std::shared_ptr< SpinButton > Ptr
Shared widget pointer.
Definition SpinButton.hpp:47
SpinButtonRenderer * getSpinButtonSharedRenderer()
Returns the renderer of spin buttons part of widget.
EditBoxRenderer * getSpinTextSharedRenderer()
Returns the renderer of edit box part of widget.
void setMaximum(float maximum)
Sets a maximum value.
static SpinControl::Ptr copy(const SpinControl::ConstPtr &SpinCtrl)
Makes a copy of another spin control.
float getMaximum() const
Returns the maximum value.
SpinControl(const SpinControl &copy)
Copy constructor.
Widget::Ptr clone() const override
Makes a copy of the widget if you don't know its exact type.
std::shared_ptr< const SpinControl > ConstPtr
Shared constant widget pointer.
Definition SpinControl.hpp:44
float getMinimum() const
Returns the minimum value.
std::unique_ptr< DataIO::Node > save(SavingRenderersMap &renderers) const override
Saves the widget as a tree node in order to save it to a file.
bool getUseWideArrows() const
Returns whether the spin button width equals the heigh or the widget or only half of the height (defa...
SignalFloat onValueChange
Value of the spin control changed. Optional parameter: new value.
Definition SpinControl.hpp:324
void setSpinButtonWidth(AbsoluteOrRelativeValue width)
Changes the width of the spin button (i.e. width of the arrows that are shown next to the edit box)
EditBoxRenderer * getSpinTextRenderer()
Returns the renderer of edit box part of widget.
SpinControl(SpinControl &&copy) noexcept
Move constructor.
unsigned int getDecimalPlaces() const
Returns the number of decimal places to display.
static constexpr const char StaticWidgetType[]
Type name of the widget.
Definition SpinControl.hpp:46
static SpinControl::Ptr create(float min=0.0f, float max=10.0f, float value=0.0f, unsigned int decimal=0, float step=1.0f)
Creates a new spin button widget.
void setUseWideArrows(bool useWideArrows)
Changes whether the spin button width equals the heigh or the widget or only half of the height (defa...
void setSize(const Layout2d &size) override
Changes the size of the spin control.
void setMinimum(float minimum)
Sets a minimum value.
bool setValue(T value)
Changes the current value.
Definition SpinControl.hpp:183
Signal & getSignal(String signalName) override
Retrieves a signal based on its name.
std::shared_ptr< SpinControl > Ptr
Shared widget pointer.
Definition SpinControl.hpp:43
void setStep(T step)
Changes how much the value changes on each arrow press.
Definition SpinControl.hpp:211
SpinButtonRenderer * getSpinButtonRenderer()
Returns the renderer of spin buttons part of widget.
void setDecimalPlaces(unsigned int decimalPlaces)
Changes the number of decimal places to display.
float getSpinButtonWidth() const
Returns the width of the spin button (i.e. width of the arrows that are shown next to the edit box)
float getValue() const
Returns the current value.
void load(const std::unique_ptr< DataIO::Node > &node, const LoadingRenderersMap &renderers) override
Loads the widget from a tree of nodes.
float getStep() const
Returns the number of positions the thumb advances with each move.
Wrapper class to store strings.
Definition String.hpp:96
static String fromNumberRounded(T value, unsigned int decimals)
Construct the string from a floating point number, keeping only a certain amount of decimals behind t...
Definition String.hpp:329
void setSize(const Layout2d &size) override
Changes the size of the widget.
The parent class for every widget.
Definition Widget.hpp:83
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:38
SignalTyped< float > SignalFloat
Signal with one "float" as optional unbound parameter.
Definition Signal.hpp:426