53 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) 54 #error "Only <final/final.h> can be included directly." 60 #include "final/fevent.h" 61 #include "final/menu/fmenulist.h" 62 #include "final/widget/fwindow.h" 80 using FMenuList::getItem;
81 using FMenuList::isSelected;
97 auto operator = (
const FMenu&) ->
FMenu& =
delete;
100 auto operator = (
FMenu&&) noexcept ->
FMenu& =
delete;
103 auto getClassName()
const ->
FString override;
104 auto getText()
const ->
FString;
108 void setEnable (
bool =
true)
override;
109 void unsetEnable()
override;
110 void setDisable()
override;
112 void unsetSelected();
113 void setMenuWidget (
bool =
true);
114 void unsetMenuWidget();
115 void setStatusbarMessage (
const FString&)
override;
116 void setMenu (
FMenu*);
118 void resetColors()
override;
121 auto isSelected()
const -> bool;
122 auto hasHotkey()
const -> bool;
123 auto hasMenu()
const -> bool;
126 void show()
override;
127 void hide()
override;
137 void cb_menuitemEnabled();
138 void cb_menuitemDisabled();
139 void cb_menuitemToggled (
const FMenuItem*)
const;
143 enum class SelectItem { No, Yes };
147 uChar focus_changed : 1;
148 uChar hide_sub_menu : 1;
149 uChar mouse_over_menu : 1;
150 uChar mouse_over_submenu : 1;
151 uChar mouse_over_supermenu : 1;
152 uChar mouse_over_menubar : 1;
159 std::size_t hotkeypos;
164 static constexpr
auto NOT_SET =
static_cast<std::size_t
>(-1);
167 auto getSuperMenu()
const ->
FWidget*;
173 auto isDialog (
const FWidget*)
const -> bool;
174 auto isMenuBar (
const FWidget*)
const -> bool;
175 auto isMenu (
const FWidget*)
const -> bool;
176 auto isRadioMenuItem (
const FWidget*)
const -> bool;
177 auto isSubMenu()
const -> bool;
178 auto isDialogMenu()
const -> bool;
179 auto isMouseOverMenu (
const FPoint&) -> bool;
180 auto isMouseOverSubMenu (
const FPoint&) -> bool;
181 auto isMouseOverSuperMenu (
const FPoint&) -> bool;
182 auto isMouseOverMenuBar (
const FPoint&)
const -> bool;
186 void initCallbacks();
187 void calculateDimensions();
188 void adjustItems()
const;
189 auto adjustX(
int)
const -> int;
190 void openSubMenu (
FMenu*, SelectItem);
191 void closeOpenedSubMenu();
193 void hideSuperMenus()
const;
195 auto mouseDownOverList (
const FPoint&) -> bool;
196 void mouseDownSubmenu (
const FMenuItem*);
197 void mouseDownSelection (
FMenuItem*,
bool&);
198 auto mouseUpOverList (
const FPoint&) -> bool;
199 auto initializeMouseStates (
const FMouseEvent*) -> MouseStates;
200 void handleCloseSubMenu (
const MouseStates& ms);
201 void mouseMoveOverList (
const FPoint&, MouseStates&);
202 void mouseMoveSelection (
FMenuItem*, MouseStates&);
203 void mouseMoveDeselection (
FMenuItem*, MouseStates&);
204 void mouseUpOverBorder();
205 void mouseMoveOverBorder (MouseStates&)
const;
206 auto handleSubMenuEvent (
const MouseStates&,
const FMouseEvent&)
const -> bool;
207 void passEventToSubMenu (
const FMouseEvent&)
const;
208 auto handleSuperMenuEvent (
const MouseStates&,
const FMouseEvent&) -> bool;
210 auto handleMenuBarEvent (
const MouseStates&,
const FMouseEvent&)
const -> bool;
211 void passEventToMenuBar (
const FMouseEvent&)
const;
212 template <
typename W
idgetT>
213 void passEventToWidget (WidgetT,
const FMouseEvent&)
const;
214 auto containsMenuStructure (
const FPoint&) -> bool;
215 auto containsMenuStructure (
int,
int) -> bool;
217 auto superMenuAt (
int,
int) ->
FMenu*;
218 void selectItem_PostProcessing (
FMenuItem*)
override;
220 auto hotkeyFound (FKey,
const FKeyEvent&)
const -> bool;
222 void draw()
override;
224 void drawSeparator (
int);
226 void drawCheckMarkPrefix (
const FMenuItem*);
227 void drawMenuText (MenuText&);
228 void drawSubMenuIndicator (std::size_t&);
229 void drawAcceleratorKey (std::size_t&, FKey);
230 void drawTrailingSpaces (std::size_t);
231 void setLineAttributes (
const FMenuItem*,
int);
232 void setCursorToHotkeyPosition (
FMenuItem*)
const;
235 void acceptSelection();
237 void processActivate()
const;
242 FMenu* opened_sub_menu{
nullptr};
243 FMenu* shown_sub_menu{
nullptr};
244 std::size_t max_item_width{0};
245 std::size_t hotkeypos{NOT_SET};
246 bool mouse_down{
false};
247 bool has_checkable_items{
false};
250 friend auto closeOpenMenus (
FMenu*,
const FPoint&) -> std::tuple<bool, bool>;
263 auto closeOpenMenus (
FMenu*,
const FPoint&) -> std::tuple<bool, bool>;
268 inline auto FMenu::getClassName()
const ->
FString 272 inline auto FMenu::getText()
const ->
FString 273 {
return menuitem.getText(); }
276 inline auto FMenu::getItem() ->
FMenuItem*
277 {
return &menuitem; }
280 inline void FMenu::setEnable (
bool enable)
281 { menuitem.setEnable(enable); }
284 inline void FMenu::unsetEnable()
285 { menuitem.unsetEnable(); }
288 inline void FMenu::setDisable()
289 { menuitem.setDisable(); }
292 inline void FMenu::setSelected()
293 { menuitem.setSelected(); }
296 inline void FMenu::unsetSelected()
297 { menuitem.unsetSelected(); }
300 inline void FMenu::unsetMenuWidget()
301 { setMenuWidget(
false); }
304 inline void FMenu::setMenu (
FMenu* m)
305 { menuitem.setMenu(m); }
308 inline void FMenu::setText (
const FString& txt)
309 { menuitem.setText(txt); }
312 inline auto FMenu::isSelected()
const ->
bool 313 {
return menuitem.isSelected(); }
316 inline auto FMenu::hasHotkey()
const ->
bool 317 {
return menuitem.hasHotkey(); }
320 inline auto FMenu::hasMenu()
const ->
bool 321 {
return menuitem.hasMenu(); }
324 inline auto FMenu::getSuperMenu()
const ->
FWidget*
325 {
return super_menu; }
328 inline void FMenu::setSuperMenu (
FWidget* smenu)
329 { super_menu = smenu; }
332 template <
typename W
idgetT>
333 inline void FMenu::passEventToWidget (WidgetT widget,
const FMouseEvent& ev)
const 337 const auto& type = ev.getType();
338 const auto& tpos = ev.getTermPos();
339 const auto& par = widget->termToWidgetPos(tpos);
340 const MouseButton btn = ev.getButton();
341 const auto& new_ev = \
342 std::make_shared<FMouseEvent>(type, par, tpos, btn);
343 setClickedWidget(widget);
344 widget->mouse_down =
true;
345 widget->onMouseMove(new_ev.get());
349 inline auto FMenu::containsMenuStructure (
const FPoint& p) ->
bool 350 {
return containsMenuStructure (p.getX(), p.getY()); }
353 inline auto FMenu::superMenuAt (
const FPoint& p) ->
FMenu*
354 {
return superMenuAt (p.getX(), p.getY()); }
358 { menuitem.onAccel(ev); }
Definition: class_template.cpp:25