]> git.tdb.fi Git - libs/gltk.git/blob - source/toggle.cpp
Support exclusive Toggles for implementing option buttons
[libs/gltk.git] / source / toggle.cpp
1 /* $Id$
2
3 This file is part of libmspgltk
4 Copyright © 2007  Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #include "panel.h"
9 #include "part.h"
10 #include "toggle.h"
11
12 using namespace std;
13
14 namespace Msp {
15 namespace GLtk {
16
17 Toggle::Toggle(const Resources &r):
18         Widget(r),
19         pressed(false),
20         value(false),
21         exclusive(false)
22 {
23         update_style();
24 }
25
26 void Toggle::set_text(const string &t)
27 {
28         text=t;
29 }
30
31 void Toggle::set_exclusive(bool e)
32 {
33         exclusive=e;
34         if(exclusive && value)
35                 exclude_siblings();
36 }
37
38 void Toggle::set_value(bool v)
39 {
40         value=v;
41         if(value)
42         {
43                 state|=ACTIVE;
44                 if(exclusive && parent)
45                         exclude_siblings();
46         }
47         else
48                 state&=~ACTIVE;
49 }
50
51 void Toggle::button_press(int, int, unsigned btn)
52 {
53         if(btn==1)
54                 pressed=true;
55 }
56
57 void Toggle::button_release(int x, int y, unsigned btn)
58 {
59         if(pressed && btn==1)
60         {
61                 if(geom.is_inside_relative(x, y))
62                 {
63                         set_value(!value);
64                         signal_toggled.emit(value);
65                 }
66
67                 pressed=false;
68         }
69 }
70
71 void Toggle::render_special(const Part &part) const
72 {
73         if(part.get_name()=="text")
74                 render_text(part, text);
75 }
76
77 void Toggle::exclude_siblings()
78 {
79         const list<Widget *> &siblings=parent->get_children();
80         for(list<Widget *>::const_iterator i=siblings.begin(); i!=siblings.end(); ++i)
81                 if(Toggle *tgl=dynamic_cast<Toggle *>(*i))
82                         if(tgl!=this && tgl->get_exclusive() && tgl->get_value())
83                                 tgl->set_value(false);
84 }
85
86
87 Toggle::Loader::Loader(Toggle &t):
88         Widget::Loader(t)
89 {
90         add("exclusive", &Toggle::exclusive);
91         add("text",      &Toggle::text);
92         add("value",     &Toggle::value);
93 }
94
95 Toggle &Toggle::Loader::get_object() const
96 {
97         return static_cast<Toggle &>(wdg);
98 }
99
100 void Toggle::Loader::finish()
101 {
102         Toggle &tgl=static_cast<Toggle &>(wdg);
103         if(tgl.value)
104                 tgl.state|=ACTIVE;
105         else
106                 tgl.state&=~ACTIVE;
107 }
108
109 } // namespace GLtk
110 } // namespace Msp