ScummVM API documentation
macmenu.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef GRAPHICS_MACGUI_MACMENU_H
23#define GRAPHICS_MACGUI_MACMENU_H
24
25#include "common/str-array.h"
26#include "graphics/macgui/macfontmanager.h"
27#include "graphics/macgui/macwindow.h"
28#include "graphics/font.h"
29
30namespace Common {
31class U32String;
32class MacResManager;
33class PEResources;
34}
35
36namespace Graphics {
37
38struct MacMenuItem;
39struct MacMenuSubMenu;
40typedef Common::Array<MacMenuItem *> ItemArray;
41
43 ItemArray items;
44 Common::Rect bbox;
45 int highlight;
46 int visStart; // Visible start
47 int visEnd; // Visible end
48 int scroll;
49
50 MacMenuSubMenu() : highlight(-1), visStart(0), visEnd(0), scroll(0) {}
51
53
54 void enableAllItems();
55
56 int ytoItem(int y, int itemHeight) { return MIN<int>((y - bbox.top) / itemHeight, items.size() - 1); }
57};
58
60 Common::String text;
61 Common::U32String unicodeText;
62 bool unicode;
63 int action;
64 int style;
65 char shortcut;
66 int shortcutPos;
67 bool enabled;
68 bool checked;
69 int checkSymbol;
70 Common::Rect bbox;
71
72 MacMenuSubMenu *submenu;
73
74 MacMenuItem(const Common::String &t, int a = -1, int s = 0, char sh = 0, int sp = -1, bool e = true, bool c = false, int cs = 0) :
75 text(t), unicode(false), action(a), style(s), shortcut(sh),
76 shortcutPos(sp), enabled(e), submenu(nullptr), checked(c), checkSymbol(cs) {}
77 MacMenuItem(const Common::U32String &t, int a = -1, int s = 0, char sh = 0, int sp = -1, bool e = true, bool c = false, int cs = 0) :
78 unicodeText(t), unicode(true), action(a), style(s), shortcut(sh),
79 shortcutPos(sp), enabled(e), submenu(nullptr), checked(c), checkSymbol(cs) {}
80
81 ~MacMenuItem() {
82 if (submenu)
83 delete submenu;
84 }
85};
86
88 int menunum;
89 const char *title;
90 int action;
91 byte shortcut;
92 bool enabled;
93};
94
95class MacMenu : public BaseMacWindow {
96public:
97 MacMenu(int id, const Common::Rect &bounds, MacWindowManager *wm);
98 ~MacMenu();
99
100 ManagedSurface *getBorderSurface() override { return nullptr; }
101 const Common::Rect &getInnerDimensions() override { return _dims; }
102 bool isDirty() override { return _contentIsDirty || _dimensionsDirty; }
103
104 static Common::StringArray *readMenuFromResource(Common::SeekableReadStream *res);
105 static MacMenu *createMenuFromPEexe(Common::PEResources *exe, MacWindowManager *wm);
106
107 void setAlignment(Graphics::TextAlign align);
108
109 void setCommandsCallback(void (*callback)(int, Common::String &, void *), void *data) { _ccallback = callback; _cdata = data; }
110 void setCommandsCallback(void (*callback)(int, Common::U32String &, void *), void *data) { _unicodeccallback = callback; _cdata = data; }
111
112 void addStaticMenus(const MacMenuData *data);
113 void calcDimensions();
114 void resize(int width, int height);
115
116 int numberOfMenus();
117 int numberOfMenuItems(MacMenuItem *menu);
118
119 MacMenuItem *getMenuItem(int menuId);
120 MacMenuItem *getMenuItem(const Common::String &menuId);
121 MacMenuItem *getSubMenuItem(MacMenuItem *menu, int itemId);
122 MacMenuItem *getSubMenuItem(MacMenuItem *menu, const Common::String &itemId);
123
124 MacMenuSubMenu *addSubMenu(MacMenuSubMenu *submenu, int index = -1);
125 int addMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action = -1, int style = 0, char shortcut = 0, bool enabled = true, bool checked = false);
126 int addMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action = 0, int style = 0, char shortcut = 0, bool enabled = true, bool checked = false);
127 void insertMenuItem(MacMenuSubMenu *submenu, const Common::String &text, uint pos, int action = -1, int style = 0, char shortcut = 0, bool enabled = true, bool checked = false);
128 void insertMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, uint pos, int action = 0, int style = 0, char shortcut = 0, bool enabled = true, bool checked = false);
129 void removeMenuItem(MacMenuSubMenu *submenu, uint pos);
130 void loadMenuResource(Common::MacResManager *resFork, uint16 id);
131 void loadMenuBarResource(Common::MacResManager *resFork, uint16 id);
132 void createSubMenuFromString(int id, const char *string, int commandId);
133 void appendMenu(MacMenuSubMenu *submenu, const Common::String &string, int commandId);
134 void clearSubMenu(int id);
135
136 MacMenuSubMenu *getSubmenu(MacMenuSubMenu *submenu, int index);
137
138 bool draw(ManagedSurface *g, bool forceRedraw = false) override;
139 void eventLoop();
140 bool mouseClick(int x, int y);
141 bool draw(bool forceRedraw = false) override { return false; }
142 void blit(ManagedSurface *g, Common::Rect &dest) override {}
143
144 bool processEvent(Common::Event &event) override;
145
146 void enableCommand(int menunum, int action, bool state);
147 void enableCommand(const char *menuitem, const char *menuaction, bool state);
148 void enableCommand(const Common::U32String &menuitem, const Common::U32String &menuaction, bool state);
149 void enableAllMenus();
150 void disableAllMenus();
151
152 bool isVisible() { return _isVisible; }
153 void setVisible(bool visible, bool silent = false) override { _isVisible = visible; _contentIsDirty = true; }
154
155 void setFont(uint16 fontID, uint16 fontSize);
156
157 void printMenu(int level = 0, MacMenuSubMenu *submenu = nullptr);
158
159 virtual void closeMenu();
160
161 bool checkIntersects(Common::Rect &rect);
162
163 // macmenuItem operations
164 void setCheckMark(MacMenuItem *menuItem, bool checkMark);
165 bool getCheckMark(MacMenuItem *menuItem);
166
167 void setEnabled(MacMenuItem *menuItem, bool enabled);
168 bool getEnabled(MacMenuItem *menuItem);
169
170 void setName(MacMenuItem *menuItem, const Common::String &name);
171 Common::String getName(MacMenuItem *menuItem);
172
173 void setAction(MacMenuItem *menuItem, int actionId);
174 int getAction(MacMenuItem *menuItem);
175
176 int getLastSelectedMenuItem() { return _lastActiveItem; };
177 int getLastSelectedSubmenuItem() { return _lastActiveSubItem; };
178 void getMenuShortCut(uint16 key, int &menuItem, int &submenuItem);
179
180 void renderSubmenu(MacMenuSubMenu *menu, bool recursive = true);
181
182 int getScrollDirection() { return _scrollDirection; }
183
184 int getDropdownItemHeight() { return _menuDropdownItemHeight; }
185
186 void setOverlayDirty(bool dirty) { _overlayDirty = dirty; _contentIsDirty |= dirty; }
187
189
190protected:
191 Common::Rect _bbox;
192 ItemArray _items;
193 bool _isVisible;
194 bool _dimensionsDirty;
195 bool _overlayDirty;
196 int _menuDropdownItemHeight;
197
198 int _activeItem;
199 int _activeSubItem;
200
201 bool _isModal;
202
203 void calcSubMenuBounds(MacMenuSubMenu *menu, int x, int y);
204
205private:
206 ManagedSurface _tempSurface;
207 TextAlign _align;
208 int _menuLeftDropdownPadding;
209 int _menuRightDropdownPadding;
210
211private:
212 bool checkCallback(bool unicode = false);
213 const Font *getMenuFont(int slant = kMacFontRegular);
214 Common::CodePage getMenuEncoding() const;
215 const Common::String getAcceleratorString(MacMenuItem *item, const char *prefix);
216 void processTabs();
217 void processSubmenuTabs(MacMenuSubMenu *submenu);
218
219 int calcSubMenuWidth(MacMenuSubMenu *menu);
220
221 bool keyEvent(Common::Event &event);
222 bool mouseRelease(int x, int y);
223 bool mouseMove(int x, int y);
224
225 bool processMenuShortCut(uint16 ascii);
226
227 void drawSubMenuArrow(ManagedSurface *dst, int x, int y, int color);
228 bool contains(int x, int y);
229
230 void drawScrollArrow(int arrowX, int arrowY, int direction);
231
232 MacMenuItem *findMenuItem(const Common::String &menuId, const Common::String &itemId);
233 MacMenuItem *findMenuItem(int menuId, int itemId);
234
235
236 uint16 _fontID;
237 uint16 _fontSize;
238 const Font *_font;
239 Font *_loadedFont;
240
241 int _lastActiveItem;
242 int _lastActiveSubItem;
243
244 int _selectedItem;
245
246 bool _scrollTimerActive;
247 int _scrollDirection;
248
249 void (*_ccallback)(int action, Common::String &text, void *data);
250 void (*_unicodeccallback)(int action, Common::U32String &text, void *data);
251 void *_cdata;
252};
253
254} // End of namespace Graphics
255
256#endif
size_type size() const
Definition: array.h:316
Definition: macresman.h:126
Definition: winexe_pe.h:48
Definition: stream.h:745
Definition: str.h:59
Definition: ustr.h:57
Definition: macwindow.h:80
Definition: macmenu.h:95
bool draw(bool forceRedraw=false) override
Definition: macmenu.h:141
ManagedSurface * getBorderSurface() override
Definition: macmenu.h:100
bool draw(ManagedSurface *g, bool forceRedraw=false) override
bool isDirty() override
Definition: macmenu.h:102
const Common::Rect & getInnerDimensions() override
Definition: macmenu.h:101
void setVisible(bool visible, bool silent=false) override
Definition: macmenu.h:153
bool processEvent(Common::Event &event) override
Definition: macwindowmanager.h:149
Definition: managed_surface.h:51
TextAlign
Definition: font.h:48
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: events.h:218
Definition: rect.h:536
Definition: macmenu.h:87
Definition: macmenu.h:59
Definition: macmenu.h:42