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 }