]> git.tdb.fi Git - libs/gltk.git/blob - source/toggle.cpp
9fbd098ae0783aab8a4e724e1975b85864bc8b48
[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, const string &t):
18         Widget(r),
19         text(t),
20         pressed(false),
21         value(false),
22         exclusive(false)
23 {
24         update_style();
25 }
26
27 void Toggle::set_text(const string &t)
28 {
29         text=t;
30 }
31
32 void Toggle::set_exclusive(bool e)
33 {
34         exclusive=e;
35         if(exclusive && value)
36                 exclude_siblings();
37 }
38
39 void Toggle::set_value(bool v)
40 {
41         value=v;
42         if(value)
43         {
44                 state|=ACTIVE;
45                 if(exclusive && parent)
46                         exclude_siblings();
47         }
48         else
49                 state&=~ACTIVE;
50 }
51
52 void Toggle::button_press(int, int, unsigned btn)
53 {
54         if(btn==1)
55                 pressed=true;
56 }
57
58 void Toggle::button_release(int x, int y, unsigned btn)
59 {
60         if(pressed && btn==1)
61         {
62                 if(geom.is_inside_relative(x, y) && (!value || !exclusive))
63                 {
64                         set_value(!value);
65                         signal_toggled.emit(value);
66                 }
67
68                 pressed=false;
69         }
70 }
71
72 void Toggle::render_special(const Part &part) const
73 {
74         if(part.get_name()=="text")
75                 render_text(part, text);
76 }
77
78 void Toggle::exclude_siblings()
79 {
80         const list<Widget *> &siblings=parent->get_children();
81         for(list<Widget *>::const_iterator i=siblings.begin(); i!=siblings.end(); ++i)
82                 if(Toggle *tgl=dynamic_cast<Toggle *>(*i))
83                         if(tgl!=this && tgl->get_exclusive() && tgl->get_value())
84                                 tgl->set_value(false);
85 }
86
87
88 Toggle::Loader::Loader(Toggle &t):
89         Widget::Loader(t)
90 {
91         add("exclusive", &Toggle::exclusive);
92         add("text",      &Toggle::text);
93         add("value",     &Toggle::value);
94 }
95
96 Toggle &Toggle::Loader::get_object() const
97 {
98         return static_cast<Toggle &>(wdg);
99 }
100
101 void Toggle::Loader::finish()
102 {
103         Toggle &tgl=static_cast<Toggle &>(wdg);
104         if(tgl.value)
105                 tgl.state|=ACTIVE;
106         else
107                 tgl.state&=~ACTIVE;
108 }
109
110 } // namespace GLtk
111 } // namespace Msp