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;
25
30class PaintEvent : public Event {
31 public:
33 static const Type Paint;
34
36 PaintEvent() : Event(Paint) {}
37};
38
43class ResizeEvent : public Event {
44 public:
46 static const Type Resize;
47
52 ResizeEvent(const Size2Di32 &size) : Event(Resize), _size(size) {}
53
55 const Size2Di32 &size() const { return _size; }
56
57 private:
58 Size2Di32 _size;
59};
60
65enum FocusPolicy {
66 NoFocus,
67 TabFocus,
68 ClickFocus,
69 StrongFocus
70};
71
76enum SizePolicy {
77 SizeFixed,
78 SizeMinimum,
79 SizeMaximum,
80 SizePreferred,
81 SizeExpanding,
82 SizeMinimumExpanding
83};
84
103class Widget : public ObjectBase {
104 PROMEKI_OBJECT(Widget, ObjectBase)
105 public:
110 Widget(ObjectBase *parent = nullptr);
111
113 virtual ~Widget();
114
116 const Rect2Di32 &geometry() const { return _geometry; }
117
119 void setGeometry(const Rect2Di32 &rect);
120
122 int x() const { return _geometry.x(); }
123
125 int y() const { return _geometry.y(); }
126
128 int width() const { return _geometry.width(); }
129
131 int height() const { return _geometry.height(); }
132
134 Size2Di32 size() const { return Size2Di32(_geometry.width(), _geometry.height()); }
135
137 const Size2Di32 &minimumSize() const { return _minimumSize; }
138
140 void setMinimumSize(const Size2Di32 &size) { _minimumSize = size; }
141
143 const Size2Di32 &maximumSize() const { return _maximumSize; }
144
146 void setMaximumSize(const Size2Di32 &size) { _maximumSize = size; }
147
149 SizePolicy sizePolicy() const { return _sizePolicy; }
150
152 void setSizePolicy(SizePolicy policy) { _sizePolicy = policy; }
153
155 bool isVisible() const { return _visible; }
156
163 bool isEffectivelyVisible() const;
164
166 void show();
167
169 void hide();
170
172 void setVisible(bool visible);
173
175 bool isEnabled() const { return _enabled; }
176
178 void setEnabled(bool enabled) { _enabled = enabled; }
179
181 FocusPolicy focusPolicy() const { return _focusPolicy; }
182
184 void setFocusPolicy(FocusPolicy policy) { _focusPolicy = policy; }
185
187 bool hasFocus() const { return _focused; }
188
190 void setFocus();
191
201 void setFocused(bool focused) { _focused = focused; }
202
210 virtual void update();
211
213 bool isDirty() const { return _dirty; }
214
216 void clearDirty() { _dirty = false; }
217
219 Layout *layout() const { return _layout; }
220
222 void setLayout(Layout *layout);
223
227 Point2Di32 mapToParent(const Point2Di32 &p) const;
228
232 Point2Di32 mapFromParent(const Point2Di32 &p) const;
233
237 Point2Di32 mapToGlobal(const Point2Di32 &p) const;
238
242 Point2Di32 mapFromGlobal(const Point2Di32 &p) const;
243
245 virtual Size2Di32 sizeHint() const;
246
248 virtual Size2Di32 minimumSizeHint() const;
249
259 void sendEvent(Event *e) { event(e); }
260
262 PROMEKI_SIGNAL(resized, Size2Di32)
263
264
265 PROMEKI_SIGNAL(visibilityChanged, bool)
266
267 protected:
269 virtual void paintEvent(PaintEvent *e);
270
272 virtual void keyPressEvent(KeyEvent *e);
273
275 virtual void keyReleaseEvent(KeyEvent *e);
276
278 virtual void mouseEvent(MouseEvent *e);
279
281 virtual void resizeEvent(ResizeEvent *e);
282
284 virtual void focusInEvent(Event *e);
285
287 virtual void focusOutEvent(Event *e);
288
290 void event(Event *e) override;
291
292 private:
293 friend class Layout;
294
295 Rect2Di32 _geometry;
296 Size2Di32 _minimumSize;
297 Size2Di32 _maximumSize = Size2Di32(9999, 9999);
298 SizePolicy _sizePolicy = SizePreferred;
299 FocusPolicy _focusPolicy = NoFocus;
300 bool _visible = true;
301 bool _enabled = true;
302 bool _focused = false;
303 bool _dirty = true;
304 Layout *_layout = nullptr;
305};
306
307PROMEKI_NAMESPACE_END
308
309#endif // PROMEKI_ENABLE_CORE