8 #ifndef Guit_Notifier_hpp
9 #define Guit_Notifier_hpp
10 #include <gvarprop.hpp>
14 class GNotifier :
public GProp {
16 GNotifier* toNotifier()
override {
return this;}
17 GString stringValue()
const override;
18 bool isEquivalent(
const GProp&)
const override {
return false;}
19 virtual void* receiver() = 0;
21 static GPropType& Type();
22 GPropType& type()
const override {
return Type();}
27 class GChangeNotifier :
public GNotifier {
29 void fire(GEvent&)
override {doSet();}
30 virtual void* sender() = 0;
31 virtual GVarProp* receiverAsProp() = 0;
32 virtual void doSet() = 0;
33 virtual bool doTest() = 0;
34 bool recv_is_master_{};
39 template <
class S,
class R>
40 class GChangePropNotifier :
public GChangeNotifier {
42 GChangePropNotifier(S& sender, R& recv): sender_(sender), recv_(recv) {}
44 void* sender()
override {
return &sender_;}
45 void* receiver()
override {
return &recv_;}
46 GVarProp* receiverAsProp()
override {
return &recv_;}
47 void onRemove(Gadget*)
override {recv_.removeNotifiers(&sender_);}
49 void doSet()
override {
50 if (recv_.changing())
return;
52 typename R::ValueType newval{};
53 gconvert(sender_.value(), newval);
55 if (recv_.doChange(newval)) recv_.fireDefaultCallbacks();
59 bool doTest()
override {
60 typename R::ValueType newval{};
61 return gconvert(sender_.value(), newval) && recv_.isValid(newval);
69 template <
class S,
class SF,
class R,
class RF>
70 class GChangeFieldNotifier :
public GChangeNotifier {
72 GChangeFieldNotifier(GPropField<S,SF>
const& sender, GPropField<R,RF>
const& recv):
73 sender_(sender), recv_(recv) {}
75 void* sender()
override {
return &sender_;}
76 void* receiver()
override {
return &(recv_.prop_);}
77 GVarProp* receiverAsProp()
override {
return &(recv_.prop_);;}
78 void onRemove(Gadget*)
override {recv_.prop_.removeNotifiers(&(sender_.prop_));}
80 void doSet()
override {
81 if (recv_.prop_.changing())
return;
82 recv_.prop_.changing(1);
83 auto oldfield = recv_.field_;
84 gconvert(sender_.field_, recv_.field_);
85 auto newval = recv_.prop_.value();
86 recv_.field_ = oldfield;
87 if (recv_.prop_.doChange(newval)) recv_.prop_.fireDefaultCallbacks();
88 recv_.prop_.changing(0);
91 bool doTest()
override{
92 auto oldfield = recv_.field_;
93 if (!gconvert(sender_.field_, recv_.field_)) {
94 recv_.field_ = oldfield;
97 auto newval = recv_.prop_.value();
98 recv_.field_ = oldfield;
99 return recv_.prop_.isValid(newval);
102 GPropField<S,SF> sender_;
103 GPropField<R,RF> recv_;
107 class GExprNotifier :
public GNotifier {
109 GExprNotifier(
class GExprWrapper& wrap) : wrap(wrap) {}
110 void* receiver()
override {
return &wrap;}
111 void fire(GEvent&)
override;
112 class GExprWrapper& wrap;
116 class GTriggerNotifier :
public GNotifier {
118 GTriggerNotifier(GObject& sender,
class GExprTrigger& receiver);
119 void* receiver()
override {
return &recv_;}
120 class GExprTrigger& trigger() {
return recv_;}
121 void fire(GEvent& e)
override;
122 void onRemove(Gadget* g)
override;
125 class GExprTrigger& recv_;
129 class GTriggerExprNotifier :
public GTriggerNotifier {
131 GTriggerExprNotifier(GObject& sender, GExprTrigger& receiver, GBoolExpr& expr);
132 void fire(GEvent&)
override;