Rose
Visual.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <iostream>
12 #include <utility>
13 #include <optional>
14 #include <limits>
15 #include "Callbacks.h"
16 #include "StructuredTypes.h"
17 #include "Types.h"
18 #include "Utilities.h"
19 #include "Texture.h"
20 
21 namespace rose {
22 
23  namespace gm {
24  class Context;
25  }
26 
27  class Widget;
28  class Window;
29  class Manager;
30  class Widget;
31 
35  struct State {
36  std::string_view stateString;
37  };
38 
43  struct SemanticGesture {
44  uint32_t value;
45  static SemanticGesture None;
46  static SemanticGesture Click;
47  static SemanticGesture Drag;
48  static SemanticGesture Scroll;
49  static SemanticGesture Key;
50  static SemanticGesture Multi;
51 
52  [[nodiscard]] bool supports(SemanticGesture semanticGesture) const {
53  return (value & semanticGesture.value) != 0;
54  }
55 
56  SemanticGesture operator|(const SemanticGesture& other) const {
57  SemanticGesture result{};
58  result.value = value | other.value;
59  return result;
60  }
61  };
62 
63  class LayoutHint {
64  friend class Visual;
65 
66  public:
67  static constexpr size_t AttachmentHint = 0;
68  static constexpr size_t GridHint = 1;
69 
70  enum class GridLayoutHint : int {
71  EndStride,
72  AxisSize,
73  AxisOffset,
74  };
75 
76  enum class Attachment : int {
77  None,
78  TopLeft,
79  TopRight,
80  BottomLeft,
81  BottomRight,
82  Top,
83  Left,
84  TopTo,
85  LeftTo,
86  Bottom,
87  Right,
88  BottomTo,
89  RightTo,
90  TopWith,
91  LeftWith,
92  BottomWith,
93  RightWith,
94  };
95 
96  static constexpr int RefIndexNone = std::numeric_limits<int>::max();
97 
98  protected:
99  size_t mHintClass;
100  int mValueType;
101  int mValue;
102 
103  public:
104  LayoutHint() = delete;
105 
106  LayoutHint(Attachment attachment, int index) {
107  mHintClass = AttachmentHint;
108  mValueType = static_cast<int>(attachment);
109  mValue = index;
110  }
111 
112  LayoutHint(GridLayoutHint hint, int value) {
113  mHintClass = GridHint;
114  mValueType = static_cast<int>(hint);
115  mValue = value;
116  }
117  };
118 
125  class Visual {
126  public:
127  friend class LayoutManager;
128 
129  using ValueMap = std::map<int, int>;
130  std::map<size_t, ValueMap> mHintsMap{};
131 
132  protected:
133  SemanticGesture mSemanticGesture{};
134  Position<int> mPos{};
135  Size mSize{};
136  Position<int> mPreferredPos{};
137  Size mPreferredSize{};
138  Rectangle mScreenRect{};
139  Padding mPadding{};
140  State mState{};
141  bool mVisible{true};
142 
143  public:
148  void setScreenRectangle(const Position<int> &containerPosition) {
149  mScreenRect = getScreenRectangle(containerPosition);
150  }
151 
157  [[nodiscard]] Rectangle getScreenRectangle(const Position<int> &containerPosition) const {
158  return Rectangle{containerPosition + mPos, mSize};
159  }
160 
162  virtual void draw(gm::Context &context, const Position<int> &containerPosition) = 0;
163 
165  virtual Rectangle layout(rose::gm::Context &context, const Rectangle &screenRect) = 0;
166 
168  Position<int> drawPadding(const Position<int> &containerPosition) {
169  return containerPosition + mPadding.position();
170  }
171 
173  Rectangle layoutPadding(const Rectangle &screenRect) {
174  return Rectangle{screenRect.position(), screenRect.size() + mPadding.size()};
175  }
176 
178  void setSize(const Size& size) {
179  mPreferredSize = size;
180  }
181 
183  [[nodiscard]] Size getSize() const {
184  return mPreferredSize;
185  }
186 
188  void setPosition(const Position<int>& position) {
189  mPreferredPos = position;
190  }
191 
193  [[nodiscard]] Position<int> getPosition() const {
194  return mPreferredPos;
195  }
196 
198  void setPadding(const Padding &padding) {
199  mPadding = padding;
200  }
201 
203  void setScreenRectangle(const Rectangle &screenRect) {
204  mPos = screenRect.position();
205  mSize = screenRect.size();
206  }
207 
209  [[nodiscard]] constexpr bool isVisible() const noexcept {
210  return mVisible;
211  }
212 
214  void setVisible(bool visible) noexcept {
215  mVisible = visible;
216  }
217 
219  void setLayoutHint(const LayoutHint &hint) {
220  mHintsMap[hint.mHintClass][hint.mValueType] = hint.mValue;
221  }
222 
228  std::optional<int> getAttachmentHint(LayoutHint::Attachment attachment) {
229  if (auto map = mHintsMap.find(LayoutHint::AttachmentHint); map != mHintsMap.end()) {
230  if (auto att = (*map).second.find(static_cast<int>(attachment)); att != (*map).second.end()) {
231  return (*att).second;
232  }
233  }
234  return std::nullopt;
235  }
236 
242  std::optional<int> getGridHint(LayoutHint::GridLayoutHint gridLayoutHint) {
243  if (auto map = mHintsMap.find(LayoutHint::GridHint); map != mHintsMap.end()) {
244  if (auto gridHint = (*map).second.find(static_cast<int>(gridLayoutHint)); gridHint != (*map).second.end()) {
245  return (*gridHint).second;
246  }
247  }
248  return std::nullopt;
249  }
250 
251  template<size_t HintClass>
252  [[nodiscard]] std::optional<const ValueMap> getHintMap() const {
253  static_assert(HintClass == LayoutHint::AttachmentHint || HintClass == LayoutHint::GridHint,
254  "Supported maps are: LayoutHint::AttachmentHint, LayoutHint::GridHint.");
255  if (auto map = mHintsMap.find(HintClass); map != mHintsMap.end()) {
256  return std::make_optional<const ValueMap>((*map).second);
257  }
258  return std::nullopt;
259  }
260 
262  [[nodiscard]] SemanticGesture supportedSemanticGestures() const { return mSemanticGesture; }
263  };
264 
265  class Application;
266 
271  class Screen : public Visual, public Container {
272  Application& mApplication;
273 
274  public:
275  explicit Screen(Application &application);
276  ~Screen() override = default;
277 
278  static constexpr std::string_view id = "Screen";
279  std::string_view nodeId() const noexcept override {
280  return id;
281  }
282 
287  void add(const std::shared_ptr<Node> &node) override {
288  if (auto window = std::dynamic_pointer_cast<Window>(node); window)
289  Container::add(node);
290  else
291  throw NodeTypeError("A Screen may only contain Window objects.");
292  }
293 
295  void draw(gm::Context &context, const Position<int> &containerPosition) override;
296 
298  Rectangle layout(gm::Context &context, const Rectangle &screenRect) override;
299 
302  return mApplication;
303  }
304 
306  const Application& getApplication() const {
307  return mApplication;
308  }
309  };
310 
315  class Window : public Visual, public Container {
316  protected:
317  bool mModalWindow{};
318  gm::Texture mBaseTexture{};
319 
320  public:
321  ~Window() override = default;
322 
323  static constexpr std::string_view id = "Window";
324  std::string_view nodeId() const noexcept override {
325  return id;
326  }
327 
328  bool isModal() const { return mModalWindow; }
329 
335  void add(const std::shared_ptr<Node> &node) override {
336  if (empty()) {
337  if (std::dynamic_pointer_cast<Manager>(node))
338  Container::add(node);
339  else
340  throw NodeTypeError("A Window may only contain one Manager object.");
341  } else {
342  throw NodeRangeError("A Window may only contain one Manager object.");
343  }
344  }
345 
347  void draw(gm::Context &context, const Position<int> &containerPosition) override;
348 
349  bool baseTextureNeeded(const Position<int> &containerPosition) {
350  setScreenRectangle(containerPosition);
351  return !mBaseTexture || mBaseTexture.getSize() != mScreenRect.size();
352  }
358  void generateBaseTexture(gm::Context &context, const Position<int> &containerPosition);
359 
365  void drawBaseTexture(gm::Context &context, const Position<int> &containerPosition);
366 
368  Rectangle layout(gm::Context &context, const Rectangle &screenRect) override;
369 
371  std::shared_ptr<Widget> pointerWidget(const Position<int>& position);
372 
374  std::shared_ptr<Screen> getScreen() {
375  if (auto screen = std::dynamic_pointer_cast<Screen>(container()))
376  return screen;
377  return nullptr;
378  }
379 
381  std::shared_ptr<Screen> getScreen() const {
382  if (auto screen = std::dynamic_pointer_cast<Screen>(container()))
383  return screen;
384  return nullptr;
385  }
386  };
387 
393  protected:
394  size_t mMaxContent{UnlimitedContent}; //The maximum number of objects the LayoutManager supports.
395 
397  static Rectangle getScreenRectangle(std::shared_ptr<Visual> &visual) {
398  return Rectangle{visual->mPos, visual->mSize};
399  }
400 
401  public:
403  static constexpr size_t UnlimitedContent = std::numeric_limits<size_t>::max();
404 
405  virtual ~LayoutManager() = default;
406  using Itr = Container::iterator;
407 
409  virtual Rectangle layoutContent(gm::Context &context, const Rectangle &screenRect, LayoutManager::Itr first,
410  LayoutManager::Itr last) = 0;
411 
413  [[nodiscard]] size_t maximumContent() const { return mMaxContent; }
414  };
415 
416  template<class Layout, typename ... Args>
417  std::unique_ptr<Layout> makeLayout(Args ... args) {
418  static_assert(std::is_base_of_v<LayoutManager, Layout>, "Layout must be derived from LayoutManager.");
419  return std::make_unique<Layout>(args ...);
420  }
421 
426  class SimpleLayout : public LayoutManager {
427  public:
428  ~SimpleLayout() override = default;
429 
431  Rectangle layoutContent(gm::Context &context, const Rectangle &screenRect, LayoutManager::Itr first,
432  LayoutManager::Itr last) override;
433  };
434 
439  class LayoutManagerError : public std::runtime_error {
440  public:
441  LayoutManagerError() = delete;
442  explicit LayoutManagerError(const std::string &what) : std::runtime_error(what) {}
443  explicit LayoutManagerError(const char *what) : std::runtime_error(what) {}
444  LayoutManagerError(const LayoutManagerError& other) = default;
445  };
446 
451  class Widget : public Visual, public Container {
452  protected:
454  EventCallback mEnterEventCallback{};
455 
457  EventCallback mLeaveEventCallback{};
458 
460  ButtonCallback mButtonEventCallback{};
461 
463  MouseMotionCallback mMouseMotionCallback{};
464 
466  ScrollCallback mMouseScrollCallback{};
467 
469  KeyboardShortcutCallback mKeyboardShortcutCallback{};
470 
472  TextInputCallback mTextInputCallback{};
473 
475  KeyboardFocusCallback mKeyboardFocusCallback{};
476 
478  KeyboardEventCallback mKeyboardEventCallback{};
479 
480  public:
481  Widget() = default;
482 
483  ~Widget() override = default;
484 
485  Widget(const Widget &) = delete;
486 
487  Widget(Widget &&) = delete;
488 
489  Widget &operator=(const Widget &) = delete;
490 
491  Widget &operator=(Widget &&) = delete;
492 
493  static constexpr std::string_view id = "Widget";
494  std::string_view nodeId() const noexcept override {
495  return id;
496  }
497 
498 // std::shared_ptr<Widget> focusWidget(SemanticGesture gesture, Position position, Position containerPosition);
499 
506  std::shared_ptr<Widget> pointerWidget(const Position<int>& position, const Position<int>& containerPosition);
507 
512  Position<int> computeScreenPosition();
513 
519  bool contains(const Position<int> &position);
520 
521 // void clearFocus(const SemanticGesture &gesture) {}
522 
528  if (auto window = getWindow(); window) {
529  if (auto screen = window->getScreen(); screen)
530  return screen->getApplication();
531  }
532  throw std::runtime_error("No path from Widget to Screen to Application.");
533  }
534 
537  if (auto window = getWindow(); window) {
538  if (auto screen = window->getScreen(); screen)
539  return screen->getApplication();
540  }
541  throw std::runtime_error("No path from Widget to Screen to Application.");
542  }
543 
548  std::shared_ptr<Window> getWindow() {
549  auto c = container();
550  while (c) {
551  if (auto window = std::dynamic_pointer_cast<Window>(c); window)
552  return window;
553  c = c->container();
554  }
555 
556  return nullptr;
557  }
558 
560  std::shared_ptr<Window> getWindow() const {
561  auto c = container();
562  while (c) {
563  if (auto window = std::dynamic_pointer_cast<Window>(c); window)
564  return window;
565  c = c->container();
566  }
567 
568  return nullptr;
569  }
570 
575  bool enterEvent() {
576  if (mEnterEventCallback)
577  return mEnterEventCallback();
578  return false;
579  }
580 
583  mEnterEventCallback = std::move(eventCallback);
584  }
585 
590  bool leaveEvent() {
591  if (mLeaveEventCallback)
592  return mLeaveEventCallback();
593  return false;
594  }
595 
597  void setLeaveEventCallback(EventCallback eventCallback) {
598  mLeaveEventCallback = std::move(eventCallback);
599  }
600 
608  bool buttonEvent(bool pressed, uint button, uint clicks, bool passed);
609 
611  void setButtonEventCallback(ButtonCallback buttonCallback) {
612  mButtonEventCallback = std::move(buttonCallback);
613  }
614 
625  bool mouseMotionEvent(bool pressed, uint button, const Position<int>& mousePos, const Position<int>& relativePos, bool passed);
626 
629  mMouseMotionCallback = std::move(mouseMotionCallback);
630  }
631 
638  bool mouseScrollEvent(const Position<int>& deltaPos, bool passed);
639 
642  mMouseScrollCallback = std::move(scrollCallback);
643  }
644 
649  bool keyboardShortcutEvent(uint32_t shortcutCode, bool state, uint repeat);
650 
652  void setKeyboardShortcutCallback(KeyboardShortcutCallback keyboardShortcutCallback) {
653  mKeyboardShortcutCallback = std::move(keyboardShortcutCallback);
654  }
655 
661  bool keyTextInputEvent(const std::string& text);
662 
664  void setTextInputCallback(TextInputCallback textInputCallback) {
665  mTextInputCallback = std::move(textInputCallback);
666  }
667 
668  bool supportsKeyboardFocus() const {
669  if (mTextInputCallback || mKeyboardFocusCallback || mKeyboardEventCallback)
670  return true;
671  return false;
672  }
673 
679  bool keyboardFocusEvent(bool hasFocus);
680 
682  void setKeyboardFocusCallback(KeyboardFocusCallback keyboardFocusCallback) {
683  mKeyboardFocusCallback = std::move(keyboardFocusCallback);
684  }
685 
686  bool keyboardEvent(const SDL_KeyboardEvent &keyboardEvent);
687 
688  void setKeyboardEvent(KeyboardEventCallback keyboardEventCallback) {
689  mKeyboardEventCallback = keyboardEventCallback;
690  }
691  };
692 
697  class Manager : public Widget {
698  protected:
700  std::unique_ptr<LayoutManager> mLayoutManager{};
701 
702  public:
703  Manager();
704 
705  ~Manager() override = default;
706 
707  Manager(const Manager&) = delete;
708 
709  Manager(Manager&&) = delete;
710 
711  Manager& operator=(const Manager&) = delete;
712 
713  Manager& operator=(Manager&&) = delete;
714 
715  static constexpr std::string_view id = "Manager";
716  std::string_view nodeId() const noexcept override {
717  return id;
718  }
719 
724  void add(const std::shared_ptr<Node> &node) override {
725  if (mLayoutManager) {
726  if (mLayoutManager->maximumContent() == LayoutManager::UnlimitedContent || size() < mLayoutManager->maximumContent()) {
727  if (std::dynamic_pointer_cast<Widget>(node) || std::dynamic_pointer_cast<Manager>(node))
728  Container::add(node);
729  else
730  throw NodeTypeError("A Manager may only contain Manager or Widget objects.");
731  } else {
732  throw NodeRangeError(StringCompositor("Contents exceed maximum limit: ",
733  mLayoutManager->maximumContent()));
734  }
735  } else {
736  throw LayoutManagerError("Can not add content without a LayoutManager.");
737  }
738  }
739 
745  void draw(gm::Context &context, const Position<int> &containerPosition) override;
746 
753  Rectangle layout(gm::Context &context, const Rectangle &screenRect) override;
754 
759  void setLayoutManager(std::unique_ptr<LayoutManager> &&layoutManager) {
760  mLayoutManager = std::move(layoutManager);
761  }
762 
767  std::unique_ptr<LayoutManager>& layoutManager() { return mLayoutManager; }
768  };
769 
774  struct Parent {};
775 
779  static Parent endw{};
780 
788  template<class WidgetClass, typename ... Args>
789  inline std::shared_ptr<WidgetClass> wdg(Args ... args) {
790  return std::make_shared<WidgetClass>(args ...);
791  }
792 }
793 
802 template<class WidgetClass>
803 inline std::shared_ptr<WidgetClass> operator >>(std::shared_ptr<WidgetClass> widget, std::shared_ptr<rose::Widget> &store) {
804  static_assert(std::is_base_of_v<rose::Widget,WidgetClass>, "WidgetClass must be derived from rose::Widget." );
805  store = widget;
806  return widget;
807 }
808 
817 template<class WidgetClass>
818 inline std::shared_ptr<WidgetClass> operator >>(std::shared_ptr<WidgetClass> widget, std::shared_ptr<WidgetClass> &store) {
819  static_assert(std::is_base_of_v<rose::Widget,WidgetClass>, "WidgetClass must be derived from rose::Widget." );
820  store = widget;
821  return widget;
822 }
823 
824 //template<class ManagerClass>
825 //inline std::shared_ptr<ManagerClass> operator >>(std::shared_ptr<ManagerClass> manager, std::shared_ptr<rose::Manager> &store) {
826 // static_assert(std::is_base_of_v<rose::Manager,ManagerClass>, "ManagerClass must be derived from rose::Manager." );
827 // store = manager;
828 // return manager;
829 //}
830 
837 template<class WidgetClass>
838 inline std::shared_ptr<rose::Manager> operator<<(std::shared_ptr<WidgetClass> widget, const rose::Parent &) {
839  static_assert(std::is_base_of_v<rose::Widget, WidgetClass> || std::is_base_of_v<rose::Manager, WidgetClass>,
840  "WidgetClass must be derived from rose::Widget or rose::Manager.");
841  return std::dynamic_pointer_cast<rose::Manager>(widget->container());
842 }
843 
851 template<class WidgetClass>
852 inline std::shared_ptr<WidgetClass> operator<<(std::shared_ptr<WidgetClass> widget, const rose::Size& size) {
853  static_assert(std::is_base_of_v<rose::Widget, WidgetClass> || std::is_base_of_v<rose::Manager, WidgetClass>,
854  "WidgetClass must be derived from rose::Widget or rose::Manager.");
855  widget->setSize(size);
856  return widget;
857 }
858 
866 template<class WidgetClass>
867 inline std::shared_ptr<WidgetClass> operator<<(std::shared_ptr<WidgetClass> widget, const rose::Position<int>& position) {
868  static_assert(std::is_base_of_v<rose::Widget, WidgetClass> || std::is_base_of_v<rose::Manager, WidgetClass>,
869  "WidgetClass must be derived from rose::Widget or rose::Manager.");
870  widget->setPosition(position);
871  return widget;
872 }
873 
882 template<class ContainerClass, class WidgetClass>
883 inline std::shared_ptr<WidgetClass> operator<<(std::shared_ptr<ContainerClass> container, std::shared_ptr<WidgetClass> widget) {
884  static_assert(std::is_base_of_v<rose::Visual, ContainerClass> && std::is_base_of_v<rose::Container, ContainerClass>,
885  "ContainerClass must be derived from both rose::Visual and rose::Container.");
886  static_assert(std::is_base_of_v<rose::Visual, WidgetClass> && std::is_base_of_v<rose::Node, WidgetClass>,
887  "WidgetClass must be derived from both rose::visual and rose::Node.");
888  container->add(widget);
889  return widget;
890 }
891 
899 template<class WidgetClass>
900 inline std::shared_ptr<WidgetClass> operator<<(std::shared_ptr<WidgetClass> widget, std::unique_ptr<rose::LayoutManager>&& layout) {
901  static_assert(std::is_base_of_v<rose::Manager,WidgetClass>, "WidgetClass must be derived from rose::Manager.");
902  widget->setLayoutManager(std::move(layout));
903  return widget;
904 }
905 
913 template<class WidgetClass>
914 inline std::shared_ptr<WidgetClass> operator<<(std::shared_ptr<WidgetClass> widget, const rose::Padding& padding) {
915  static_assert(std::is_base_of_v<rose::Visual, WidgetClass>, "WidgetClass must be derived from rose::Visual.");
916  widget->setPadding(padding);
917  return widget;
918 }
919 
927 template<class WidgetClass>
928 inline std::shared_ptr<WidgetClass> operator<<(std::shared_ptr<WidgetClass> widget, const rose::LayoutHint& hint) {
929  static_assert(std::is_base_of_v<rose::Visual, WidgetClass>, "WidgetClass must be derived from rose::Visual.");
930  widget->setLayoutHint(hint);
931  return widget;
932 }
Rectangle layoutPadding(const Rectangle &screenRect)
Pad the layout.
Definition: Visual.h:173
A pure virtual base class for layout managers.
Definition: Visual.h:392
Rectangle getScreenRectangle(const Position< int > &containerPosition) const
Get the rectangle occupied by the Visual.
Definition: Visual.h:157
Application & getApplication()
Get the Application object associated with the Screen.
Definition: Visual.h:301
A Widget which manages contained Widgets.
Definition: Visual.h:697
Definition: Application.h:169
std::unique_ptr< SDL_Window, WindowDestroy > Window
An SDL_Window unique pointer.
Definition: Renderer.h:57
std::string StringCompositor(Arg &&arg, Args &&... args)
Composite a pack of arguments that are streamable to a string.
Definition: Utilities.h:114
A container which holds the subordinate Node objects.
Definition: StructuredTypes.h:325
static Rectangle getScreenRectangle(std::shared_ptr< Visual > &visual)
Get the screen rectangle of a Visual.
Definition: Visual.h:397
void setScreenRectangle(const Rectangle &screenRect)
Set Screen Rectangle.
Definition: Visual.h:203
void setLayoutHint(const LayoutHint &hint)
Add a LayoutHint.
Definition: Visual.h:219
A Window is a visual abstraction of a number of related user interface objects.
Definition: Visual.h:315
std::function< bool(bool pressed, uint state, Position< int > mousePosition, Position< int > relativePosition)> MouseMotionCallback
Mouse motion callback.
Definition: Callbacks.h:61
std::shared_ptr< Window > getWindow()
Get the Window ancestor of a Widget.
Definition: Visual.h:548
void setLayoutManager(std::unique_ptr< LayoutManager > &&layoutManager)
Set the layout manager.
Definition: Visual.h:759
size_t maximumContent() const
Get the maximum content of the LayoutManager.
Definition: Visual.h:413
std::shared_ptr< WidgetClass > wdg(Args ... args)
Create a Widget.
Definition: Visual.h:789
Size getSize() const
Get the preferred size.
Definition: Visual.h:183
An abstraction of the available display screen.
Definition: Visual.h:271
bool enterEvent()
Notify Widget of mouse pointer enter event.
Definition: Visual.h:575
std::function< bool()> EventCallback
Basic event callback with no argumetns.
Definition: Callbacks.h:37
std::function< bool(Position< int > deltaPos)> ScrollCallback
Mouse scroll wheel callback.
Definition: Callbacks.h:43
Application & getApplication() const
const version of getApplication()
Definition: Visual.h:536
Position< int > getPosition() const
Get the preferred Position.
Definition: Visual.h:193
void setTextInputCallback(TextInputCallback textInputCallback)
Set the text input callback.
Definition: Visual.h:664
std::function< bool(bool pressed, uint button, uint clicks)> ButtonCallback
Mouse button callback.
Definition: Callbacks.h:51
Definition: Visual.h:63
void setScreenRectangle(const Position< int > &containerPosition)
Compute the screen rectangle from the Container screen Position.
Definition: Visual.h:148
void setLeaveEventCallback(EventCallback eventCallback)
Set the leave callback.
Definition: Visual.h:597
std::function< void(bool hasFocus)> KeyboardFocusCallback
Keyboard focus callback.
Definition: Callbacks.h:102
Definitions to support callbacks.
Abstraction of space consumed around an object for space, borders, etc.
Definition: Types.h:454
Abstraction of SDL_Texture.
Definition: Texture.h:46
Context
Definition: GraphicsModel.h:76
Classes and functions used to implement structured data collections.
void setMouseScrollEventCallback(ScrollCallback scrollCallback)
Set the mouse scroll callback.
Definition: Visual.h:641
void setMouseMotionEventCallback(MouseMotionCallback mouseMotionCallback)
Set the mouse motion callback.
Definition: Visual.h:628
A type used to extract the parent from a Widget.
Definition: Visual.h:774
Bottom left corner of the board.
Definition: ConwayLife.h:32
void setKeyboardShortcutCallback(KeyboardShortcutCallback keyboardShortcutCallback)
Set the keyboard shortcut callback.
Definition: Visual.h:652
void add(const std::shared_ptr< Node > &node) override
Add a Manager to the Window.
Definition: Visual.h:335
void add(const std::shared_ptr< Node > &node) override
Add a Node to the contents of the Manager.
Definition: Visual.h:724
Position< int > position() const noexcept
Get a Position from a Rectangle.
Definition: Types.h:346
std::map< int, int > ValueMap
The std::map type for each hint class.
Definition: Visual.h:129
The type of semantic gesture supported by a Widget.
Definition: Visual.h:43
void setVisible(bool visible) noexcept
Set visibility.
Definition: Visual.h:214
const Application & getApplication() const
Get the Application associated with a const Screen.
Definition: Visual.h:306
void setKeyboardFocusCallback(KeyboardFocusCallback keyboardFocusCallback)
Set the keyboard focus callback.
Definition: Visual.h:682
void add(const std::shared_ptr< Node > &node) override
Add a Window to the screen.
Definition: Visual.h:287
Top left corner of the board.
Definition: ConwayLife.h:31
std::optional< int > getAttachmentHint(LayoutHint::Attachment attachment)
Get an AttachmentHint value given a LayoutHint::Attachment.
Definition: Visual.h:228
std::function< void(uint32_t shortcutCode, bool state, uint repeat)> KeyboardShortcutCallback
Keyboard shortcut callback.
Definition: Callbacks.h:90
An exception to indicate runtime error during layout.
Definition: Visual.h:439
void setButtonEventCallback(ButtonCallback buttonCallback)
Set the button callback.
Definition: Visual.h:611
std::function< void(const std::string &text)> TextInputCallback
Text input callback.
Definition: Callbacks.h:96
constexpr bool isVisible() const noexcept
Check visibility.
Definition: Visual.h:209
std::shared_ptr< Screen > getScreen()
Get the Screen which supports the Window.
Definition: Visual.h:374
std::shared_ptr< Screen > getScreen() const
Get the Screen which support the const Window.
Definition: Visual.h:381
Position< int > drawPadding(const Position< int > &containerPosition)
Pad the drawing location.
Definition: Visual.h:168
A composite of a Position and a Size.
Definition: Types.h:307
The properties common to all visual objects on the screen.
Definition: Visual.h:125
void setPadding(const Padding &padding)
Set Padding.
Definition: Visual.h:198
Definition: StructuredTypes.h:21
bool leaveEvent()
Notify Widget of mouse pointer leave event.
Definition: Visual.h:590
std::unique_ptr< LayoutManager > & layoutManager()
Get the LayoutManager.
Definition: Visual.h:767
static constexpr size_t UnlimitedContent
The value for &#39;unlimited&#39; managed objects.
Definition: Visual.h:403
A type to specify a state.
Definition: Visual.h:35
std::shared_ptr< WidgetClass > operator>>(std::shared_ptr< WidgetClass > widget, std::shared_ptr< rose::Widget > &store)
An extraction operator to store a Widget in a std::shared_ptr<Widget>.
Definition: Visual.h:803
An element of the application user interface.
Definition: Visual.h:451
Definition: StructuredTypes.h:28
std::shared_ptr< Window > getWindow() const
const version of getWindow().
Definition: Visual.h:560
A size in integer dimensions.
Definition: Types.h:230
Draw the background.
ToDo: There is an issue that the initial scroll interaction is lost if the click/press lands on a Wid...
Definition: CelestialOverlay.cpp:13
A Simple layout manager.
Definition: Visual.h:426
void setSize(const Size &size)
Set preferred Size.
Definition: Visual.h:178
Attachment
Definition: Visual.h:76
void setPosition(const Position< int > &position)
Set preferred Position.
Definition: Visual.h:188
std::optional< int > getGridHint(LayoutHint::GridLayoutHint gridLayoutHint)
Get a GridLayoutHint value given a LayoutHint::GridLayoutHint.
Definition: Visual.h:242
SemanticGesture supportedSemanticGestures() const
Get supported SemanticGestures.
Definition: Visual.h:262
Application & getApplication()
Get a reference to the Application object.
Definition: Visual.h:527
void setEnterLeaveEventCallback(EventCallback eventCallback)
Set the enter callback.
Definition: Visual.h:582
Size size() const noexcept
Get a Size from a Rectangle.
Definition: Types.h:351