[Scummvm-git-logs] scummvm master -> 35773e76b9835bcd07416c0ffc5d494cb8afe0ee

sev- sev at scummvm.org
Fri Oct 4 15:55:09 CEST 2019


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
72a5d9d4ba JANITORIAL: Whitespace fixes
dbf56a3b29 COMMON: Add methods to U32String to match String
48b261cf6b GRAPHICS: MACGUI: Implement Windows-style shortcut underlining
35773e76b9 GRAPHICS: MACGUI: Unify MacMenuItem and MacMenuSubItem


Commit: 72a5d9d4baa569c4f3904fd8180a07da937090ed
    https://github.com/scummvm/scummvm/commit/72a5d9d4baa569c4f3904fd8180a07da937090ed
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-04T15:54:48+02:00

Commit Message:
JANITORIAL: Whitespace fixes

Changed paths:
    common/ustr.cpp


diff --git a/common/ustr.cpp b/common/ustr.cpp
index f3d1b7b..c53c428 100644
--- a/common/ustr.cpp
+++ b/common/ustr.cpp
@@ -500,7 +500,7 @@ String convertUtf32ToUtf8(const U32String &u32str) {
 			bytesToWrite = 3;
 			ch = 0x0000FFFD;
 		}
-		
+
 		Common::String buffer;
 
 		switch (bytesToWrite) {
@@ -593,15 +593,15 @@ static const uint32 g_windows1253ConversionTable[] = {0x20AC, 0x0081, 0x201A, 0x
 										 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
 										 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x00FF};
 
-static const uint32 g_windows1254ConversionTable[] = {0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 
-										 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x008E, 0x008F, 
-										 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 
-										 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x009E, 0x0178, 
-										 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 
+static const uint32 g_windows1254ConversionTable[] = {0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+										 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x008E, 0x008F,
+										 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+										 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x009E, 0x0178,
+										 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
 										 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
 										 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
 										 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
-										 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 
+										 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
 										 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
 										 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
 										 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
@@ -726,7 +726,7 @@ String convertFromU32String(const U32String &string, CodePage page) {
 			charsetString += string[i];
 			continue;
 		}
-		
+
 		if (!conversionTable) {
 			continue;
 		}
@@ -737,7 +737,7 @@ String convertFromU32String(const U32String &string, CodePage page) {
 				break;
 			}
 		}
-	}	
+	}
 	return charsetString;
 }
 


Commit: dbf56a3b2954330813a47ff86dae17831f9980a6
    https://github.com/scummvm/scummvm/commit/dbf56a3b2954330813a47ff86dae17831f9980a6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-04T15:54:48+02:00

Commit Message:
COMMON: Add methods to U32String to match String

Changed paths:
    common/ustr.cpp
    common/ustr.h


diff --git a/common/ustr.cpp b/common/ustr.cpp
index c53c428..3a78239 100644
--- a/common/ustr.cpp
+++ b/common/ustr.cpp
@@ -232,6 +232,30 @@ void U32String::deleteChar(uint32 p) {
 	_size--;
 }
 
+void U32String::deleteLastChar() {
+	if (_size > 0)
+		deleteChar(_size - 1);
+}
+
+void U32String::erase(uint32 p, uint32 len) {
+	assert(p < _size);
+
+	makeUnique();
+	// If len == npos or p + len is over the end, remove all the way to the end
+	if (len == npos || p + len >= _size) {
+		// Delete char at p as well. So _size = (p - 1) + 1
+		_size = p;
+		// Null terminate
+		_str[_size] = 0;
+		return;
+	}
+
+	for ( ; p + len <= _size; p++) {
+		_str[p] = _str[p + len];
+	}
+	_size -= len;
+}
+
 void U32String::clear() {
 	decRefCount(_extern._refCount);
 
diff --git a/common/ustr.h b/common/ustr.h
index 5205216..431cd96 100644
--- a/common/ustr.h
+++ b/common/ustr.h
@@ -162,6 +162,12 @@ public:
 	 */
 	void deleteChar(uint32 p);
 
+	/** Remove the last character from the string. */
+	void deleteLastChar();
+
+	/** Remove all characters from position p to the p + len. If len = String::npos, removes all characters to the end */
+	void erase(uint32 p, uint32 len = npos);
+
 	/** Clears the string, making it empty. */
 	void clear();
 


Commit: 48b261cf6b3714ed5e9f224149272e2808e00f09
    https://github.com/scummvm/scummvm/commit/48b261cf6b3714ed5e9f224149272e2808e00f09
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-04T15:54:48+02:00

Commit Message:
GRAPHICS: MACGUI: Implement Windows-style shortcut underlining

Changed paths:
    graphics/macgui/macmenu.cpp


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index d8b5a43..a20f320 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -78,15 +78,18 @@ struct MacMenuSubItem {
 	int action;
 	int style;
 	char shortcut;
+	int shortcutPos;
 	bool enabled;
 	Common::Rect bbox;
 
 	MacMenuSubMenu *submenu;
 
-	MacMenuSubItem(const Common::String &t, int a, int s = 0, char sh = 0, bool e = true) :
-			text(t), unicode(false), action(a), style(s), shortcut(sh), enabled(e), submenu(nullptr) {}
-	MacMenuSubItem(const Common::U32String &t, int a, int s = 0, char sh = 0, bool e = true) :
-			unicodeText(t), unicode(true), action(a), style(s), shortcut(sh), enabled(e), submenu(nullptr) {}
+	MacMenuSubItem(const Common::String &t, int a, int s = 0, char sh = 0, int sp = -1, bool e = true) :
+			text(t), unicode(false), action(a), style(s), shortcut(sh),
+			shortcutPos(sp), enabled(e), submenu(nullptr) {}
+	MacMenuSubItem(const Common::U32String &t, int a, int s = 0, char sh = 0, int sp = -1, bool e = true) :
+			unicodeText(t), unicode(true), action(a), style(s), shortcut(sh),
+			shortcutPos(sp), enabled(e), submenu(nullptr) {}
 
 	~MacMenuSubItem();
 };
@@ -118,9 +121,10 @@ struct MacMenuItem {
 	bool unicode;
 	MacMenuSubMenu *submenu;
 	Common::Rect bbox;
+	int shortcutPos;
 
-	MacMenuItem(const Common::String &n) : name(n), unicode(false), submenu(nullptr) {}
-	MacMenuItem(const Common::U32String &n) : unicodeName(n), unicode(true), submenu(nullptr) {}
+	MacMenuItem(const Common::String &n, int sp = -1) : name(n), shortcutPos(sp), unicode(false), submenu(nullptr) {}
+	MacMenuItem(const Common::U32String &n, int sp = -1) : unicodeName(n), shortcutPos(sp), unicode(true), submenu(nullptr) {}
 
 	~MacMenuItem() {
 		if (submenu)
@@ -339,16 +343,18 @@ int MacMenu::addMenuItem(const Common::String &name) {
 int MacMenu::addMenuItem(const Common::U32String &name) {
 	Common::U32String amp("&");
 	Common::U32String res;
+	int shortcutPos = -1;
 
 	for (uint i = 0; i < name.size(); i++)
 		if (name[i] == amp[0]) {
 			//shortcut = amp[0] & 0xff;
+			shortcutPos = i;
 		} else {
 			res += name[i];
 		}
 
 
-	MacMenuItem *i = new MacMenuItem(res);
+	MacMenuItem *i = new MacMenuItem(res, shortcutPos);
 	_items.push_back(i);
 
 	_dimensionsDirty = true;
@@ -372,7 +378,7 @@ void MacMenu::addMenuSubItem(int id, const Common::String &text, int action, int
 	if (_items[id]->submenu == nullptr)
 		_items[id]->submenu = new MacMenuSubMenu();
 
-	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
+	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, -1, enabled));
 }
 
 void MacMenu::addMenuSubItem(int id, const Common::U32String &text, int action, int style, char shortcut, bool enabled) {
@@ -383,15 +389,17 @@ void MacMenu::addMenuSubItem(int id, const Common::U32String &text, int action,
 
 	Common::U32String amp("&");
 	Common::U32String res;
+	int shortcutPos = -1;
 
 	for (uint i = 0; i < text.size(); i++)
 		if (text[i] == amp[0]) {
-			shortcut = amp[0] & 0xff;
+			shortcut = text[i + 1] & 0xff;
+			shortcutPos = i;
 		} else {
 			res += text[i];
 		}
 
-	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(res, action, style, shortcut, enabled));
+	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(res, action, style, shortcut, shortcutPos, enabled));
 }
 
 void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action, int style, char shortcut, bool enabled) {
@@ -399,7 +407,7 @@ void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::String &text
 
 	_dimensionsDirty = true;
 
-	submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
+	submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, -1, enabled));
 }
 
 void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action, int style, char shortcut, bool enabled) {
@@ -409,15 +417,17 @@ void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::U32String &t
 
 	Common::U32String amp("&");
 	Common::U32String res;
+	int shortcutPos = -1;
 
 	for (uint i = 0; i < text.size(); i++)
 		if (text[i] == amp[0]) {
-			shortcut = amp[0] & 0xff;
+			shortcut = text[i + 1] & 0xff;
+			shortcutPos = i;
 		} else {
 			res += text[i];
 		}
 
-	submenu->subitems.push_back(new MacMenuSubItem(res, action, style, shortcut, enabled));
+	submenu->subitems.push_back(new MacMenuSubItem(res, action, style, shortcut, shortcutPos, enabled));
 }
 
 void MacMenu::calcDimensions() {
@@ -646,6 +656,20 @@ static void drawFilledRoundRect(ManagedSurface *surface, Common::Rect &rect, int
 	drawRoundRect(rect, arc, color, true, drawPixelPlain, surface);
 }
 
+static void underlineAccelerator(ManagedSurface *dst, const Font *font, const Common::U32String &str, int x, int y, int shortcutPos, uint32 color) {
+	if (shortcutPos == -1)
+		return;
+
+	Common::U32String s(str);
+
+	s.erase(shortcutPos + 1);
+	int pos2 = font->getStringWidth(s);
+	s.deleteLastChar();
+	int pos1 = font->getStringWidth(s);
+
+	dst->hLine(x + pos1, y + font->getFontHeight(), x + pos2 - 1, color);
+}
+
 bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 	Common::Rect r(_bbox);
 
@@ -686,12 +710,14 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 			color = _wm->_colorWhite;
 		}
 
+		int x = it->bbox.left + kMenuLeftMargin;
+		int y = it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1);
+
 		if (it->unicode) {
-			_font->drawString(&_screen, it->unicodeName, it->bbox.left + kMenuLeftMargin,
-							  it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color);
+			_font->drawString(&_screen, it->unicodeName, x, y, it->bbox.width(), color);
+			underlineAccelerator(&_screen, _font, it->unicodeName, x, y, it->shortcutPos, color);
 		} else {
-			_font->drawString(&_screen, it->name, it->bbox.left + kMenuLeftMargin,
-							  it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color);
+			_font->drawString(&_screen, it->name, x, y, it->bbox.width(), color);
 		}
 	}
 
@@ -726,7 +752,7 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 		Common::String acceleratorText(getAcceleratorString(menu->subitems[i], ""));
 
 		Common::U32String unicodeText(menu->subitems[i]->unicodeText);
-		// add unicode accelerator
+		int shortcutPos = menu->subitems[i]->shortcutPos;
 
 		int accelX = r->right - 25;
 		int arrowX = r->right - 14;
@@ -752,12 +778,14 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 				_tempSurface.clear(kColorGreen);
 			}
 
-			if (menu->subitems[i]->unicode)
+			if (menu->subitems[i]->unicode) {
 				_font->drawString(s, unicodeText, tx, ty, r->width(), color);
-			else
+				underlineAccelerator(s, _font, unicodeText, tx, ty, shortcutPos, color);
+			} else {
 				_font->drawString(s, text, tx, ty, r->width(), color);
+			}
 
-			if (!acceleratorText.empty())
+			if (!acceleratorText.empty() && shortcutPos == -1)
 				_font->drawString(s, acceleratorText, accelX, ty, r->width(), color);
 
 			if (menu->subitems[i]->submenu != nullptr)


Commit: 35773e76b9835bcd07416c0ffc5d494cb8afe0ee
    https://github.com/scummvm/scummvm/commit/35773e76b9835bcd07416c0ffc5d494cb8afe0ee
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-04T15:54:48+02:00

Commit Message:
GRAPHICS: MACGUI: Unify MacMenuItem and MacMenuSubItem

Changed paths:
    engines/macventure/gui.cpp
    engines/wage/gui.cpp
    graphics/macgui/macmenu.cpp
    graphics/macgui/macmenu.h


diff --git a/engines/macventure/gui.cpp b/engines/macventure/gui.cpp
index cc1de7c..d7b6405 100644
--- a/engines/macventure/gui.cpp
+++ b/engines/macventure/gui.cpp
@@ -410,7 +410,7 @@ bool Gui::loadMenus() {
 	if ((resArray = _resourceManager->getResIDArray(MKTAG('M', 'E', 'N', 'U'))).size() == 0)
 		return false;
 
-	_menu->addMenuSubItem(0, "Abb", kMenuActionAbout, 0, 'A', true);
+	_menu->addMenuItem(nullptr, "Abb", kMenuActionAbout, 0, 'A', true);
 
 	int i = 1;
 	for (iter = resArray.begin(); iter != resArray.end(); ++iter) {
@@ -430,7 +430,8 @@ bool Gui::loadMenus() {
 		title[titleLength] = '\0';
 
 		if (titleLength > 1) {
-			_menu->addMenuItem(title);
+			_menu->addMenuItem(nullptr, title);
+			Graphics::MacMenuSubMenu *submenu = _menu->addSubMenu(nullptr);
 
 			// Read submenu items
 			while ((titleLength = res->readByte())) {
@@ -445,7 +446,7 @@ bool Gui::loadMenus() {
 				res->readUint16BE();
 				// Read style
 				style = res->readUint16BE();
-				_menu->addMenuSubItem(i, title, 0, style, key, false);
+				_menu->addMenuItem(submenu, title, 0, style, key, false);
 			}
 		}
 
diff --git a/engines/wage/gui.cpp b/engines/wage/gui.cpp
index 9538da1..99dcfca 100644
--- a/engines/wage/gui.cpp
+++ b/engines/wage/gui.cpp
@@ -100,13 +100,14 @@ Gui::Gui(WageEngine *engine) {
 	_menu->setCommandsCallback(menuCommandsCallback, this);
 
 	_menu->addStaticMenus(menuSubItems);
-	_menu->addMenuSubItem(kMenuAbout, _engine->_world->getAboutMenuItemName(), kMenuActionAbout);
+	_menu->addSubMenu(nullptr, kMenuAbout);
+	_menu->addMenuItem(_menu->getSubmenu(nullptr, kMenuAbout), _engine->_world->getAboutMenuItemName(), kMenuActionAbout);
 
-	_commandsMenuId = _menu->addMenuItem(_engine->_world->_commandsMenuName);
+	_commandsMenuId = _menu->addMenuItem(nullptr, _engine->_world->_commandsMenuName);
 	regenCommandsMenu();
 
 	if (!_engine->_world->_weaponMenuDisabled) {
-		_weaponsMenuId = _menu->addMenuItem(_engine->_world->_weaponsMenuName);
+		_weaponsMenuId = _menu->addMenuItem(nullptr, _engine->_world->_weaponsMenuName);
 
 		regenWeaponsMenu();
 	} else {
@@ -221,6 +222,10 @@ void Gui::regenWeaponsMenu() {
 
 	bool empty = true;
 
+	Graphics::MacMenuSubMenu *submenu = _menu->getSubmenu(nullptr, _weaponsMenuId);
+	if (submenu == nullptr)
+		submenu = _menu->addSubMenu(nullptr, _weaponsMenuId);
+
 	for (uint i = 0; i < weapons->size(); i++) {
 		Obj *obj = (*weapons)[i];
 		if (obj->_type == Obj::REGULAR_WEAPON ||
@@ -230,7 +235,7 @@ void Gui::regenWeaponsMenu() {
 			command += " ";
 			command += obj->_name;
 
-			_menu->addMenuSubItem(_weaponsMenuId, command, kMenuActionCommand, 0, 0, true);
+			_menu->addMenuItem(submenu, command, kMenuActionCommand, 0, 0, true);
 
 			empty = false;
 		}
@@ -238,7 +243,7 @@ void Gui::regenWeaponsMenu() {
 	delete weapons;
 
 	if (empty)
-		_menu->addMenuSubItem(_weaponsMenuId, "You have no weapons", 0, 0, 0, false);
+		_menu->addMenuItem(submenu, "You have no weapons", 0, 0, 0, false);
 }
 
 bool Gui::processEvent(Common::Event &event) {
diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index a20f320..51ab94f 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -69,9 +69,19 @@ enum {
 
 struct MacMenuSubMenu;
 
-typedef Common::Array<MacMenuSubItem *> SubItemArray;
+struct MacMenuSubMenu {
+	ItemArray items;
+	Common::Rect bbox;
+	int highlight;
+
+	MacMenuSubMenu() : highlight(-1) {}
+
+	~MacMenuSubMenu();
 
-struct MacMenuSubItem {
+	int ytoItem(int y) { return MIN<int>((y - bbox.top) / kMenuDropdownItemHeight, items.size() - 1); }
+};
+
+struct MacMenuItem {
 	Common::String text;
 	Common::U32String unicodeText;
 	bool unicode;
@@ -84,54 +94,24 @@ struct MacMenuSubItem {
 
 	MacMenuSubMenu *submenu;
 
-	MacMenuSubItem(const Common::String &t, int a, int s = 0, char sh = 0, int sp = -1, bool e = true) :
+	MacMenuItem(const Common::String &t, int a = -1, int s = 0, char sh = 0, int sp = -1, bool e = true) :
 			text(t), unicode(false), action(a), style(s), shortcut(sh),
 			shortcutPos(sp), enabled(e), submenu(nullptr) {}
-	MacMenuSubItem(const Common::U32String &t, int a, int s = 0, char sh = 0, int sp = -1, bool e = true) :
+	MacMenuItem(const Common::U32String &t, int a = -1, int s = 0, char sh = 0, int sp = -1, bool e = true) :
 			unicodeText(t), unicode(true), action(a), style(s), shortcut(sh),
 			shortcutPos(sp), enabled(e), submenu(nullptr) {}
 
-	~MacMenuSubItem();
-};
-
-struct MacMenuSubMenu {
-	SubItemArray subitems;
-	Common::Rect bbox;
-	int highlight;
-
-	MacMenuSubMenu() : highlight(-1) {}
-
-	~MacMenuSubMenu() {
-		for (uint i = 0; i < subitems.size(); i++)
-			delete subitems[i];
-	}
-
-	int ytoItem(int y) { return MIN<int>((y - bbox.top) / kMenuDropdownItemHeight, subitems.size() - 1); }
-};
-
-MacMenuSubItem::~MacMenuSubItem() {
-	if (submenu)
-		delete submenu;
-}
-
-
-struct MacMenuItem {
-	Common::String name;
-	Common::U32String unicodeName;
-	bool unicode;
-	MacMenuSubMenu *submenu;
-	Common::Rect bbox;
-	int shortcutPos;
-
-	MacMenuItem(const Common::String &n, int sp = -1) : name(n), shortcutPos(sp), unicode(false), submenu(nullptr) {}
-	MacMenuItem(const Common::U32String &n, int sp = -1) : unicodeName(n), shortcutPos(sp), unicode(true), submenu(nullptr) {}
-
 	~MacMenuItem() {
 		if (submenu)
 			delete submenu;
 	}
 };
 
+MacMenuSubMenu::~MacMenuSubMenu() {
+	for (uint i = 0; i < items.size(); i++)
+		delete items[i];
+}
+
 MacMenu::MacMenu(int id, const Common::Rect &bounds, MacWindowManager *wm)
 		: BaseMacWindow(id, false, wm) {
 	_font = getMenuFont();
@@ -241,10 +221,10 @@ MacMenu *MacMenu::createMenuFromPEexe(Common::PEResources &exe, MacWindowManager
 		uint16 flags = menuData->readUint16LE();
 		if (flags & kPopUp) {
 			if (depth == 0) {
-				menu->addMenuItem(readUnicodeString(menuData));
+				menu->addMenuItem(nullptr, readUnicodeString(menuData));
 			} else {
 				Common::U32String name = readUnicodeString(menuData);
-				menu->addSubMenuItem(menus.top(), name, action, 0, 0, !(flags & kGrayed));
+				menu->addMenuItem(menus.top(), name, action, 0, 0, !(flags & kGrayed));
 				action++;
 			}
 
@@ -259,7 +239,7 @@ MacMenu *MacMenu::createMenuFromPEexe(Common::PEResources &exe, MacWindowManager
 			menuData->readUint16LE(); // menu id
 			Common::U32String name = readUnicodeString(menuData);
 			if (depth > 0) {
-				menu->addSubMenuItem(menus.top(), name, action, 0, 0, !(flags & kGrayed));
+				menu->addMenuItem(menus.top(), name, action, 0, 0, !(flags & kGrayed));
 			}
 			if (!name.empty()) {
 				action++;
@@ -293,21 +273,21 @@ MacMenu *MacMenu::createMenuFromPEexe(Common::PEResources &exe, MacWindowManager
 void MacMenu::printMenu(int level, MacMenuSubMenu *submenu) {
 	if (!level) {
 		for (uint i = 0; i < _items.size(); i++) {
-			debug("0. %s", _items[i]->unicode ? convertFromU32String(_items[i]->unicodeName).c_str() : _items[i]->name.c_str());
+			debug("0. %s", _items[i]->unicode ? convertFromU32String(_items[i]->unicodeText).c_str() : _items[i]->text.c_str());
 
 			if (_items[i]->submenu != nullptr)
 				printMenu(level + 1, _items[i]->submenu);
 		}
 	} else {
-		for (uint i = 0; i < submenu->subitems.size(); i++) {
+		for (uint i = 0; i < submenu->items.size(); i++) {
 			debugN("%d. ", level);
 			for (int j = 0; j < level; j++)
 				debugN("  ");
 
-			debug("%s", submenu->subitems[i]->unicode ? convertFromU32String(submenu->subitems[i]->unicodeText).c_str() : submenu->subitems[i]->text.c_str());
+			debug("%s", submenu->items[i]->unicode ? convertFromU32String(submenu->items[i]->unicodeText).c_str() : submenu->items[i]->text.c_str());
 
-			if (submenu->subitems[i]->submenu != nullptr)
-				printMenu(level + 1, submenu->subitems[i]->submenu);
+			if (submenu->items[i]->submenu != nullptr)
+				printMenu(level + 1, submenu->items[i]->submenu);
 		}
 	}
 }
@@ -318,101 +298,75 @@ void MacMenu::addStaticMenus(const MacMenuData *data) {
 
 	for (int i = 0; data[i].menunum; i++) {
 		const MacMenuData *m = &data[i];
+		MacMenuSubMenu *submenu = getSubmenu(nullptr, m->menunum);
 
 		if (m->menunum == kMenuHighLevel) {
-			addMenuItem(m->title);
+			addMenuItem(nullptr, m->title);
 
 			continue;
 		}
 
-		addMenuSubItem(m->menunum, m->title, m->action, 0, m->shortcut, m->enabled);
+		if (submenu == nullptr)
+			submenu = addSubMenu(nullptr, m->menunum);
+
+		addMenuItem(submenu, m->title, m->action, 0, m->shortcut, m->enabled);
 	}
 
+	printMenu();
+
 	calcDimensions();
 }
 
-int MacMenu::addMenuItem(const Common::String &name) {
-	MacMenuItem *i = new MacMenuItem(name);
-	_items.push_back(i);
-
+MacMenuSubMenu *MacMenu::addSubMenu(MacMenuSubMenu *submenu, int index) {
 	_dimensionsDirty = true;
 
-	return _items.size() - 1;
-}
-
-int MacMenu::addMenuItem(const Common::U32String &name) {
-	Common::U32String amp("&");
-	Common::U32String res;
-	int shortcutPos = -1;
-
-	for (uint i = 0; i < name.size(); i++)
-		if (name[i] == amp[0]) {
-			//shortcut = amp[0] & 0xff;
-			shortcutPos = i;
-		} else {
-			res += name[i];
-		}
-
-
-	MacMenuItem *i = new MacMenuItem(res, shortcutPos);
-	_items.push_back(i);
+	if (submenu == nullptr) {
+		if (index == -1)
+			index = _items.size() - 1;
 
-	_dimensionsDirty = true;
+		if (_items[index]->submenu != nullptr)
+			warning("Overwritting submenu #%d", index);
+		return (_items[index]->submenu = new MacMenuSubMenu());
+	} else {
+		if (index == -1)
+			index = submenu->items.size() - 1;
 
-	return _items.size() - 1;
+		if (submenu->items[index]->submenu != nullptr)
+			warning("Overwritting submenu #%d", index);
+		return (submenu->items[index]->submenu = new MacMenuSubMenu());
+	}
 }
 
-MacMenuSubMenu *MacMenu::addSubMenu(MacMenuSubMenu *submenu) {
-	_dimensionsDirty = true;
-
+MacMenuSubMenu *MacMenu::getSubmenu(MacMenuSubMenu *submenu, int index) {
 	if (submenu == nullptr) {
-		return (_items.back()->submenu = new MacMenuSubMenu());
+		if (index >= _items.size())
+			return nullptr;
+		return _items[index]->submenu;
 	} else {
-		return (submenu->subitems.back()->submenu = new MacMenuSubMenu());
+		if (index >= submenu->items.size())
+			return nullptr;
+		return submenu->items[index]->submenu;
 	}
 }
 
-void MacMenu::addMenuSubItem(int id, const Common::String &text, int action, int style, char shortcut, bool enabled) {
+int MacMenu::addMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action, int style, char shortcut, bool enabled) {
 	_dimensionsDirty = true;
 
-	if (_items[id]->submenu == nullptr)
-		_items[id]->submenu = new MacMenuSubMenu();
+	if (submenu == nullptr) {
+		MacMenuItem *i = new MacMenuItem(text);
+		_items.push_back(i);
 
-	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, -1, enabled));
-}
+		return _items.size() - 1;
+	}
 
-void MacMenu::addMenuSubItem(int id, const Common::U32String &text, int action, int style, char shortcut, bool enabled) {
 	_dimensionsDirty = true;
 
-	if (_items[id]->submenu == nullptr)
-		_items[id]->submenu = new MacMenuSubMenu();
-
-	Common::U32String amp("&");
-	Common::U32String res;
-	int shortcutPos = -1;
+	submenu->items.push_back(new MacMenuItem(text, action, style, shortcut, -1, enabled));
 
-	for (uint i = 0; i < text.size(); i++)
-		if (text[i] == amp[0]) {
-			shortcut = text[i + 1] & 0xff;
-			shortcutPos = i;
-		} else {
-			res += text[i];
-		}
-
-	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(res, action, style, shortcut, shortcutPos, enabled));
-}
-
-void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action, int style, char shortcut, bool enabled) {
-	assert(submenu != nullptr);
-
-	_dimensionsDirty = true;
-
-	submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, -1, enabled));
+	return submenu->items.size() - 1;
 }
 
-void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action, int style, char shortcut, bool enabled) {
-	assert(submenu != nullptr);
-
+int MacMenu::addMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action, int style, char shortcut, bool enabled) {
 	_dimensionsDirty = true;
 
 	Common::U32String amp("&");
@@ -427,7 +381,15 @@ void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::U32String &t
 			res += text[i];
 		}
 
-	submenu->subitems.push_back(new MacMenuSubItem(res, action, style, shortcut, shortcutPos, enabled));
+	if (submenu == nullptr) {
+		_items.push_back(new MacMenuItem(res, -1, 0, shortcut, shortcutPos));
+
+		return _items.size() - 1;
+	}
+
+	submenu->items.push_back(new MacMenuItem(res, action, style, shortcut, shortcutPos, enabled));
+
+	return submenu->items.size() - 1;
 }
 
 void MacMenu::calcDimensions() {
@@ -436,7 +398,7 @@ void MacMenu::calcDimensions() {
 	int x = 18;
 
 	for (uint i = 0; i < _items.size(); i++) {
-		int w = _items[i]->unicode ? _font->getStringWidth(_items[i]->unicodeName) : _font->getStringWidth(_items[i]->name);
+		int w = _items[i]->unicode ? _font->getStringWidth(_items[i]->unicodeText) : _font->getStringWidth(_items[i]->text);
 
 		if (_items[i]->bbox.bottom == 0) {
 			_items[i]->bbox.left = x - kMenuLeftMargin;
@@ -466,7 +428,8 @@ void MacMenu::loadMenuResource(Common::MacResManager *resFork, uint16 id) {
 	Common::String menuTitle = res->readPascalString();
 
 	if (!menuTitle.empty()) {
-		int menu = addMenuItem(menuTitle);
+		addMenuItem(nullptr, menuTitle);
+		MacMenuSubMenu *submenu = addSubMenu(nullptr);
 		initialState >>= 1;
 
 		// Read submenu items
@@ -481,7 +444,8 @@ void MacMenu::loadMenuResource(Common::MacResManager *resFork, uint16 id) {
 			/* uint8 mark = */ res->readByte();
 			uint8 style = res->readByte();
 
-			addMenuSubItem(menu, subMenuTitle, action++, style, key, initialState & 1);
+			addMenuItem(submenu, subMenuTitle, action++, style, key, initialState & 1);
+
 			initialState >>= 1;
 		}
 	}
@@ -505,10 +469,10 @@ void MacMenu::clearSubMenu(int id) {
 	if (menu->submenu == nullptr)
 		return;
 
-	for (uint j = 0; j < menu->submenu->subitems.size(); j++)
-		delete menu->submenu->subitems[j];
+	for (uint j = 0; j < menu->submenu->items.size(); j++)
+		delete menu->submenu->items[j];
 
-	menu->submenu->subitems.clear();
+	menu->submenu->items.clear();
 }
 
 void MacMenu::createSubMenuFromString(int id, const char *str, int commandId) {
@@ -516,13 +480,17 @@ void MacMenu::createSubMenuFromString(int id, const char *str, int commandId) {
 
 	Common::String string(str);
 	Common::String item;
+	MacMenuSubMenu *submenu = getSubmenu(nullptr, id);
+
+	if (submenu == nullptr)
+		submenu = addSubMenu(nullptr, id);
 
 	for (uint i = 0; i < string.size(); i++) {
 		while(i < string.size() && string[i] != ';') // Read token
 			item += string[i++];
 
 		if (item == "(-") {
-			addMenuSubItem(id, NULL, 0);
+			addMenuItem(submenu, NULL, 0);
 		} else {
 			bool enabled = true;
 			int style = 0;
@@ -571,7 +539,7 @@ void MacMenu::createSubMenuFromString(int id, const char *str, int commandId) {
 					}
 			}
 
-			addMenuSubItem(id, item, commandId, style, shortcut, enabled);
+			addMenuItem(submenu, item, commandId, style, shortcut, enabled);
 		}
 
 		item.clear();
@@ -582,7 +550,7 @@ const Font *MacMenu::getMenuFont() {
 	return _wm->_fontMan->getFont(Graphics::MacFont(kMacFontChicago, 12));
 }
 
-const Common::String MacMenu::getAcceleratorString(MacMenuSubItem *item, const char *prefix) {
+const Common::String MacMenu::getAcceleratorString(MacMenuItem *item, const char *prefix) {
 	if (item->shortcut == 0)
 		return Common::String();
 
@@ -594,8 +562,8 @@ int MacMenu::calcSubMenuWidth(MacMenuSubMenu *submenu) {
 	if (submenu == nullptr)
 		return maxWidth;
 
-	for (uint i = 0; i < submenu->subitems.size(); i++) {
-		MacMenuSubItem *item = submenu->subitems[i];
+	for (uint i = 0; i < submenu->items.size(); i++) {
+		MacMenuItem *item = submenu->items[i];
 		if (!item->text.empty()) {
 			Common::String text(item->text);
 			Common::String acceleratorText(getAcceleratorString(item, "  "));
@@ -630,15 +598,15 @@ void MacMenu::calcSubMenuBounds(MacMenuSubMenu *submenu, int x, int y) {
 	int x1 = x;
 	int y1 = y;
 	int x2 = x1 + maxWidth + kMenuDropdownPadding * 2 - 4;
-	int y2 = y1 + submenu->subitems.size() * kMenuDropdownItemHeight + 2;
+	int y2 = y1 + submenu->items.size() * kMenuDropdownItemHeight + 2;
 
 	submenu->bbox.left = x1;
 	submenu->bbox.top = y1;
 	submenu->bbox.right = x2;
 	submenu->bbox.bottom = y2;
 
-	for (uint i = 0; i < submenu->subitems.size(); i++) {
-		MacMenuSubMenu *menu = submenu->subitems[i]->submenu;
+	for (uint i = 0; i < submenu->items.size(); i++) {
+		MacMenuSubMenu *menu = submenu->items[i]->submenu;
 
 		if (menu != nullptr)
 			calcSubMenuBounds(menu, x2 - 4, y1 + i * kMenuDropdownItemHeight + 1);
@@ -714,10 +682,10 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 		int y = it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1);
 
 		if (it->unicode) {
-			_font->drawString(&_screen, it->unicodeName, x, y, it->bbox.width(), color);
-			underlineAccelerator(&_screen, _font, it->unicodeName, x, y, it->shortcutPos, color);
+			_font->drawString(&_screen, it->unicodeText, x, y, it->bbox.width(), color);
+			underlineAccelerator(&_screen, _font, it->unicodeText, x, y, it->shortcutPos, color);
 		} else {
-			_font->drawString(&_screen, it->name, x, y, it->bbox.width(), color);
+			_font->drawString(&_screen, it->text, x, y, it->bbox.width(), color);
 		}
 	}
 
@@ -747,18 +715,18 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 
 	int x = r->left + kMenuDropdownPadding;
 	int y = r->top + 1;
-	for (uint i = 0; i < menu->subitems.size(); i++) {
-		Common::String text(menu->subitems[i]->text);
-		Common::String acceleratorText(getAcceleratorString(menu->subitems[i], ""));
+	for (uint i = 0; i < menu->items.size(); i++) {
+		Common::String text(menu->items[i]->text);
+		Common::String acceleratorText(getAcceleratorString(menu->items[i], ""));
 
-		Common::U32String unicodeText(menu->subitems[i]->unicodeText);
-		int shortcutPos = menu->subitems[i]->shortcutPos;
+		Common::U32String unicodeText(menu->items[i]->unicodeText);
+		int shortcutPos = menu->items[i]->shortcutPos;
 
 		int accelX = r->right - 25;
 		int arrowX = r->right - 14;
 
 		int color = _wm->_colorBlack;
-		if (i == (uint)menu->highlight && (!text.empty() || !unicodeText.empty()) && menu->subitems[i]->enabled) {
+		if (i == (uint)menu->highlight && (!text.empty() || !unicodeText.empty()) && menu->items[i]->enabled) {
 			color = _wm->_colorWhite;
 			Common::Rect trect(r->left, y - (_wm->_fontMan->hasBuiltInFonts() ? 1 : 0), r->right, y + _font->getFontHeight());
 
@@ -769,7 +737,7 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 			ManagedSurface *s = &_screen;
 			int tx = x, ty = y;
 
-			if (!menu->subitems[i]->enabled) {
+			if (!menu->items[i]->enabled) {
 				s = &_tempSurface;
 				tx = 0;
 				ty = 0;
@@ -778,7 +746,7 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 				_tempSurface.clear(kColorGreen);
 			}
 
-			if (menu->subitems[i]->unicode) {
+			if (menu->items[i]->unicode) {
 				_font->drawString(s, unicodeText, tx, ty, r->width(), color);
 				underlineAccelerator(s, _font, unicodeText, tx, ty, shortcutPos, color);
 			} else {
@@ -788,10 +756,10 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 			if (!acceleratorText.empty() && shortcutPos == -1)
 				_font->drawString(s, acceleratorText, accelX, ty, r->width(), color);
 
-			if (menu->subitems[i]->submenu != nullptr)
+			if (menu->items[i]->submenu != nullptr)
 				drawSubMenuArrow(s, arrowX, ty, color);
 
-			if (!menu->subitems[i]->enabled) {
+			if (!menu->items[i]->enabled) {
 				// I am lazy to extend drawString() with plotProc as a parameter, so
 				// fake it here
 				for (int ii = 0; ii < _tempSurface.h; ii++) {
@@ -818,8 +786,8 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 		y += kMenuDropdownItemHeight;
 	}
 
-	if (recursive && menu->highlight != -1 && menu->subitems[menu->highlight]->submenu != nullptr)
-		renderSubmenu(menu->subitems[menu->highlight]->submenu, false);
+	if (recursive && menu->highlight != -1 && menu->items[menu->highlight]->submenu != nullptr)
+		renderSubmenu(menu->items[menu->highlight]->submenu, false);
 
 	_contentIsDirty = true;
 	//g_system->copyRectToScreen(_screen.getBasePtr(r->left, r->top), _screen.pitch, r->left, r->top, r->width() + 2, r->height() + 2);
@@ -911,9 +879,9 @@ bool MacMenu::mouseClick(int x, int y) {
 		return true;
 	}
 
-	if (_activeSubItem != -1 && _menustack.back()->subitems[_activeSubItem]->submenu != nullptr) {
-		if (_menustack.back()->subitems[_activeSubItem]->submenu->bbox.contains(x, y)) {
-			_menustack.push_back(_menustack.back()->subitems[_activeSubItem]->submenu);
+	if (_activeSubItem != -1 && _menustack.back()->items[_activeSubItem]->submenu != nullptr) {
+		if (_menustack.back()->items[_activeSubItem]->submenu->bbox.contains(x, y)) {
+			_menustack.push_back(_menustack.back()->items[_activeSubItem]->submenu);
 
 			_activeSubItem = 0;
 			_contentIsDirty = true;
@@ -981,13 +949,13 @@ bool MacMenu::mouseRelease(int x, int y) {
 			g_system->copyRectToScreen(_wm->_screenCopy->getBasePtr(0, 0), _wm->_screenCopy->pitch, 0, 0, _wm->_screenCopy->w, _wm->_screenCopy->h);
 		}
 
-		if (_activeItem != -1 && _activeSubItem != -1 && _menustack.back()->subitems[_activeSubItem]->enabled) {
-			if (_menustack.back()->subitems[_activeSubItem]->unicode) {
-				(*_unicodeccallback)(_menustack.back()->subitems[_activeSubItem]->action,
-							  _menustack.back()->subitems[_activeSubItem]->unicodeText, _cdata);
+		if (_activeItem != -1 && _activeSubItem != -1 && _menustack.back()->items[_activeSubItem]->enabled) {
+			if (_menustack.back()->items[_activeSubItem]->unicode) {
+				(*_unicodeccallback)(_menustack.back()->items[_activeSubItem]->action,
+							  _menustack.back()->items[_activeSubItem]->unicodeText, _cdata);
 			} else {
-				(*_ccallback)(_menustack.back()->subitems[_activeSubItem]->action,
-							  _menustack.back()->subitems[_activeSubItem]->text, _cdata);
+				(*_ccallback)(_menustack.back()->items[_activeSubItem]->action,
+							  _menustack.back()->items[_activeSubItem]->text, _cdata);
 			}
 		}
 
@@ -1009,12 +977,12 @@ bool MacMenu::processMenuShortCut(byte flags, uint16 ascii) {
 	if (flags & (Common::KBD_CTRL | Common::KBD_META)) {
 		for (uint i = 0; i < _items.size(); i++)
 			if (_items[i]->submenu != nullptr) {
-				for (uint j = 0; j < _items[i]->submenu->subitems.size(); j++)
-					if (_items[i]->submenu->subitems[j]->enabled && tolower(_items[i]->submenu->subitems[j]->shortcut) == ascii) {
-						if (_items[i]->submenu->subitems[j]->unicode) {
-							(*_unicodeccallback)(_items[i]->submenu->subitems[j]->action, _items[i]->submenu->subitems[j]->unicodeText, _cdata);
+				for (uint j = 0; j < _items[i]->submenu->items.size(); j++)
+					if (_items[i]->submenu->items[j]->enabled && tolower(_items[i]->submenu->items[j]->shortcut) == ascii) {
+						if (_items[i]->submenu->items[j]->unicode) {
+							(*_unicodeccallback)(_items[i]->submenu->items[j]->action, _items[i]->submenu->items[j]->unicodeText, _cdata);
 						} else {
-							(*_ccallback)(_items[i]->submenu->subitems[j]->action, _items[i]->submenu->subitems[j]->text, _cdata);
+							(*_ccallback)(_items[i]->submenu->items[j]->action, _items[i]->submenu->items[j]->text, _cdata);
 						}
 						return true;
 					}
@@ -1028,9 +996,9 @@ void MacMenu::enableCommand(int menunum, int action, bool state) {
 	if (!_items[menunum]->submenu)
 		return;
 
-	for (uint i = 0; i < _items[menunum]->submenu->subitems.size(); i++)
-		if (_items[menunum]->submenu->subitems[i]->action == action)
-			_items[menunum]->submenu->subitems[i]->enabled = state;
+	for (uint i = 0; i < _items[menunum]->submenu->items.size(); i++)
+		if (_items[menunum]->submenu->items[i]->action == action)
+			_items[menunum]->submenu->items[i]->enabled = state;
 
 	_contentIsDirty = true;
 }
@@ -1040,7 +1008,7 @@ void MacMenu::enableCommand(const char *menuitem, const char *menuaction, bool s
 
 	while (menunum < _items.size()) {
 		assert(!_items[menunum]->unicode);
-		if (_items[menunum]->name.equalsIgnoreCase(menuitem))
+		if (_items[menunum]->text.equalsIgnoreCase(menuitem))
 			break;
 		else
 			menunum++;
@@ -1049,10 +1017,10 @@ void MacMenu::enableCommand(const char *menuitem, const char *menuaction, bool s
 		return;
 
 	if (_items[menunum]->submenu != nullptr)
-		for (uint i = 0; i < _items[menunum]->submenu->subitems.size(); i++) {
-			assert(!_items[menunum]->submenu->subitems[i]->unicode);
-			if (_items[menunum]->submenu->subitems[i]->text.equalsIgnoreCase(menuaction))
-				_items[menunum]->submenu->subitems[i]->enabled = state;
+		for (uint i = 0; i < _items[menunum]->submenu->items.size(); i++) {
+			assert(!_items[menunum]->submenu->items[i]->unicode);
+			if (_items[menunum]->submenu->items[i]->text.equalsIgnoreCase(menuaction))
+				_items[menunum]->submenu->items[i]->enabled = state;
 		}
 
 	_contentIsDirty = true;
@@ -1063,7 +1031,7 @@ void MacMenu::enableCommand(const Common::U32String &menuitem, const Common::U32
 
 	while (menunum < _items.size()) {
 		assert(_items[menunum]->unicode);
-		if (_items[menunum]->unicodeName.equals(menuitem))
+		if (_items[menunum]->unicodeText.equals(menuitem))
 			break;
 		else
 			menunum++;
@@ -1072,10 +1040,10 @@ void MacMenu::enableCommand(const Common::U32String &menuitem, const Common::U32
 		return;
 
 	if (_items[menunum]->submenu != nullptr)
-		for (uint i = 0; i < _items[menunum]->submenu->subitems.size(); i++) {
-			assert(_items[menunum]->submenu->subitems[i]->unicode);
-			if (_items[menunum]->submenu->subitems[i]->unicodeText.equals(menuaction))
-				_items[menunum]->submenu->subitems[i]->enabled = state;
+		for (uint i = 0; i < _items[menunum]->submenu->items.size(); i++) {
+			assert(_items[menunum]->submenu->items[i]->unicode);
+			if (_items[menunum]->submenu->items[i]->unicodeText.equals(menuaction))
+				_items[menunum]->submenu->items[i]->enabled = state;
 		}
 
 	_contentIsDirty = true;
@@ -1084,8 +1052,8 @@ void MacMenu::enableCommand(const Common::U32String &menuitem, const Common::U32
 void MacMenu::disableAllMenus() {
 	for (uint i = 1; i < _items.size(); i++) // Leave About menu on
 		if (_items[i]->submenu != nullptr)
-			for (uint j = 0; j < _items[i]->submenu->subitems.size(); j++)
-				_items[i]->submenu->subitems[j]->enabled = false;
+			for (uint j = 0; j < _items[i]->submenu->items.size(); j++)
+				_items[i]->submenu->items[j]->enabled = false;
 
 	_contentIsDirty = true;
 }
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index 3b21647..49606f1 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -34,8 +34,8 @@ class MacResManager;
 namespace Graphics {
 
 struct MacMenuItem;
-struct MacMenuSubItem;
 struct MacMenuSubMenu;
+typedef Common::Array<MacMenuItem *> ItemArray;
 
 struct MacMenuData {
 	int menunum;
@@ -59,18 +59,16 @@ public:
 	void addStaticMenus(const MacMenuData *data);
 	void calcDimensions();
 
-	MacMenuSubMenu *addSubMenu(MacMenuSubMenu *submenu);
-	int addMenuItem(const Common::String &name);
-	int addMenuItem(const Common::U32String &name);
-	void addMenuSubItem(int id, const Common::String &text, int action, int style = 0, char shortcut = 0, bool enabled = true);
-	void addMenuSubItem(int id, const Common::U32String &text, int action, int style = 0, char shortcut = 0, bool enabled = true);
-	void addSubMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action, int style = 0, char shortcut = 0, bool enabled = true);
-	void addSubMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action, int style = 0, char shortcut = 0, bool enabled = true);
+	MacMenuSubMenu *addSubMenu(MacMenuSubMenu *submenu, int index = -1);
+	int addMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action = -1, int style = 0, char shortcut = 0, bool enabled = true);
+	int addMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action = 0, int style = 0, char shortcut = 0, bool enabled = true);
 	void loadMenuResource(Common::MacResManager *resFork, uint16 id);
 	void loadMenuBarResource(Common::MacResManager *resFork, uint16 id);
 	void createSubMenuFromString(int id, const char *string, int commandId);
 	void clearSubMenu(int id);
 
+	MacMenuSubMenu *getSubmenu(MacMenuSubMenu *submenu, int index);
+
 	bool draw(ManagedSurface *g, bool forceRedraw = false);
 	bool processEvent(Common::Event &event);
 
@@ -85,6 +83,8 @@ public:
 	bool isVisible() { return _isVisible; }
 	void setVisible(bool visible) { _isVisible = visible; _contentIsDirty = true; }
 
+	void printMenu(int level = 0, MacMenuSubMenu *submenu = nullptr);
+
 	Common::Rect _bbox;
 
 private:
@@ -93,7 +93,7 @@ private:
 
 private:
 	const Font *getMenuFont();
-	const Common::String getAcceleratorString(MacMenuSubItem *item, const char *prefix);
+	const Common::String getAcceleratorString(MacMenuItem *item, const char *prefix);
 	int calcSubMenuWidth(MacMenuSubMenu *menu);
 	void calcSubMenuBounds(MacMenuSubMenu *menu, int x, int y);
 	void renderSubmenu(MacMenuSubMenu *menu, bool recursive = true);
@@ -107,9 +107,7 @@ private:
 
 	void drawSubMenuArrow(ManagedSurface *dst, int x, int y, int color);
 
-	void printMenu(int level = 0, MacMenuSubMenu *submenu = nullptr);
-
-	Common::Array<MacMenuItem *> _items;
+	ItemArray _items;
 
 	const Font *_font;
 





More information about the Scummvm-git-logs mailing list