]> git.tdb.fi Git - libs/gltk.git/blob - source/toggle.cpp
Loader improvements
[libs/gltk.git] / source / toggle.cpp
1 /* $Id$
2
3 This file is part of libmspgltk
4 Copyright © 2007-2011  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::exclude_siblings()
39 {
40         const list<Widget *> &siblings = parent->get_children();
41         for(list<Widget *>::const_iterator i=siblings.begin(); i!=siblings.end(); ++i)
42                 if(Toggle *tgl = dynamic_cast<Toggle *>(*i))
43                         if(tgl!=this && tgl->get_exclusive() && tgl->get_value())
44                                 tgl->set_value(false);
45 }
46
47 void Toggle::set_value(bool v)
48 {
49         value = v;
50         if(value)
51         {
52                 state |= ACTIVE;
53                 if(exclusive && parent)
54                         exclude_siblings();
55         }
56         else
57                 state &= ~ACTIVE;
58 }
59
60 void Toggle::render_special(const Part &part) const
61 {
62         if(part.get_name()=="text")
63                 text.render(part, geom);
64 }
65
66 void Toggle::button_press(int, int, unsigned btn)
67 {
68         if(btn==1)
69                 pressed = true;
70 }
71
72 void Toggle::button_release(int x, int y, unsigned btn)
73 {
74         if(pressed && btn==1)
75         {
76                 if(geom.is_inside_relative(x, y) && (!value || !exclusive))
77                 {
78                         set_value(!value);
79                         signal_toggled.emit(value);
80                 }
81
82                 pressed = false;
83         }
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 &>(obj);
103 }
104
105 void Toggle::Loader::finish()
106 {
107         Toggle &tgl = get_object();
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         get_object().text = t;
117 }
118
119 } // namespace GLtk
120 } // namespace Msp