1 ///
2 module rx.gtk.conv;
3 
4 import rx;
5 import gtk.Entry;
6 import gtk.ToggleButton;
7 import gobject.Signals;
8 import std.range : put;
9 
10 /**
11  * Convert `addOnChanged` to a `Observable!string`.
12  *
13  * Params:
14  *     entry = event source
15  *     putInitialState = put a initial state to observer on subscribe
16  *
17  * Example:
18  * -----
19  * auto bag = new CompositeDisposable;
20  * auto entry = new Entry;
21  * auto label = new Label;
22  * label.setTextWith(entry.changedAsObservable(), bag);
23  * -----
24  */
25 Observable!string changedAsObservable(Entry entry, bool putInitialState = true)
26 {
27     return defer!string((Observer!string observer) {
28         auto disposable = new SingleAssignmentDisposable;
29 
30         auto changedHandle = entry.addOnChanged((_) {
31             .put(observer, entry.getText());
32         });
33         auto destroyHandle = entry.addOnDestroy((_) {
34             observer.completed();
35             disposable.dispose();
36         });
37 
38         auto disconnect = new AnonymousDisposable({
39             Signals.handlerDisconnect(entry, changedHandle);
40             Signals.handlerDisconnect(entry, destroyHandle);
41         });
42         disposable.setDisposable(disconnect);
43 
44         if (putInitialState)
45             .put(observer, entry.getText());
46 
47         return disposable;
48     }).observableObject!string();
49 }
50 
51 /**
52  * Convert 'addOnToggled' to a `Observable!bool`.
53  *
54  * Params:
55  *     button = event source
56  *     putInitialState = put a initial state to observer on subscribe
57  *
58  * Example:
59  * -----
60  * auto bag = new CompositeDisposable;
61  * auto checkButton = new CheckButton;
62  * auto entry = new Entry;
63  * entry.setSensitiveWith(checkButton.toggledAsObservable(), bag);
64  * -----
65  */
66 Observable!bool toggledAsObservable(ToggleButton button, bool putInitialState = true)
67 {
68     return defer!bool((Observer!bool observer) {
69         auto disposable = new SingleAssignmentDisposable;
70 
71         auto toggledHandle = button.addOnToggled((_) {
72             .put(observer, button.getActive());
73         });
74         auto destroyHandle = button.addOnDestroy((_) {
75             observer.completed();
76             disposable.dispose();
77         });
78 
79         auto disconnect = new AnonymousDisposable({
80             Signals.handlerDisconnect(button, toggledHandle);
81             Signals.handlerDisconnect(button, destroyHandle);
82         });
83         disposable.setDisposable(disconnect);
84 
85         if (putInitialState)
86             .put(observer, button.getActive());
87 
88         return disposable;
89     }).observableObject!bool();
90 }