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