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