guit  0.1
 All Classes Functions Variables Typedefs Enumerations Friends
gwrapper.hpp
1 //
2 // implementation: wrappers
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_PropWrapper_hpp
9 #define Guit_PropWrapper_hpp
10 #include <gprop.hpp>
11 #include <gtrigger.hpp>
12 namespace guit {
13 
14 class GPropWrapper : public GProp {
15 public:
16  GPropWrapper(GProp& p) : prop_(p) {}
17  GPropWrapper* toPropWrapper() override {return this;}
18  GProp* prop() {return prop_;}
19  // either stringValue() or floatValue() MUST be redefined in subclasses!
20  GString stringValue() const override;
21  float floatValue() const override;
22  gptr<GProp> prop_;
23 };
24 
25 template <class T, class F>
26 class GFieldWrapper : public GPropWrapper {
27  F& field_;
28 public:
29  GFieldWrapper(T& prop, F& field) : GPropWrapper(prop), field_(field) {}
30  GString stringValue() const override {return *field_;}
31 };
32 
33 template <class T, class F>
34 class GNumFieldWrapper : public GPropWrapper {
35  F& field_;
36 public:
37  GNumFieldWrapper(T& prop, F& field) : GPropWrapper(prop), field_(field) {}
38  float floatValue() const override {return field_;}
39 };
40 
41 template <class T>
42 class GVectorWrapper : public GPropWrapper {
43  std::vector<T>& vect_;
44 public:
45  GVectorWrapper(GProp& index, std::vector<T>& v) : GPropWrapper(index), vect_(v) {}
46  GString stringValue() const override {return vect_.at(int(prop_->floatValue()));}
47 };
48 
49 template <class T>
50 class GNumVectorWrapper : public GPropWrapper {
51  std::vector<T>& vect_;
52 public:
53  GNumVectorWrapper(GProp& index, std::vector<T>& v) : GPropWrapper(index), vect_(v) {}
54  float floatValue() const override {return vect_.at(int(prop_->floatValue()));}
55 };
56 
57 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
58 
59 template <class P, class F>
60 GPropRef GPropField<P,F>::operator~() {
61  return GPropRef(*new GFieldWrapper<P,F>(this->prop_, this->field_));
62 }
63 
64 template <class P, class F>
65 GNumPropRef GNumPropField<P,F>::operator~() {
66  return GNumPropRef(*new GNumFieldWrapper<P,F>(this->prop_, this->field_));
67 }
68 
69 class GExprWrapper : public GProp {
70 public:
71  GExprWrapper(GExpr&);
72  GExprWrapper* toExprWrapper() override {return this;}
73 
74  static GPropType& Type();
75  GPropType& type() const override {return Type();}
76 
77  bool bindWith(GVarProp&);
78  float floatValue() const override;
79  GString stringValue() const override;
80 
81  bool isEquivalent(const GProp& other) const override {return false;}
82 
83  void onRemove(Gadget*) override;
84  void removeNotifiers(void* obj) override;
85 
86  enum Type {TNone, TBool, TNum, TString, TText} type_{};
87  gptr<GExpr> expr_;
88  gptr<class GExprNotifier> notifier_;
89  GVarProp* model_{};
90 };
91 
92 }
93 #endif