Changeset 30
- Timestamp:
- 12/02/06 22:53:16 (2 years ago)
- Files:
-
- trunk/luigi/example1.d (modified) (1 diff)
- trunk/luigi/gui.d (modified) (8 diffs)
- trunk/luigi/themes/dxut.d (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/luigi/example1.d
r29 r30 93 93 g.add_widget(new Button("Pal")); 94 94 auto b1 = g.add_widget(new Button("Hide West")); 95 95 b1.is_toggle = true; 96 96 b0.disable(); 97 97 b1.clicked.connect( &westGroup.toggle_shown ); 98 b1.value_changed ~= (Widget w, bool v){ 99 Button b = cast(Button)w; assert(b); 100 if (v) b.label = "Show West"; 101 else b.label = "Hide West"; 102 b.get_root.arrange(); 103 }; 98 104 } 99 105 trunk/luigi/gui.d
r29 r30 639 639 override void draw() { 640 640 if (!shown) return; 641 arrange();641 _lazy_arrange(); 642 642 // draw self, draw children 643 643 … … 666 666 } 667 667 668 override voidarrange() {668 void _lazy_arrange() { 669 669 if (m_needArrange && arranger) { 670 670 arranger.arrange(); 671 671 _updateChildOrder(); 672 } 673 m_needArrange = false; 672 m_needArrange = false; 673 } 674 } 675 676 override void arrange() { 677 m_needArrange = true; 674 678 } 675 679 … … 1193 1197 } 1194 1198 1195 /** A classic Button widget */1196 class Button : Widget 1199 /** A classic Button widget, with optional toggle button behavior. */ 1200 class Button : Widget, Valuator 1197 1201 { 1198 1202 mixin WidgetMixin; … … 1206 1210 { 1207 1211 clicked.emit(this); 1212 if (m_isToggle) { checked = !checked; } 1208 1213 return; 1209 1214 } … … 1224 1229 if (is_grabbing_mouse()) {release_mouse();} 1225 1230 if (m_depressed) clicked.emit(this); 1231 if (m_depressed && m_isToggle) checked = !checked; 1226 1232 m_depressed = false; 1227 1233 } … … 1244 1250 label=label_; 1245 1251 clicked = new ClickedSignal; 1252 value_changed = new ValueChangedSignal; 1246 1253 } 1247 1254 1248 1255 bool depressed() { return m_depressed; } 1249 1256 1257 override double value(double v) { 1258 checked = (v!=0); 1259 return m_checked; 1260 } 1261 override double value() { return m_checked; } 1262 1263 bool checked(bool v) { 1264 if (v==m_checked) { return m_checked; } 1265 m_checked = v; 1266 value_changed.emit(this, m_checked); 1267 return m_checked; 1268 } 1269 bool checked() { return m_checked; } 1270 1271 bool is_toggle(bool v) { return m_isToggle = v; } 1272 bool is_toggle() { return m_isToggle; } 1273 1250 1274 char[] label; 1251 1275 1252 1276 alias FlexSignal!(Widget) ClickedSignal; 1277 alias FlexSignal!(Widget, bool) ValueChangedSignal; 1253 1278 ClickedSignal clicked; 1279 ValueChangedSignal value_changed; 1254 1280 //mixin Signal!(Widget) clicked; 1255 1281 1256 1282 protected: 1257 1283 bool m_depressed = false; 1258 } 1259 1260 class Checkbox : Widget, Valuator 1284 bool m_isToggle = false; 1285 bool m_checked = false; 1286 } 1287 1288 /** A checkbox is just a toggle button with an alternate theme-defined look. */ 1289 class Checkbox : Button 1261 1290 { 1262 1291 mixin WidgetMixin; 1263 1264 override double value(double v) { return m_checked=(v!=0); } 1265 override double value() { return m_checked; } 1266 bool checked(bool v) { return m_checked=v; } 1267 bool checked() { return m_checked; } 1268 1269 override void on_key(KeyEvent ev) 1270 { 1271 if (ev.is_press) { 1272 if (ev.key == Key.Space || 1273 ev.key == Key.Enter || 1274 ev.key == Key.KP_Enter) 1275 { 1276 m_checked = !m_checked; 1277 value_changed.emit(this,m_checked); 1278 return; 1279 } 1280 } 1281 ev.alive = true; 1282 } 1283 1284 override void on_mouse_button(MouseButtonEvent ev) 1285 { 1286 if (disabled) { ev.alive=true; return; } 1287 1288 alias MouseButtons b; 1289 if (ev.is_press && ev.button == b.Left) { 1290 grab_mouse(); 1291 m_depressed = true; 1292 } 1293 else if (ev.is_release && ev.button == b.Left) { 1294 if (is_grabbing_mouse()) {release_mouse();} 1295 if (m_depressed) { 1296 m_checked = !m_checked; 1297 value_changed.emit(this,m_checked); 1298 } 1299 m_depressed = false; 1300 } 1301 } 1302 1303 override void on_mouse_move(MouseMoveEvent ev) 1304 { 1305 if (disabled) { ev.alive=true; return; } 1306 1307 if (is_grabbing_mouse()) 1308 { 1309 m_depressed = rect.contains(ev.p); 1310 } 1311 ev.alive = true; 1312 } 1313 1314 bool depressed() { return m_depressed; } 1315 1316 1317 this(char[] label_, bool checked = false) { 1318 super(); 1319 label = label_; 1320 m_checked = checked; 1321 value_changed = new ValueChangedSignal; 1322 } 1323 1324 alias FlexSignal!(Widget, bool) ValueChangedSignal; 1325 ValueChangedSignal value_changed; 1326 // mixin Signal!(Widget, bool) value_changed; 1327 1328 char[] label; 1329 private: 1330 bool m_checked = false; 1331 bool m_depressed = false; 1292 this(char[] label_, bool checked_ = false) { 1293 super(label_); 1294 is_toggle = true; 1295 checked = checked_; 1296 } 1332 1297 } 1333 1298 … … 1673 1638 } 1674 1639 1675 class RadioButton : Widget, Valuator 1640 /** A radio button is just a Button with an alternate appearance 1641 determined by the theme. 1642 */ 1643 class RadioButton : Button 1676 1644 { 1677 1645 mixin WidgetMixin; 1646 1647 this(char[] label_) { 1648 super(label_); 1649 is_toggle = true; 1650 } 1651 } 1652 1653 class RadioGroup : Panel, Valuator 1654 { 1655 mixin WidgetMixin; 1656 mixin PanelMixin; 1678 1657 1679 1658 this(char[] label_) { … … 1681 1660 label = label_; 1682 1661 } 1683 override double value(double v) { return m_checked=(v!=0); }1684 override double value() { return m_checked; }1685 1686 char[] label;1687 private:1688 bool m_checked = false;1689 }1690 1691 class RadioGroup : Panel, Valuator1692 {1693 mixin WidgetMixin;1694 mixin PanelMixin;1695 1696 this(char[] label_) {1697 super();1698 label = label_;1699 }1700 1662 1701 1663 override double value(double v) { trunk/luigi/themes/dxut.d
r26 r30 309 309 WidgetState iState = WidgetState.Normal; 310 310 float blendRate = 0.8f; 311 bool chk = is_toggle && checked; 311 312 if( !shown ) { 312 313 iState = WidgetState.Hidden; … … 318 319 { 319 320 iState = WidgetState.Depressed; 320 dx = dy = 1; 321 blendRate = 0; 321 blendRate = 0.6; 322 322 } 323 323 else if( rollover ) 324 324 { 325 325 iState = WidgetState.Rollover; 326 dx = dy = -1;327 326 } 328 327 else if( focused ) 329 328 { 330 329 iState = WidgetState.Focus; 330 } 331 332 if ( depressed ^ chk ) { 333 dx = dy = 1; 334 } 335 if ( rollover ) { 336 dx -= 1; dy -= 1; 331 337 } 332 338
