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 }