guit  0.1
 All Classes Functions Variables Typedefs Enumerations Friends
gnumber.hpp
1 //
2 // Number Props.
3 // Guit GUI Toolkit
4 // Copyright © 2019/2020 Eric Lecolinet. All rights reserved.
5 // http://www.telecom-paris.fr/~elc
6 //
7 
8 #ifndef Guit_Number_hpp
9 #define Guit_Number_hpp
10 #include <limits>
11 #include <gvarprop.hpp>
12 namespace guit {
13 
14 class GNumber : public GVarProp {
15 public:
16  using IsNumber = bool;
17 
18  bool isNumber() const override {return true;}
19  GNumber* toNumber() override {return this;}
20 
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;
24 
25  virtual void increaseF(float value) = 0;
26  virtual void increase() = 0;
27  virtual void decrease() = 0;
28 
29  void blend(GProp const& a, GProp const& b, float mix) override;
30 
33  virtual GNumber& setRangeF(float min, float max) = 0;
34  virtual float minF() const = 0;
35  virtual float maxF() const = 0;
37 
40  virtual double normedValue() const = 0;
41 
44  virtual float lowestF() const = 0;
45  virtual float highestF() const = 0;
47 
48  void updateGadget(Gadget&) override;
49 
50 protected:
51  GNumber() = default;
52 };
53 
54 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
55 
56 template <class T> class GNumber_ : public GNumber {
57 public:
58  using ValueType = T;
59 
62  T const& value() const {return value_;}
63  T const& operator()() const {return value_;}
64  operator T const&() const {return value_;}
66 
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_);}
73 
74  void setF(float value, bool callalways = false) override {
75  set(static_cast<T>(value), callalways);
76  }
77 
78  virtual void set(T const& value, bool callalways = false) {
79  if (omodes_.immutable) immutableError("set");
80  else if (doChange(value) || callalways) propagateChange();
81  }
82 
83  void set(GString const& value) override {
84  T val{}; gconvert(value, val); set(val, false);
85  }
86 
87  void set(GProp const& prop) override {
88  set(static_cast<T>(prop.floatValue()), false);
89  }
90 
91  GNumber_<T>& setRangeF(float min, float max) override {
92  return setRange(static_cast<T>(min), static_cast<T>(max));
93  }
94 
95  GNumber_<T>& setRange(T const& min, T const& max) {
96  //if (max < min) max = min;
97  min_ = min;
98  max_ = max;
99  set(value_,false); // pas bon car value_ == value_ donc fait rien !!
100  return *this;
101  }
102 
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);}
106 
107  double normedValue() const override {
108  return (max_ == min_) ? 0. : (double)(value_ - min_) / (max_ - min_);
109  }
110 
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_);}
118 
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());}
126 
129  virtual bool isValid(T const& val) const {
130  return (val >= min_ && val <= max_);
131  }
132 
133  virtual bool doChange(T const& v) {
134  if (v != value_ || !pmodes_.isSet) {
135  pmodes_.isSet = 1;
136  if (v > max_) value_ = max_;
137  else if (v < min_) value_ = min_;
138  else value_ = v;
139  return true;
140  }
141  else return false;
142  }
143 
144  T value_{};
145  T min_{lowest()};
146  T max_{highest()};
148 };
149 
150 }
151 #endif