]> git.tdb.fi Git - libs/gltk.git/blob - source/panel.cpp
Use DerivedObjectLoader for widget loaders
[libs/gltk.git] / source / panel.cpp
1 #include <algorithm>
2 #include <msp/core/refptr.h>
3 #include "button.h"
4 #include "dropdown.h"
5 #include "entry.h"
6 #include "hslider.h"
7 #include "indicator.h"
8 #include "label.h"
9 #include "layout.h"
10 #include "list.h"
11 #include "panel.h"
12 #include "part.h"
13 #include "toggle.h"
14 #include "vslider.h"
15
16 using namespace std;
17
18 namespace Msp {
19 namespace GLtk {
20
21 Panel::Panel():
22         layout(0)
23 { }
24
25 Panel::~Panel()
26 {
27         delete layout;
28         layout = 0;
29 }
30
31 void Panel::set_layout(Layout *l)
32 {
33         l->set_container(*this);
34         delete layout;
35         layout = l;
36 }
37
38 void Panel::autosize()
39 {
40         if(layout)
41                 layout->autosize();
42 }
43
44 void Panel::render_special(const Part &part, GL::Renderer &renderer) const
45 {
46         if(part.get_name()=="children")
47         {
48                 for(list<Container::Child *>::const_iterator i=children.begin(); i!=children.end(); ++i)
49                         if((*i)->widget->is_visible())
50                                 (*i)->widget->render(renderer);
51         }
52 }
53
54 void Panel::on_geometry_change()
55 {
56         if(layout)
57                 layout->update();
58 }
59
60 void Panel::on_child_added(Widget &wdg)
61 {
62         if(layout)
63         {
64                 layout->add_widget(wdg);
65                 signal_autosize_changed.emit();
66         }
67 }
68
69 void Panel::on_child_removed(Widget &wdg)
70 {
71         if(layout)
72         {
73                 layout->remove_widget(wdg);
74                 signal_autosize_changed.emit();
75         }
76 }
77
78
79 Panel::Loader::Loader(Panel &p, map<string, Widget *> &m):
80         DataFile::DerivedObjectLoader<Panel, Widget::Loader>(p),
81         wdg_map(m)
82 {
83         add("button",    &Loader::child<Button>);
84         add("dropdown",  &Loader::child<Dropdown>);
85         add("entry",     &Loader::child<Entry>);
86         add("hslider",   &Loader::child<HSlider>);
87         add("indicator", &Loader::child<Indicator>);
88         add("label",     &Loader::child<Label>);
89         add("list",      &Loader::child<List>);
90         add("panel",     &Loader::panel);
91         add("toggle",    &Loader::child<Toggle>);
92         add("vslider",   &Loader::child<VSlider>);
93 }
94
95 template<typename T>
96 void Panel::Loader::child(const string &n)
97 {
98         RefPtr<T> chl = new T();
99         load_sub(*chl);
100         obj.add(*chl.get());
101         wdg_map[n] = chl.release();
102 }
103
104 void Panel::Loader::panel(const string &n)
105 {
106         RefPtr<Panel> p = new Panel();
107         load_sub(*p, wdg_map);
108         obj.add(*p.get());
109         wdg_map[n] = p.release();
110 }
111
112 } // namespace GLtk
113 } // namespace Msp