Changeset 30

Show
Ignore:
Timestamp:
12/02/06 22:53:16 (2 years ago)
Author:
baxissimo
Message:

Added toggle behavior to Button.
Made RadioButton? and Checkbox both lightweight subclasses of Button.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/luigi/example1.d

    r29 r30  
    9393            g.add_widget(new Button("Pal")); 
    9494            auto b1 = g.add_widget(new Button("Hide West")); 
    95  
     95            b1.is_toggle = true; 
    9696            b0.disable(); 
    9797            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            }; 
    98104        } 
    99105 
  • trunk/luigi/gui.d

    r29 r30  
    639639    override void draw() { 
    640640        if (!shown) return; 
    641         arrange(); 
     641        _lazy_arrange(); 
    642642        // draw self, draw children 
    643643 
     
    666666    } 
    667667 
    668     override void arrange() { 
     668    void _lazy_arrange() { 
    669669        if (m_needArrange && arranger) { 
    670670            arranger.arrange(); 
    671671            _updateChildOrder(); 
    672         } 
    673         m_needArrange = false; 
     672            m_needArrange = false; 
     673        } 
     674    } 
     675 
     676    override void arrange() { 
     677        m_needArrange = true; 
    674678    } 
    675679 
     
    11931197} 
    11941198 
    1195 /** A classic Button widget */ 
    1196 class Button : Widget 
     1199/** A classic Button widget, with optional toggle button behavior. */ 
     1200class Button : Widget, Valuator 
    11971201{ 
    11981202    mixin WidgetMixin; 
     
    12061210            { 
    12071211                clicked.emit(this); 
     1212                if (m_isToggle) { checked = !checked; } 
    12081213                return; 
    12091214            } 
     
    12241229            if (is_grabbing_mouse()) {release_mouse();} 
    12251230            if (m_depressed) clicked.emit(this); 
     1231            if (m_depressed && m_isToggle) checked = !checked; 
    12261232            m_depressed = false; 
    12271233        } 
     
    12441250        label=label_; 
    12451251        clicked = new ClickedSignal; 
     1252        value_changed = new ValueChangedSignal; 
    12461253    } 
    12471254 
    12481255    bool depressed() { return m_depressed; } 
    12491256 
     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 
    12501274    char[] label; 
    12511275 
    12521276    alias FlexSignal!(Widget) ClickedSignal; 
     1277    alias FlexSignal!(Widget, bool) ValueChangedSignal; 
    12531278    ClickedSignal clicked; 
     1279    ValueChangedSignal value_changed; 
    12541280    //mixin Signal!(Widget) clicked; 
    12551281 
    12561282protected: 
    12571283    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. */ 
     1289class Checkbox : Button 
    12611290{ 
    12621291    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    } 
    13321297} 
    13331298 
     
    16731638} 
    16741639 
    1675 class RadioButton : Widget, Valuator 
     1640/** A radio button is just a Button with an alternate appearance  
     1641    determined by the theme. 
     1642 */ 
     1643class RadioButton : Button 
    16761644{ 
    16771645    mixin WidgetMixin; 
     1646 
     1647    this(char[] label_) { 
     1648        super(label_); 
     1649        is_toggle = true; 
     1650    } 
     1651} 
     1652 
     1653class RadioGroup : Panel, Valuator 
     1654{ 
     1655    mixin WidgetMixin; 
     1656    mixin PanelMixin; 
    16781657 
    16791658    this(char[] label_) { 
     
    16811660        label = label_; 
    16821661    } 
    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, Valuator 
    1692 { 
    1693     mixin WidgetMixin; 
    1694     mixin PanelMixin; 
    1695  
    1696     this(char[] label_) { 
    1697         super(); 
    1698         label = label_; 
    1699     } 
    17001662 
    17011663    override double value(double v) {  
  • trunk/luigi/themes/dxut.d

    r26 r30  
    309309            WidgetState iState = WidgetState.Normal; 
    310310            float blendRate = 0.8f; 
     311            bool chk = is_toggle && checked; 
    311312            if( !shown ) { 
    312313                iState = WidgetState.Hidden;  
     
    318319            { 
    319320                iState = WidgetState.Depressed; 
    320                 dx = dy = 1; 
    321                 blendRate = 0; 
     321                blendRate = 0.6; 
    322322            } 
    323323            else if( rollover ) 
    324324            { 
    325325                iState = WidgetState.Rollover; 
    326                 dx = dy = -1; 
    327326            } 
    328327            else if( focused ) 
    329328            { 
    330329                iState = WidgetState.Focus; 
     330            } 
     331 
     332            if ( depressed ^ chk ) { 
     333                dx = dy = 1; 
     334            } 
     335            if ( rollover ) { 
     336                dx -= 1; dy -= 1; 
    331337            } 
    332338