]> git.tdb.fi Git - libs/gltk.git/blob - source/panel.cpp
f6aad86a856d90aa0440ebb1f0634544a2b3f51b
[libs/gltk.git] / source / panel.cpp
1 #include "panel.h"
2 #include "part.h"
3
4 namespace Msp {
5 namespace GLtk {
6
7 Panel::Panel(const Resources &r):
8         Widget(r),
9         pointer_focus(0),
10         pointer_grab(0)
11 {
12         update_style();
13 }
14
15 Panel::~Panel()
16 {
17         for(ChildSeq::iterator i=children.begin(); i!=children.end(); ++i)
18                 delete *i;
19 }
20
21 void Panel::button_press(int x, int y, unsigned btn)
22 {
23         if(pointer_grab>0)
24                 pointer_focus->button_press(x-geom.x, y-geom.y, btn);
25         else if(geom.is_inside(x, y))
26         {
27                 for(ChildSeq::iterator i=children.begin(); i!=children.end(); ++i)
28                         if((*i)->get_geometry().is_inside(x-geom.x, y-geom.y))
29                         {
30                                 (*i)->button_press(x-geom.x, y-geom.y, btn);
31                                 pointer_grab=btn;
32                         }
33         }
34 }
35
36 void Panel::button_release(int x, int y, unsigned btn)
37 {
38         if(pointer_grab>0)
39         {
40                 pointer_focus->button_release(x-geom.x, y-geom.y, btn);
41
42                 if(btn==pointer_grab)
43                 {
44                         pointer_grab=0;
45
46                         for(ChildSeq::iterator i=children.begin(); i!=children.end(); ++i)
47                                 if((*i)->get_geometry().is_inside(x-geom.x, y-geom.y))
48                                 {
49                                         set_pointer_focus(*i);
50                                         break;
51                                 }
52                 }
53         }
54         else if(geom.is_inside(x, y))
55         {
56                 for(ChildSeq::iterator i=children.begin(); i!=children.end(); ++i)
57                         if((*i)->get_geometry().is_inside(x-geom.x, y-geom.y))
58                                 (*i)->button_release(x-geom.x, y-geom.y, btn);
59         }
60 }
61
62 void Panel::pointer_motion(int x, int y)
63 {
64         if(pointer_grab>0)
65                 pointer_focus->pointer_motion(x-geom.x, y-geom.y);
66         else if(geom.is_inside(x, y))
67         {
68                 bool found=false;
69                 for(ChildSeq::iterator i=children.begin(); i!=children.end(); ++i)
70                         if((*i)->get_geometry().is_inside(x-geom.x, y-geom.y))
71                         {
72                                 set_pointer_focus(*i);
73                                 (*i)->pointer_motion(x-geom.x, y-geom.y);
74                                 found=true;
75                         }
76
77                 if(!found)
78                         set_pointer_focus(0);
79         }
80 }
81
82 void Panel::add(Widget &wdg)
83 {
84         children.push_back(&wdg);
85 }
86
87 void Panel::render_part(const Part &part) const
88 {
89         if(part.get_name()=="children")
90         {
91                 for(ChildSeq::const_iterator i=children.begin(); i!=children.end(); ++i)
92                         (*i)->render();
93         }
94         else
95                 Widget::render_part(part);
96 }
97
98 void Panel::set_pointer_focus(Widget *wdg)
99 {
100         if(wdg!=pointer_focus && pointer_grab==0)
101         {
102                 if(pointer_focus)
103                         pointer_focus->pointer_leave();
104
105                 pointer_focus=wdg;
106
107                 if(pointer_focus)
108                         pointer_focus->pointer_enter();
109         }
110 }
111
112 } // namespace GLtk
113 } // namespace Msp