FifeGUI 0.2.0
A C++ GUI library designed for games.
menuitem.hpp
1// SPDX-License-Identifier: LGPL-2.1-or-later OR BSD-3-Clause
2// SPDX-FileCopyrightText: 2026 Fifengine contributors
3
4#ifndef INCLUDE_FIFECHAN_WIDGETS_MENUITEM_HPP_
5#define INCLUDE_FIFECHAN_WIDGETS_MENUITEM_HPP_
6
7// Standard library includes
8#include <memory>
9#include <string>
10
11// Platform config include
12#include "fifechan/platform.hpp"
13
14// Project headers (subdirs before local)
15#include "fifechan/image.hpp"
16#include "fifechan/listeners/actionlistener.hpp"
17#include "fifechan/widgets/button.hpp"
18
19namespace fcn
20{
21 class Font;
22 class MenuPopup;
23
28 {
32 int iconW{0};
33
37 int captionW{0};
38
42 int shortcutW{0};
43
47 int arrowW{0};
48
52 int height{0};
53 };
54
59 {
63 int iconW{0};
64
68 int captionW{0};
69
73 int shortcutW{0};
74
78 int arrowW{0};
79 };
80
85 {
89 int xIcon;
90
95
100
105
110 };
111
123 class FIFEGUI_API MenuItem : public Button
124 {
125 public:
134 enum class Type : std::uint8_t
135 {
136 Action,
137 Submenu,
138 Separator,
139 Checkable
140 };
141
147 explicit MenuItem(std::string const & text);
148
149 ~MenuItem() override = default;
150
151 MenuItem(MenuItem const &) = delete;
152 MenuItem& operator=(MenuItem const &) = delete;
153 MenuItem(MenuItem&&) = delete;
154 MenuItem& operator=(MenuItem&&) = delete;
155
162 void setType(Type type);
163
170 Type getType() const;
171
178 void setSubmenu(MenuPopup* popup);
179
186 MenuPopup* getSubmenu() const;
187
194 void setShortcut(std::string const & shortcut);
195
202 std::string const & getShortcut() const;
203
207 void setText(std::string const & text);
211 std::string const & getText() const;
212
216 void setIcon(Image const * image);
222 Image const * getIcon() const;
223
228 void setIconGlyph(std::string const & glyph, Font* font = nullptr);
232 std::string const & getIconGlyph() const;
233
237 void setIconGlyphFont(Font* font);
238
242 Font* getIconGlyphFont() const;
243
250 void setChecked(bool checked);
251
258 bool isChecked() const;
259
266 // cppcheck-suppress duplInheritedMember
267 void setEnabled(bool enabled);
268
275 // cppcheck-suppress duplInheritedMember
276 bool isEnabled() const;
277
278 // Override draw for custom rendering
279 void draw(Graphics* graphics) override;
280
281 // Mouse event handlers are inherited from `Button`.
282 // (Previously overridden for tracing; no custom logic required.)
283
290 MenuItemMetrics measure(Font const & font) const;
291
297 void layoutColumns(ColumnLayout const & layout);
298
299 protected:
303 Type mType{Type::Action};
304
309
313 std::string mShortcut;
314
318 Image const * mIcon{nullptr};
319
323 std::string mIconGlyph;
328
332 bool mChecked{false};
333
337 // cppcheck-suppress duplInheritedMember
338 bool mEnabled{true};
339
343 std::unique_ptr<ColumnLayout> mColumnLayout;
344 };
345} // namespace fcn
346
347#endif // INCLUDE_FIFECHAN_WIDGETS_MENUITEM_HPP_
Abstract interface for font rendering.
Definition font.hpp:26
Abstract interface providing primitive drawing functions (lines, rectangles, etc.).
Definition graphics.hpp:58
Abstract holder for image data.
Definition image.hpp:34
A menu item widget for use in menus.
Definition menuitem.hpp:124
bool mChecked
Checked state.
Definition menuitem.hpp:332
Type mType
Type of menu item.
Definition menuitem.hpp:303
MenuPopup * mSubmenu
Submenu popup (for submenu items).
Definition menuitem.hpp:308
std::string mIconGlyph
Optional icon glyph (emoji or glyph string) and font to render it.
Definition menuitem.hpp:323
Type
The type of menu item.
Definition menuitem.hpp:135
MenuItem(std::string const &text)
Constructor.
Definition menuitem.cpp:18
Image const * mIcon
Optional icon image.
Definition menuitem.hpp:318
std::string mShortcut
Shortcut text.
Definition menuitem.hpp:313
bool mEnabled
Enabled state.
Definition menuitem.hpp:338
std::unique_ptr< ColumnLayout > mColumnLayout
Cached column layout for rendering.
Definition menuitem.hpp:343
Font * mIconGlyphFont
Font used to render mIconGlyph when set.
Definition menuitem.hpp:327
A menu popup widget that displays a dropdown menu.
Definition menupopup.hpp:38
Used replacement tokens by configure_file():
Column layout specification passed to items for rendering.
Definition menuitem.hpp:85
int xArrow
X position of arrow column.
Definition menuitem.hpp:104
int xCaption
X position of caption column.
Definition menuitem.hpp:94
int xShortcut
X position of shortcut column.
Definition menuitem.hpp:99
MenuColumns cols
Column widths aggregated across items.
Definition menuitem.hpp:109
int xIcon
X position of icon column.
Definition menuitem.hpp:89
Aggregated column metrics for all items in a menu.
Definition menuitem.hpp:59
int shortcutW
Maximum shortcut width across all items.
Definition menuitem.hpp:73
int arrowW
Maximum arrow width across all items.
Definition menuitem.hpp:78
int iconW
Maximum icon width across all items.
Definition menuitem.hpp:63
int captionW
Maximum caption width across all items.
Definition menuitem.hpp:68
Layout metrics for a single menu item (content only, no padding/borders).
Definition menuitem.hpp:28
int captionW
Width of caption text.
Definition menuitem.hpp:37
int height
Height of the item.
Definition menuitem.hpp:52
int iconW
Width of icon column (or checkmark space).
Definition menuitem.hpp:32
int shortcutW
Width of shortcut text.
Definition menuitem.hpp:42
int arrowW
Width of submenu arrow.
Definition menuitem.hpp:47