libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
widget.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <promeki/namespace.h>
14#include <promeki/objectbase.h>
15#include <promeki/rect.h>
16#include <promeki/size2d.h>
17#include <promeki/point.h>
18#include <promeki/event.h>
19
20PROMEKI_NAMESPACE_BEGIN
21
22class Layout;
23class KeyEvent;
24class MouseEvent;
25class WindowFocusEvent;
26
31class PaintEvent : public Event {
32 public:
34 static const Type Paint;
35
37 PaintEvent() : Event(Paint) {}
38};
39
44class ResizeEvent : public Event {
45 public:
47 static const Type Resize;
48
53 ResizeEvent(const Size2Di32 &size) : Event(Resize), _size(size) {}
54
56 const Size2Di32 &size() const { return _size; }
57
58 private:
59 Size2Di32 _size;
60};
61
66enum FocusPolicy {
67 NoFocus,
68 TabFocus,
69 ClickFocus,
70 StrongFocus
71};
72
77enum SizePolicy {
78 SizeFixed,
79 SizeMinimum,
80 SizeMaximum,
81 SizePreferred,
82 SizeExpanding,
83 SizeMinimumExpanding
84};
85
104class Widget : public ObjectBase {
105 PROMEKI_OBJECT(Widget, ObjectBase)
106 public:
111 Widget(ObjectBase *parent = nullptr);
112
114 virtual ~Widget();
115
117 const Rect2Di32 &geometry() const { return _geometry; }
118
120 void setGeometry(const Rect2Di32 &rect);
121
123 int x() const { return _geometry.x(); }
124
126 int y() const { return _geometry.y(); }
127
129 int width() const { return _geometry.width(); }
130
132 int height() const { return _geometry.height(); }
133
135 Size2Di32 size() const { return Size2Di32(_geometry.width(), _geometry.height()); }
136
138 const Size2Di32 &minimumSize() const { return _minimumSize; }
139
141 void setMinimumSize(const Size2Di32 &size) { _minimumSize = size; }
142
144 const Size2Di32 &maximumSize() const { return _maximumSize; }
145
147 void setMaximumSize(const Size2Di32 &size) { _maximumSize = size; }
148
150 SizePolicy sizePolicy() const { return _sizePolicy; }
151
153 void setSizePolicy(SizePolicy policy) { _sizePolicy = policy; }
154
156 bool isVisible() const { return _visible; }
157
164 bool isEffectivelyVisible() const;
165
167 void show();
168
170 void hide();
171
173 void setVisible(bool visible);
174
176 bool isEnabled() const { return _enabled; }
177
179 void setEnabled(bool enabled) { _enabled = enabled; }
180
182 FocusPolicy focusPolicy() const { return _focusPolicy; }
183
185 void setFocusPolicy(FocusPolicy policy) { _focusPolicy = policy; }
186
188 bool hasFocus() const { return _focused; }
189
191 void setFocus();
192
202 void setFocused(bool focused) { _focused = focused; }
203
211 virtual void update();
212
214 bool isDirty() const { return _dirty; }
215
217 void clearDirty() { _dirty = false; }
218
220 Layout *layout() const { return _layout; }
221
223 void setLayout(Layout *layout);
224
228 Point2Di32 mapToParent(const Point2Di32 &p) const;
229
233 Point2Di32 mapFromParent(const Point2Di32 &p) const;
234
238 Point2Di32 mapToGlobal(const Point2Di32 &p) const;
239
243 Point2Di32 mapFromGlobal(const Point2Di32 &p) const;
244
246 virtual Size2Di32 sizeHint() const;
247
249 virtual Size2Di32 minimumSizeHint() const;
250
260 void sendEvent(Event *e) { event(e); }
261
263 PROMEKI_SIGNAL(resized, Size2Di32)
264
265
266 PROMEKI_SIGNAL(visibilityChanged, bool)
267
268 protected:
270 virtual void paintEvent(PaintEvent *e);
271
273 virtual void keyPressEvent(KeyEvent *e);
274
276 virtual void keyReleaseEvent(KeyEvent *e);
277
279 virtual void mouseEvent(MouseEvent *e);
280
282 virtual void resizeEvent(ResizeEvent *e);
283
285 virtual void focusInEvent(Event *e);
286
288 virtual void focusOutEvent(Event *e);
289
298 virtual void windowFocusEvent(WindowFocusEvent *e);
299
301 void event(Event *e) override;
302
303 private:
304 friend class Layout;
305
306 Rect2Di32 _geometry;
307 Size2Di32 _minimumSize;
308 Size2Di32 _maximumSize = Size2Di32(9999, 9999);
309 SizePolicy _sizePolicy = SizePreferred;
310 FocusPolicy _focusPolicy = NoFocus;
311 bool _visible = true;
312 bool _enabled = true;
313 bool _focused = false;
314 bool _dirty = true;
315 Layout *_layout = nullptr;
316};
317
318PROMEKI_NAMESPACE_END
319
320#endif // PROMEKI_ENABLE_CORE