An x::w::listlayoutmanager
is a layout manager for
x::w::menu
s
in the menu bar, and for any sub-menus.
This is the same list layout manager that
manages selection lists.
A std::vector
of
x::w::list_item_param
s
specifies the new list items for
the append_items
(), insert_items
(), replace_items
(), and replace_all_items
() methods.
With selection lists, each
x::w::list_item_param
is typically a label.
It is (derived from) a std::variant
; and can
take on additional values, such as:
the shortcut for a menu item, a callback
to invoke whenever the menu item gets selected, and several other
menu item specific attributes.
This is done by passing all attributes for a menu item as additional
x::w::list_item_param
values
before the new menu item itself:
m->append_items( { x::w::shortcut{"Alt", 'N'}, [] (ONLY IN_THREAD, const x::w::list_item_status_info_t &info) { std::cout << "File->New selected" << std::endl; }, "New", x::w::shortcut{"Alt", 'O'}, [] (ONLY IN_THREAD, const x::w::list_item_status_info_t &info) { std::cout << "File->Open selected" << std::endl; }, "Open", });
append_items
() only needs one parameter,
a vector of x::w::list_item_param
.
Each menu item's attributes must appear before the
"real" x::w::list_item_param
.
This example creates two new menu items, "New" and "Open", specifying
an optional
keyboard short for the new
item and a callback that gets invoked whenever the menu item gets
selected. This is the most common case.
The callback's parameter is the usual
x::w::list_item_status_info_t
whose
item_number
member reports which menu item got
clicked on, and a
selected
flag that reports whether this menu option
is now drawn with a mark, or not (see below).
Multiple attributes may appear in any order, but all attributes precede
the x::w::list_item_param
that creates the
new item. An exception gets thrown if
append_items
(), insert_items
(), replace_items
(), and replace_all_items
() methods receive a vector that ends with one or more
attributes, and no actual menu item.
Other available attributes are:
x::w::menuoption
This value specifies that selecting the following item toggles a mark, typically a bullet, next to the menu item. This is in addition to invoking the item's callback:
m->append_items( { x::w::menuoption{}, [] (ONLY IN_THREAD, const x::w::list_item_status_info_t &info) { std::cout << "View->Tools: " << info.selected << std::endl; }, "Tools" });
x::w::submenu
This is a wrapper for a callback that creates a new sub-menu:
m->append_items( { x::w::submenu{ [](const x::w::listlayoutmanager &submenu_layoutmanager) { // ... }}, "Recent..." });
This creates a "Recent..." menu item that opens a sub-menu.
x::w::submenu
specifies a creator lambda that receives a
x::w::listlayoutmanager
for the sub-menu.
The creator callback uses it to create the sub-menu.
Sub-menus cannot have keyboard shortcuts.
menu.C
gives an
example of passing a
x::w::separator
values between the
"Close" and "Toggle Options" items of its "File" menu.
This draws a horizontal line to visually separator groups of items in a menu. Separators typically appear in menus, but separators can also be added to ordinary selection list elements or combo-boxes. Each separator is considered to be a reserved list item. The list layout manager numbers all items in the list consecutively, starting with item #0, and a separator takes up a list item number; but a separator item cannot actually be selected with a keyboard or mouse pointer, which simply skips over the separators. Separator items cannot have any attributes of their own.
Prev | Up | Next |
Chapter 17. Menus | Table Of Contents | Using the mouse pointer or the keyboard with menus |