]> git.tdb.fi Git - libs/gltk.git/blob - source/root.h
Adjust things to conform to changes in other libraries
[libs/gltk.git] / source / root.h
1 #ifndef MSP_GLTK_ROOT_H_
2 #define MSP_GLTK_ROOT_H_
3
4 #include <sigc++/trackable.h>
5 #include <msp/gl/blend.h>
6 #include <msp/gl/camera.h>
7 #include <msp/gl/program.h>
8 #include <msp/gl/renderable.h>
9 #include <msp/graphics/window.h>
10 #include <msp/input/keyboard.h>
11 #include <msp/input/mouse.h>
12 #include <msp/input/touchscreen.h>
13 #include <msp/time/timestamp.h>
14 #include "panel.h"
15
16 namespace Msp {
17 namespace GLtk {
18
19 class Label;
20
21 /**
22 A Root is a special type of Panel that covers the entire viewport and receives
23 input from keyboard and mouse.  It can be used by itself or in a GL::Pipeline.
24 Due to its specialized nature it's recommended to not use it with Scenes or
25 other containers.
26 */
27 class Root: public Panel, public GL::Renderable, public sigc::trackable
28 {
29 public:
30         sigc::signal<std::string, int, int> signal_tooltip;
31
32 private:
33         Resources &resources;
34         Input::Keyboard *keyboard;
35         InputMethod *input_method;
36         Input::Mouse *mouse;
37         Input::Touchscreen *touchscreen;
38         bool own_input;
39         Label *lbl_tooltip;
40         int pointer_x;
41         int pointer_y;
42         Time::TimeStamp tooltip_timeout;
43         Time::TimeStamp last_tick;
44         Widget *tooltip_target;
45         Msp::GL::Camera camera;
46         Msp::GL::Program *shprog;
47         Msp::GL::Blend blend;
48
49 public:
50         /** Creates a Root widget for a window.  The geometry is set to match the
51         window's size, and input devices are created automatically. */
52         Root(Resources &, Graphics::Window &);
53
54         /** Creates a Root widget with custom input devices.  If window is not null,
55         it is used to set the widget's initial geometry. */
56         Root(Resources &, Graphics::Window *, Input::Keyboard *, Input::Mouse *, Input::Touchscreen * = 0);
57 private:
58         void init(Graphics::Window *);
59 public:
60         virtual ~Root();
61
62         virtual const char *get_class() const { return "root"; }
63
64         Resources &get_resources() const { return resources; }
65         virtual unsigned get_width() const { return geom.w; }
66         virtual unsigned get_height() const { return geom.h; }
67
68         void tick();
69         virtual void setup_frame(GL::Renderer &);
70         virtual void render(GL::Renderer &, GL::Tag = GL::Tag()) const;
71
72 private:
73         bool button_press_event(unsigned);
74         bool button_release_event(unsigned);
75         bool axis_motion_event(unsigned, float, float);
76         bool touch_press_event(unsigned);
77         bool touch_release_event(unsigned);
78         bool touch_motion_event(unsigned, float, float);
79
80         void get_pointer(int &, int &);
81         void get_touch(unsigned, int &, int &);
82         void update_camera();
83
84         virtual void on_size_change();
85         virtual void on_child_added(Widget &);
86 };
87
88 } // namespace GLtk
89 } // namespace Msp
90
91 #endif