]> git.tdb.fi Git - libs/gltk.git/blob - source/toggle.cpp
Store the Resources reference only in Root widget
[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 string &t):
18         text(),
19         pressed(false),
20         value(false),
21         exclusive(false)
22 {
23         set_text(t);
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) && (!value || !exclusive))
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                 text.render(part, geom);
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 void Toggle::on_style_change()
87 {
88         text.set_style(style);
89 }
90
91
92 Toggle::Loader::Loader(Toggle &t):
93         Widget::Loader(t)
94 {
95         add("exclusive", &Toggle::exclusive);
96         add("text",      &Loader::text);
97         add("value",     &Toggle::value);
98 }
99
100 Toggle &Toggle::Loader::get_object() const
101 {
102         return static_cast<Toggle &>(wdg);
103 }
104
105 void Toggle::Loader::finish()
106 {
107         Toggle &tgl = static_cast<Toggle &>(wdg);
108         if(tgl.value)
109                 tgl.state |= ACTIVE;
110         else
111                 tgl.state &= ~ACTIVE;
112 }
113
114 void Toggle::Loader::text(const string &t)
115 {
116         static_cast<Toggle &>(wdg).text = t;
117 }
118
119 } // namespace GLtk
120 } // namespace Msp