1 module mvvm.util;
2 
3 import std.range : put;
4 
5 import gobject.Signals;
6 
7 import gtk.Button;
8 import gtk.Entry;
9 import gtk.Label;
10 
11 import rx;
12 
13 Entry toBindedEntry(Subject!string source, CompositeDisposable bag)
14 {
15     auto entry = new Entry;
16     auto handleId = entry.addOnChanged(_ => .put(source, entry.getText()));
17     bag.insert(new AnonymousDisposable({
18             Signals.handlerDisconnect(entry, handleId);
19         }));
20     bag.insert(source.doSubscribe((string text) { entry.setText(text); }));
21     return entry;
22 }
23 
24 Label toBindedLabel(TObservable)(auto ref TObservable source, CompositeDisposable bag)
25 {
26     import std.conv;
27 
28     auto label = new Label("");
29     bag.insert(source.doSubscribe((TObservable.ElementType obj) {
30             label.setText(obj.to!string);
31         }));
32     return label;
33 }
34 
35 Button makeBindedButton(string text, void delegate() onClick, Observable!bool sensitiveSource, CompositeDisposable disposeBag)
36 in
37 {
38     const hasSensitiveSource = sensitiveSource is null;
39     const hasDisposeBag = disposeBag is null;
40     assert(hasSensitiveSource == hasDisposeBag);
41 }
42 do
43 {
44     auto button = new Button(text);
45     button.addOnClicked((Button _) { onClick(); });
46     if (sensitiveSource !is null)
47     {
48         disposeBag.insert(sensitiveSource.doSubscribe(&button.setSensitive));
49     }
50     return button;
51 }
52 
53 Button makeBindedButton(string text, void delegate() onClick)
54 {
55     return makeBindedButton(text, onClick, null, null);
56 }