Rose
Menu.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <utility>
12 
13 #include "Button.h"
14 #include "Constants.h"
15 #include "PopupWindow.h"
16 #include "Signals.h"
17 
18 namespace rose {
23  struct MenuButtonData {
24  std::string_view mLabelText;
26  };
27 
28  using MenuDataList = std::vector<MenuButtonData>;
29 
34  class PopupMenu : public Popup {
35  protected:
37 
38  std::shared_ptr<Slot<Button::SignalType>> mAppButtonRx{};
39 
40  public:
41  PopupMenu() = delete;
42  ~PopupMenu() override = default;
43  PopupMenu(PopupMenu &&) = delete;
44  PopupMenu(const PopupMenu &) = delete;
45  PopupMenu& operator=(PopupMenu &&) = delete;
46  PopupMenu& operator=(const PopupMenu &) = delete;
47 
55  PopupMenu(const shared_ptr <Rose>& rose, Position pos, const MenuDataList &menuDataList,
56  std::shared_ptr<Slot<Button::SignalType>> appButtonRx);
57 
66  PopupMenu(const shared_ptr<Rose>& rose, Position pos, Size minimumSize, const MenuDataList &menuDataList,
67  std::shared_ptr<Slot<Button::SignalType>> appButtonRx);
68 
72  void initializeComposite() override;
73 
75  bool mouseButtonEvent(const Position &mousePos, int button, bool down, int modifiers) override;
76 
77  };
78 
83  class CascadeButton : public Button {
84  protected:
86 
87  std::shared_ptr<Slot<Button::SignalType>> mCascadeButtonRx{};
88  std::shared_ptr<Slot<Button::SignalType>> mAppButtonSlot{};
89 
90  MenuDataList mMenuData{};
91 
92  std::weak_ptr<PopupMenu> mPopupMenu;
93 
94  public:
95  CascadeButton();
96  ~CascadeButton() override = default;
97  CascadeButton(CascadeButton &&) = delete;
98  CascadeButton(const CascadeButton &) = delete;
99  CascadeButton& operator=(CascadeButton &&) = delete;
100  CascadeButton& operator=(const CascadeButton &) = delete;
101 
106  explicit CascadeButton(const std::string &labelString);
107 
112  explicit CascadeButton(const Id& id);
113 
118  explicit CascadeButton(std::string_view &labelString) : CascadeButton(std::string{labelString}) {}
119 
124  explicit CascadeButton(const char *labelString) : CascadeButton(std::string{labelString}) {}
125 
132  CascadeButton(const std::string &labelString, CascadeButtonType type, int fontSize = 0);
133 
140  CascadeButton(const Id& id, CascadeButtonType type, int fontSize = 0);
141 
148  CascadeButton(const char *labelString, CascadeButtonType type, int fontSize = 0)
149  : CascadeButton(std::string{labelString}, type, fontSize) {}
150 
154  void initializeComposite() override;
155 
159  void draw(sdl::Renderer &renderer, Rectangle parentRect) override;
160 
166  template<class C>
167  void addMenuData(C menuButtonList) {
168  for (auto &button : menuButtonList) {
169  mMenuData.emplace_back(button);
170  }
171  }
172 
174  void setButtonSlot(shared_ptr<Slot<Button::SignalType>> &buttonSlot, bool) { mAppButtonSlot = buttonSlot; }
175  };
176 }
177 
190 template<size_t N>
191 inline std::shared_ptr<rose::CascadeButton> operator << (std::shared_ptr<rose::CascadeButton> widget,
192  const std::array<rose::MenuButtonData,N> &container) {
193  widget->addMenuData(container);
194  return widget;
195 }
196 
203 inline std::shared_ptr<rose::CascadeButton> operator << (std::shared_ptr<rose::CascadeButton> widget,
204  std::vector<rose::MenuButtonData> &container) {
205  widget->addMenuData(container);
206  return widget;
207 }
208 
216 template<class WidgetType>
217 inline std::shared_ptr<WidgetType> operator<<(std::shared_ptr<WidgetType> widget,
218  std::shared_ptr<rose::Slot<rose::Button::SignalType>> buttonRxSlot) {
219  static_assert(std::is_base_of_v<rose::Popup, WidgetType> || std::is_base_of_v<rose::CascadeButton, WidgetType>,
220  "Button signals can only be set on Popup or CascadeButton objects." );
221  widget->setButtonSlot(buttonRxSlot,true);
222  return widget;
223 }
224 
void addMenuData(C menuButtonList)
Set the data needed to create the menu Buttons.
Definition: Menu.h:167
CascadeButtonType
The type of CascadeButton.
Definition: Constants.h:122
A Menu that can be popped up by a CascadeButton.
Definition: Menu.h:34
CascadeButton(std::string_view &labelString)
Constructor.
Definition: Menu.h:118
uint32_t SignalToken
A type definition for SignalToken used to identify the source of a Signal.
Definition: Types.h:53
std::vector< MenuButtonData > MenuDataList
The MenuDataList type.
Definition: Menu.h:28
Information to specify a Menu Button.
Definition: Menu.h:23
A position in integer (x, y) co-ordinates.
Definition: Types.h:95
Constants and Enumerations.
void setButtonSlot(shared_ptr< Slot< Button::SignalType >> &buttonSlot, bool)
See Widget::setButtonSlot()
Definition: Menu.h:174
A configurable button class.
Definition: Button.h:161
An undecorated window that is transient by nature.
Definition: PopupWindow.h:30
std::weak_ptr< PopupMenu > mPopupMenu
The PopupMenu, when created.
Definition: Menu.h:92
A Button Widget that will popup a cascade menu.
Definition: Menu.h:83
const MenuDataList & mMenuDataList
A const reference to the MenuData items.
Definition: Menu.h:36
A composite of a Position and a Size.
Definition: Types.h:307
A type to specify an Id value.
Definition: StructuredTypes.h:148
CascadeButton(const char *labelString)
Constructor.
Definition: Menu.h:124
Written as a workaround for an issue in the SDL2 Library.
Definition: Renderer.h:64
A size in integer dimensions.
Definition: Types.h:230
std::string_view mLabelText
The MenuButton Label value.
Definition: Menu.h:24
ToDo: There is an issue that the initial scroll interaction is lost if the click/press lands on a Wid...
Definition: CelestialOverlay.cpp:13
CascadeButtonType mCascadeButtonType
The type of cascade button.
Definition: Menu.h:85
The receiver portion of a Signal-Slot transmitter receiver pair.
Definition: Signals.h:25
Establish an intra-application signaling protocol.
SignalToken mSignalToken
A SignalToken to identify the MenuButton.
Definition: Menu.h:25
CascadeButton(const char *labelString, CascadeButtonType type, int fontSize=0)
Constructor.
Definition: Menu.h:148