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 }