]> git.tdb.fi Git - libs/gltk.git/blob - source/widget.h
Store the Resources reference only in Root widget
[libs/gltk.git] / source / widget.h
1 /* $Id$
2
3 This file is part of libmspgltk
4 Copyright © 2007-2009  Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #ifndef MSP_GLTK_WIDGET_H_
9 #define MSP_GLTK_WIDGET_H_
10
11 #include <string>
12 #include "geometry.h"
13 #include "state.h"
14
15 namespace Msp {
16 namespace GLtk {
17
18 class Container;
19 class Part;
20 class Resources;
21 class Style;
22
23 /**
24 Base class for all widgets.  Derived classes should call update_style in 
25 constructor, because it can't be done correctly in the Widget constructor.
26 */
27 class Widget
28 {
29 public:
30         class Loader: public Msp::DataFile::Loader
31         {
32         protected:
33                 Widget &wdg;
34
35         public:
36                 Loader(Widget &);
37                 Widget &get_object() const { return wdg; }
38         private:
39                 void position(int, int);
40                 void size(unsigned, unsigned);
41                 void style(const std::string &);
42         };
43
44         sigc::signal<void, bool> signal_visibility_changed;
45         sigc::signal<void> signal_request_focus;
46         sigc::signal<void> signal_grab_pointer;
47         sigc::signal<void> signal_ungrab_pointer;
48
49 protected:
50         Geometry geom;
51         std::string style_name;
52         const Style *style;
53         State state;
54         bool visible;
55         bool focusable;
56         Container *parent;
57         std::string tooltip;
58
59         Widget();
60 public:
61         virtual ~Widget();
62
63         void set_position(int, int);
64         void set_size(unsigned, unsigned);
65         virtual void autosize() { }
66         void set_geometry(const Geometry &);
67         const Geometry &get_geometry() const { return geom; }
68
69         /**
70         Sets the widget style.  The final style name is constructed by concatenating
71         the widget class and the style name with a dash.
72         */
73         void set_style(const std::string &);
74         const Style &get_style() const { return *style; }
75
76         void set_tooltip(const std::string &);
77         const std::string &get_tooltip() const { return tooltip; }
78
79         void set_visible(bool);
80         bool is_visible() const { return visible; }
81         void set_focusable(bool);
82         bool is_focusable() const { return focusable; }
83         void set_focus();
84
85         void render() const;
86 protected:
87         virtual void render_special(const Part &) const { }
88
89 public:
90         // Events
91         virtual void button_press(int, int, unsigned) { }
92         virtual void button_release(int, int, unsigned) { }
93         virtual void pointer_motion(int, int) { }
94         virtual void pointer_enter();
95         virtual void pointer_leave();
96         virtual void key_press(unsigned, unsigned, wchar_t) { }
97         virtual void key_release(unsigned, unsigned) { }
98         virtual void focus_in();
99         virtual void focus_out();
100
101 protected:
102         /**
103         Returns the name of the widget class.  Used for style lookup.
104         */
105         virtual const char *get_class() const { return "widget"; }
106
107         /**
108         Gets a style object from the resource collection based on the class and
109         style names of the widget.
110         */
111         void update_style();
112
113         static void update_style(Widget &);
114
115         /**
116         Sets the widget's parent Panel.  The widget must be unparented when calling
117         this function with a nonzero parameter.
118         */
119         void set_parent(Container *);
120
121         /**
122         A helper function to set the parent of another widget.
123         */
124         static void set_parent(Widget &, Container *);
125
126         // More events
127         virtual void on_geometry_change() { }
128         virtual void on_style_change() { }
129         virtual void on_reparent() { }
130 };
131
132 } // namespace GLtk
133 } // namespace Msp
134
135 #endif