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 
30 namespace Common {
31 class U32String;
32 class MacResManager;
33 class PEResources;
34 }
35 
36 namespace Graphics {
37 
38 struct MacMenuItem;
39 struct MacMenuSubMenu;
40 typedef 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 
52  ~MacMenuSubMenu();
53 
54  void enableAllItems();
55 
56  int ytoItem(int y, int itemHeight) { return MIN<int>((y - bbox.top) / itemHeight, items.size() - 1); }
57 };
58 
59 struct MacMenuItem {
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 
87 struct MacMenuData {
88  int menunum;
89  const char *title;
90  int action;
91  byte shortcut;
92  bool enabled;
93 };
94 
95 class MacMenu : public BaseMacWindow {
96 public:
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 
115  int numberOfMenus();
116  int numberOfMenuItems(MacMenuItem *menu);
117 
118  MacMenuItem *getMenuItem(int menuId);
119  MacMenuItem *getMenuItem(const Common::String &menuId);
120  MacMenuItem *getSubMenuItem(MacMenuItem *menu, int itemId);
121  MacMenuItem *getSubMenuItem(MacMenuItem *menu, const Common::String &itemId);
122 
123  MacMenuSubMenu *addSubMenu(MacMenuSubMenu *submenu, int index = -1);
124  int addMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action = -1, int style = 0, char shortcut = 0, bool enabled = true, bool checked = false);
125  int addMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action = 0, int style = 0, char shortcut = 0, bool enabled = true, bool checked = false);
126  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);
127  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);
128  void removeMenuItem(MacMenuSubMenu *submenu, uint pos);
129  void loadMenuResource(Common::MacResManager *resFork, uint16 id);
130  void loadMenuBarResource(Common::MacResManager *resFork, uint16 id);
131  void createSubMenuFromString(int id, const char *string, int commandId);
132  void appendMenu(MacMenuSubMenu *submenu, const Common::String &string, int commandId);
133  void clearSubMenu(int id);
134 
135  MacMenuSubMenu *getSubmenu(MacMenuSubMenu *submenu, int index);
136 
137  bool draw(ManagedSurface *g, bool forceRedraw = false) override;
138  void eventLoop();
139  bool mouseClick(int x, int y);
140  bool draw(bool forceRedraw = false) override { return false; }
141  void blit(ManagedSurface *g, Common::Rect &dest) override {}
142 
143  bool processEvent(Common::Event &event) override;
144 
145  void enableCommand(int menunum, int action, bool state);
146  void enableCommand(const char *menuitem, const char *menuaction, bool state);
147  void enableCommand(const Common::U32String &menuitem, const Common::U32String &menuaction, bool state);
148  void enableAllMenus();
149  void disableAllMenus();
150 
151  bool isVisible() { return _isVisible; }
152  void setVisible(bool visible, bool silent = false) override { _isVisible = visible; _contentIsDirty = true; }
153 
154  void setFont(uint16 fontID, uint16 fontSize);
155 
156  void printMenu(int level = 0, MacMenuSubMenu *submenu = nullptr);
157 
158  virtual void closeMenu();
159 
160  bool checkIntersects(Common::Rect &rect);
161 
162  // macmenuItem operations
163  void setCheckMark(MacMenuItem *menuItem, bool checkMark);
164  bool getCheckMark(MacMenuItem *menuItem);
165 
166  void setEnabled(MacMenuItem *menuItem, bool enabled);
167  bool getEnabled(MacMenuItem *menuItem);
168 
169  void setName(MacMenuItem *menuItem, const Common::String &name);
170  Common::String getName(MacMenuItem *menuItem);
171 
172  void setAction(MacMenuItem *menuItem, int actionId);
173  int getAction(MacMenuItem *menuItem);
174 
175  int getLastSelectedMenuItem() { return _lastActiveItem; };
176  int getLastSelectedSubmenuItem() { return _lastActiveSubItem; };
177  void getMenuShortCut(uint16 key, int &menuItem, int &submenuItem);
178 
179  void renderSubmenu(MacMenuSubMenu *menu, bool recursive = true);
180 
181  int getScrollDirection() { return _scrollDirection; }
182 
183  int getDropdownItemHeight() { return _menuDropdownItemHeight; }
184 
185  void setOverlayDirty(bool dirty) { _overlayDirty = dirty; _contentIsDirty |= dirty; }
186 
188 
189 protected:
190  Common::Rect _bbox;
191  ItemArray _items;
192  bool _isVisible;
193  bool _dimensionsDirty;
194  bool _overlayDirty;
195  int _menuDropdownItemHeight;
196 
197  int _activeItem;
198  int _activeSubItem;
199 
200  bool _isModal;
201 
202  void calcSubMenuBounds(MacMenuSubMenu *menu, int x, int y);
203 
204 private:
205  ManagedSurface _tempSurface;
206  TextAlign _align;
207  int _menuLeftDropdownPadding;
208  int _menuRightDropdownPadding;
209 
210 private:
211  bool checkCallback(bool unicode = false);
212  const Font *getMenuFont(int slant = kMacFontRegular);
213  Common::CodePage getMenuEncoding() const;
214  const Common::String getAcceleratorString(MacMenuItem *item, const char *prefix);
215  void processTabs();
216  void processSubmenuTabs(MacMenuSubMenu *submenu);
217 
218  int calcSubMenuWidth(MacMenuSubMenu *menu);
219 
220  bool keyEvent(Common::Event &event);
221  bool mouseRelease(int x, int y);
222  bool mouseMove(int x, int y);
223 
224  bool processMenuShortCut(uint16 ascii);
225 
226  void drawSubMenuArrow(ManagedSurface *dst, int x, int y, int color);
227  bool contains(int x, int y);
228 
229  void drawScrollArrow(int arrowX, int arrowY, int direction);
230 
231  MacMenuItem *findMenuItem(const Common::String &menuId, const Common::String &itemId);
232  MacMenuItem *findMenuItem(int menuId, int itemId);
233 
234 
235  uint16 _fontID;
236  uint16 _fontSize;
237  const Font *_font;
238  Font *_loadedFont;
239 
240  int _lastActiveItem;
241  int _lastActiveSubItem;
242 
243  int _selectedItem;
244 
245  bool _scrollTimerActive;
246  int _scrollDirection;
247 
248  void (*_ccallback)(int action, Common::String &text, void *data);
249  void (*_unicodeccallback)(int action, Common::U32String &text, void *data);
250  void *_cdata;
251 };
252 
253 } // End of namespace Graphics
254 
255 #endif
Definition: managed_surface.h:51
Definition: macmenu.h:87
Definition: macresman.h:126
Definition: str.h:59
Definition: font.h:83
Definition: winexe_pe.h:48
TextAlign
Definition: font.h:48
bool draw(bool forceRedraw=false) override
Definition: macmenu.h:140
ManagedSurface * getBorderSurface() override
Definition: macmenu.h:100
Definition: rect.h:536
Definition: stream.h:745
Definition: macwindowmanager.h:149
Definition: macmenu.h:42
Definition: ustr.h:57
Definition: events.h:218
Definition: algorithm.h:29
Definition: formatinfo.h:28
void setVisible(bool visible, bool silent=false) override
Definition: macmenu.h:152
bool isDirty() override
Definition: macmenu.h:102
Definition: macmenu.h:95
size_type size() const
Definition: array.h:316
Definition: macmenu.h:59
Definition: macwindow.h:80
const Common::Rect & getInnerDimensions() override
Definition: macmenu.h:101