8 #ifndef Guit_Number_hpp
9 #define Guit_Number_hpp
11 #include <gvarprop.hpp>
14 class GNumber :
public GVarProp {
16 using IsNumber = bool;
18 bool isNumber()
const override {
return true;}
19 GNumber* toNumber()
override {
return this;}
21 virtual void setF(
float value,
bool callalways =
false) = 0;
22 void set(GString
const& value)
override = 0;
23 void set(GProp
const& value)
override = 0;
25 virtual void increaseF(
float value) = 0;
26 virtual void increase() = 0;
27 virtual void decrease() = 0;
29 void blend(GProp
const& a, GProp
const& b,
float mix)
override;
33 virtual GNumber& setRangeF(
float min,
float max) = 0;
34 virtual float minF()
const = 0;
35 virtual float maxF()
const = 0;
40 virtual double normedValue()
const = 0;
44 virtual float lowestF()
const = 0;
45 virtual float highestF()
const = 0;
48 void updateGadget(Gadget&)
override;
56 template <
class T>
class GNumber_ :
public GNumber {
62 T
const& value()
const {
return value_;}
63 T
const& operator()()
const {
return value_;}
64 operator T
const&()
const {
return value_;}
69 bool boolValue()
const override {
return bool(value_);}
70 float floatValue()
const override {
return float(value_);}
71 GString stringValue()
const override {
return guit::toString(value_);}
74 void setF(
float value,
bool callalways =
false)
override {
75 set(static_cast<T>(value), callalways);
78 virtual void set(T
const& value,
bool callalways =
false) {
79 if (omodes_.immutable) immutableError(
"set");
80 else if (doChange(value) || callalways) propagateChange();
83 void set(GString
const& value)
override {
84 T val{}; gconvert(value, val); set(val,
false);
87 void set(GProp
const& prop)
override {
88 set(static_cast<T>(prop.floatValue()),
false);
91 GNumber_<T>& setRangeF(
float min,
float max)
override {
92 return setRange(static_cast<T>(min), static_cast<T>(max));
95 GNumber_<T>& setRange(T
const& min, T
const& max) {
103 using GNumber::increase;
104 void increaseF(
float delta)
override {increase(static_cast<T>(delta));}
105 virtual void increase(T
const& delta) {set(value_ + delta);}
107 double normedValue()
const override {
108 return (max_ == min_) ? 0. : (double)(value_ - min_) / (max_ - min_);
113 T min()
const {
return min_;}
114 T max()
const {
return max_;}
115 float minF()
const override {
return float(min_);}
116 float maxF()
const override {
return float(max_);}
121 static T lowest() {
return std::numeric_limits<T>::lowest();}
122 static T highest() {
return std::numeric_limits<T>::max();}
123 float lowestF()
const override {
return float(lowest());}
124 float highestF()
const override {
return float(highest());}
129 virtual bool isValid(T
const& val)
const {
130 return (val >= min_ && val <= max_);
133 virtual bool doChange(T
const& v) {
134 if (v != value_ || !pmodes_.isSet) {
136 if (v > max_) value_ = max_;
137 else if (v < min_) value_ = min_;