Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing/StarWidget.hpp
blob: 9940396c5633a34ecc6f4830d49ebd281af53961 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#pragma once

#include "StarVector.hpp"
#include "StarCasting.hpp"
#include "StarInputEvent.hpp"
#include "StarGuiContext.hpp"
#include "StarText.hpp"

namespace Star {

STAR_EXCEPTION(GuiException, StarException);

STAR_CLASS(Widget);
STAR_CLASS(Pane);

enum class KeyboardCaptureMode {
  None,
  KeyEvents,
  TextInput
};

typedef function<void(Widget*)> WidgetCallbackFunc;

class Widget {
public:
  Widget();
  virtual ~Widget();

  Widget(Widget const& copy) = delete;
  Widget& operator=(Widget const&) = delete;

  virtual void render(RectI const& region) final;
  virtual void update(float dt);

  GuiContext* context() const;

  // Position of widget with drawing offset (useful for drawing)
  virtual Vec2I position() const;
  // Position of widget ignoring offset (useful for moving and placing widgets
  // relative to its current position)
  virtual Vec2I relativePosition() const;
  // Set position of widget, ignoring offset
  virtual void setPosition(Vec2I const& position);

  virtual Vec2I drawingOffset() const;
  virtual void setDrawingOffset(Vec2I const& offset);

  virtual Vec2I size() const;
  virtual void setSize(Vec2I const& size);

  virtual RectI relativeBoundRect() const;
  virtual RectI screenBoundRect() const;

  virtual bool inMember(Vec2I const& position) const;

  virtual bool sendEvent(InputEvent const& event);

  virtual void show();
  virtual void hide();
  virtual bool visibility() const;
  virtual void toggleVisibility();
  virtual void setVisibility(bool visibility);

  virtual void mouseOver();
  virtual void mouseOut();
  virtual void mouseReturnStillDown();
  virtual void setMouseTransparent(bool transparent);
  virtual bool mouseTransparent();

  virtual bool active() const;

  virtual bool interactive() const;

  virtual bool hasFocus() const;
  virtual void focus();
  virtual void blur();

  virtual Widget* parent() const;
  virtual void setParent(Widget* parent);

  virtual Pane const* window() const;
  virtual Pane* window();

  virtual void addChild(String const& name, WidgetPtr member);
  virtual void addChildAt(String const& name, WidgetPtr member, size_t at);
  virtual bool removeChild(Widget* member);
  virtual bool removeChild(String const& name);
  virtual bool removeChildAt(size_t at);
  virtual WidgetPtr getChildAt(Vec2I const& pos);
  virtual bool containsChild(String const& name);
  virtual WidgetPtr fetchChild(String const& name);
  template <typename WidgetType>
  shared_ptr<WidgetType> fetchChild(String const& name);

  virtual WidgetPtr findChild(String const& name);
  template <typename WidgetType>
  shared_ptr<WidgetType> findChild(String const& name);

  WidgetPtr childPtr(Widget const* widget) const;

  virtual size_t numChildren() const;
  virtual WidgetPtr getChildNum(size_t num) const;
  template <typename WidgetType>
  shared_ptr<WidgetType> getChildNum(size_t num) const;
  virtual void removeAllChildren();

  virtual String const& name() const;
  virtual void setName(String const& name);
  String fullName() const;

  unsigned windowHeight() const;
  unsigned windowWidth() const;
  Vec2I windowSize() const;
  virtual Vec2I screenPosition() const;
  void disableScissoring();
  void enableScissoring();
  void determineSizeFromChildren();
  void markAsContainer();

  virtual KeyboardCaptureMode keyboardCaptured() const;

  void setData(Json const& data);
  Json const& data();

  bool setLabel(String const& name, String const& value);

protected:
  friend std::ostream& operator<<(std::ostream& os, Widget const& widget);
  String toStringImpl(int indentLevel) const;

  virtual void renderImpl();
  virtual void drawChildren();
  bool setupDrawRegion(RectI const& region);
  virtual RectI getScissorRect() const;
  virtual RectI noScissor() const;

  Widget* m_parent;

  GuiContext* m_context;

  bool m_visible;
  PolyF m_boundPoly;

  Vec2I m_position;
  Vec2I m_size;
  RectI m_drawingArea;
  Vec2I m_drawingOffset;
  String m_name;
  List<WidgetPtr> m_members;
  StringMap<WidgetPtr> m_memberHash;
  Vec2I m_memberSize;
  bool m_focus;
  bool m_doScissor;
  bool m_container;
  bool m_mouseTransparent;

  Json m_data;
};

std::ostream& operator<<(std::ostream& os, Widget const& widget);

template <typename WidgetType>
shared_ptr<WidgetType> Widget::getChildNum(size_t num) const {
  return as<WidgetType>(getChildNum(num));
}

template <typename WidgetType>
shared_ptr<WidgetType> Widget::fetchChild(String const& name) {
  return as<WidgetType>(fetchChild(name));
}

template <typename WidgetType>
shared_ptr<WidgetType> Widget::findChild(String const& name) {
  return as<WidgetType>(findChild(name));
}

}

template <> struct fmt::formatter<Star::Widget> : ostream_formatter {};