1 module rx.gtk.property;
2 
3 import gtk.Widget;
4 import gtk.Label;
5 import rx;
6 
7 private void setupCore(TObservable, TObserver)(auto ref TObservable observable,
8         TObserver observer, CompositeDisposable disposeBag)
9 {
10     static assert(isObservable!TObservable);
11 
12     auto disposable = new SingleAssignmentDisposable;
13     auto subscription = observable.doSubscribe(observer, { disposable.dispose(); }, (Exception _) {
14         disposable.dispose();
15     });
16     disposable.setDisposable(subscription);
17 
18     disposeBag.insert(disposable);
19 }
20 
21 /**
22  * Sync sensitive with a `Observable!bool`
23  *
24  * Params:
25  *      widget = sync target
26  *      observable = sync source
27  *      disposeBag = register a sibscription into this
28  *
29  * Example:
30  * -----
31  * auto bag = new CompositeDisposable;
32  * auto entry = new Entry;
33  * auto button = new Button;
34  * button.setSensitiveWith(entry.changedAsObservable().map!"a.length > 5", bag);
35  * -----
36  */
37 void setSensitiveWith(TWidget, TObservable)(auto ref TWidget widget,
38         auto ref TObservable observable, CompositeDisposable disposeBag)
39 {
40     static assert(is(TWidget : Widget));
41     static assert(isObservable!(TObservable, bool));
42     setupCore(observable, &widget.setSensitive, disposeBag);
43 }
44 
45 /**
46  * Sync canFocus with a `Observable!bool`
47  *
48  * Params:
49  *      widget = sync target
50  *      observable = sync source
51  *      disposeBag = register a sibscription into this
52  *
53  * Example:
54  * -----
55  * auto bag = new CompositeDisposable;
56  * auto entry = new Entry;
57  * auto button = new Button;
58  * button.setCanFocusWith(entry.changedAsObservable().map!"a.length > 5", bag);
59  * -----
60  */
61 void setCanFocusWith(TWidget, TObservable)(auto ref TWidget widget,
62         auto ref TObservable observable, CompositeDisposable disposeBag)
63 {
64     static assert(is(TWidget : Widget));
65     static assert(isObservable!(TObservable, bool));
66     setupCore(observable, &widget.setCanFocus, disposeBag);
67 }
68 
69 /**
70  * Sync visible with a `Observable!bool`
71  *
72  * Params:
73  *      widget = sync target
74  *      observable = sync source
75  *      disposeBag = register a sibscription into this
76  *
77  * Example:
78  * -----
79  * auto bag = new CompositeDisposable;
80  * auto entry = new Entry;
81  * auto button = new Button;
82  * button.setVisibleWith(entry.changedAsObservable().map!"a.length > 5", bag);
83  * -----
84  */
85 void setVisibleWith(TWidget, TObservable)(TWidget widget,
86         auto ref TObservable observable, CompositeDisposable disposeBag)
87 {
88     static assert(is(TWidget : Widget));
89     static assert(isObservable!(TObservable, bool));
90     setupCore(observable, &widget.setVisible, disposeBag);
91 }
92 
93 /**
94  * Sync text with a `Observable!string`
95  *
96  * Params:
97  *      widget = sync target
98  *      observable = sync source
99  *      disposeBag = register a sibscription into this
100  *
101  * Example:
102  * -----
103  * auto bag = new CompositeDisposable;
104  * auto entry = new Entry;
105  * auto label = new Label;
106  * label.setTextWith(entry.changedAsObservable(), bag);
107  * -----
108  */
109 void setTextWith(TLabel, TObservable)(auto ref TLabel label,
110         auto ref TObservable observable, CompositeDisposable disposeBag)
111 {
112     static assert(is(TLabel : Label));
113     static assert(isObservable!(TObservable, string));
114     setupCore(observable, &label.setText, disposeBag);
115 }
116 
117 /**
118  * Sync visibility with a `Observable!bool`
119  *
120  * Params:
121  *      widget = sync target
122  *      observable = sync source
123  *      disposeBag = register a sibscription into this
124  *
125  * Example:
126  * -----
127  * auto bag = new CompositeDisposable;
128  * auto check = new CheckButton;
129  * auto entry = new Entry;
130  * entry.setVisibilityWith(check.toggleedAsObservable(), bag);
131  * -----
132  */
133 void setVisibilityWith(TWidget, TObservable)(TWidget widget,
134         auto ref TObservable observable, CompositeDisposable disposeBag)
135 {
136     static assert(is(TWidget : Widget));
137     static assert(isObservable!(TObservable, bool));
138     setupCore(observable, &widget.setVisibility, disposeBag);
139 }