guit  0.1
 All Classes Functions Variables Typedefs Enumerations Friends
gtrigger.hpp
1 //
2 // Triggers
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_Trigger_hpp
9 #define Guit_Trigger_hpp
10 #include <forward_list>
11 #include <gcond.hpp>
12 namespace guit {
13 
16 class GTrigger {
17 public:
18  static GTrigger
22  action,
24  done,
26  change,
28  changing,
30  checked,
32  unchecked,
34  click,
36  dblclick,
39  mousedown,
42  mouseup,
45  mousedrag,
49  mousemove,
52  mouseover,
55  mouseout,
59  wheel,
62  keydown,
65  keyup,
68  keytype,
71  caret,
74  touch,
77  gesture,
79  focus,
81  focusout,
83  enabled,
85  disabled,
87  show,
89  hide,
91  move,
93  init,
95  resize,
97  paint,
99  add,
101  remove,
103  copy,
105  cut,
107  paste,
109  user,
111  changeaction;
112 
113  using Filter = int32_t;
114 
115  virtual ~GTrigger() = default;
116 
119  GTrigger(GEventType mask, Filter filter) : mask_(mask), filter_(filter) {}
120 
122  GTrigger(GTrigger const& from) : mask_(from.mask_), filter_(from.filter_) {}
123 
125  GEventType eventMask() const {return mask_;}
126 
128  Filter filter() const {return filter_;}
129 
131  virtual bool operator==(GTrigger const& other) const;
132 
134  class GGuard& operator[](GExprBool const& guard_expr);
135 
136  static GTrigger* getTrigger(GString const& trigger_name);
137 
140  virtual bool isEventTrigger() const {return true;}
141  virtual class GExprTrigger* toExprTrigger() {return nullptr;}
142  virtual const class GExprTrigger* toExprTrigger() const {return nullptr;}
143 
144  virtual void receiverAdded(Gadget&, GCond&);
145  virtual void receiverRemoved();
146  virtual void receiverDeleted() {}
147 
148  static GEvent* curevent_;
149  GEventType mask_{};
150  Filter filter_{};
151 
152 protected:
153  GTrigger() = default;
155 };
156 
158 using on = GTrigger;
159 
160 
161 // Trigger that depends on an active expression, a state or a model.
162 class GExprTrigger : public GTrigger {
163 public:
164  ~GExprTrigger();
165 
166  // creates a trigger that is fired when the value of the expr becomes true
167  GExprTrigger(class GBoolExpr&);
168 
169  bool operator==(GTrigger const& other) const override;
170 
171  bool isEventTrigger() const override {return false;}
172  GExprTrigger* toExprTrigger() override {return this;}
173  const GExprTrigger* toExprTrigger() const override {return this;}
174 
175  void fire(GObject& sender, bool active);
176  GNotifier* notifier() const {return notifier_;}
177  void setNotifier(GNotifier*);
178  void addSender(GObject& sender);
179  void senderRemoved(GObject&);
180  void receiverAdded(Gadget&, GCond&) override;
181  void receiverRemoved() override;
182  void receiverDeleted() override;
183  Gadget* receiver() {return recv_;}
184 
185 protected:
186  friend class GEvent;
187  std::forward_list<GObject*> senders_;
188  Gadget* recv_{};
189  GNotifier* notifier_{};
190  GCond* firedprop_{};
191  gptr<GBoolExpr> boolexpr_;
192  bool deleting_{}, invalid_{};
193 };
194 
195 }
196 #endif