[Scummvm-git-logs] scummvm master -> e3888d51f4e5cea2da41868375158c19750b68a1

sev- sev at scummvm.org
Sun Oct 13 23:48:53 CEST 2019


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

Summary:
df93f8a658 GRAPHICS: MACGUI: Process tab symbol in Windows menus
e3888d51f4 GRAPHICS: MACGUI: Fix menu width when there is a submenu


Commit: df93f8a65802b1ecd126a51f9edf58ce813a7f2a
    https://github.com/scummvm/scummvm/commit/df93f8a65802b1ecd126a51f9edf58ce813a7f2a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-13T23:48:42+02:00

Commit Message:
GRAPHICS: MACGUI: Process tab symbol in Windows menus

Changed paths:
    graphics/macgui/macmenu.cpp
    graphics/macgui/macmenu.h


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 87298e2..9594aee 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -257,6 +257,9 @@ MacMenu *MacMenu::createMenuFromPEexe(Common::PEResources &exe, MacWindowManager
 			}
 		}
 	}
+
+	menu->processTabs();
+
 	delete menuData;
 
 	if (gDebugLevel > 5)
@@ -556,6 +559,97 @@ const Common::String MacMenu::getAcceleratorString(MacMenuItem *item, const char
 	return Common::String::format("%s%c%c", prefix, (_wm->_fontMan->hasBuiltInFonts() ? '^' : '\x11'), item->shortcut);
 }
 
+void MacMenu::processTabs() {
+	for (uint i = 0; i < _items.size(); i++)
+		processSubmenuTabs(_items[i]->submenu);
+}
+
+void MacMenu::processSubmenuTabs(MacMenuSubMenu *submenu) {
+	if (submenu == nullptr)
+		return;
+
+	for (uint i = 0; i < submenu->items.size(); i++) {
+		MacMenuSubMenu *menu = submenu->items[i]->submenu;
+
+		if (menu != nullptr)
+			processSubmenuTabs(menu);
+	}
+
+	int maxWidth = 0;
+	bool haveTabs = false;
+
+	Common::U32String tabSymbol("\t");
+
+	// First, we replace \t with one space, and thus, obtain
+	// the widest string
+	for (uint i = 0; i < submenu->items.size(); i++) {
+		MacMenuItem *item = submenu->items[i];
+		if (item->unicodeText.empty())
+			continue;
+
+		int pos = item->unicodeText.find(tabSymbol);
+
+		if (pos == Common::U32String::npos)
+			continue;
+
+		// Sanity check
+		if (pos == 0 || pos >= item->unicodeText.size())
+			error("Malformed menu: tab position");
+
+		if (item->unicodeText.find(tabSymbol, pos + 1) != Common::U32String::npos)
+			error("Malformed menu: extra tab");
+
+		haveTabs = true;
+
+		Common::U32String start(item->unicodeText.c_str(), &item->unicodeText.c_str()[pos]);
+		Common::U32String end(&item->unicodeText.c_str()[pos + 1]);
+		Common::U32String res;
+
+		res = start;
+		res += Common::U32String(" ");
+		res += end;
+
+		int width = _font->getStringWidth(res);
+		if (width > maxWidth) {
+			maxWidth = width;
+		}
+	}
+
+	if (!haveTabs)
+		return;
+
+	// Now expand each tab to the relevant width
+	// And yes, right edge is going to be uneven
+	for (uint i = 0; i < submenu->items.size(); i++) {
+		MacMenuItem *item = submenu->items[i];
+		if (item->unicodeText.empty())
+			continue;
+
+		int pos = item->unicodeText.find(tabSymbol);
+
+		if (pos == Common::U32String::npos)
+			continue;
+
+		Common::U32String start(item->unicodeText.c_str(), &item->unicodeText.c_str()[pos]);
+		Common::U32String end(&item->unicodeText.c_str()[pos + 1]);
+		Common::U32String res;
+		Common::U32String spaces(" ");
+		int width;
+
+		do {
+			res = start;
+			res += spaces;
+			res += end;
+
+			width = _font->getStringWidth(res);
+
+			spaces += spaces[0];
+		} while (width < maxWidth);
+
+		item->unicodeText = res;
+	}
+}
+
 int MacMenu::calcSubMenuWidth(MacMenuSubMenu *submenu) {
 	int maxWidth = 0;
 	if (submenu == nullptr)
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index 49606f1..e7c172c 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -94,6 +94,9 @@ private:
 private:
 	const Font *getMenuFont();
 	const Common::String getAcceleratorString(MacMenuItem *item, const char *prefix);
+	void processTabs();
+	void processSubmenuTabs(MacMenuSubMenu *submenu);
+
 	int calcSubMenuWidth(MacMenuSubMenu *menu);
 	void calcSubMenuBounds(MacMenuSubMenu *menu, int x, int y);
 	void renderSubmenu(MacMenuSubMenu *menu, bool recursive = true);


Commit: e3888d51f4e5cea2da41868375158c19750b68a1
    https://github.com/scummvm/scummvm/commit/e3888d51f4e5cea2da41868375158c19750b68a1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-13T23:48:42+02:00

Commit Message:
GRAPHICS: MACGUI: Fix menu width when there is a submenu

Changed paths:
    graphics/macgui/macmenu.cpp


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 9594aee..25db9af 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -580,34 +580,34 @@ void MacMenu::processSubmenuTabs(MacMenuSubMenu *submenu) {
 
 	Common::U32String tabSymbol("\t");
 
-	// First, we replace \t with one space, and thus, obtain
+	// First, we replace \t with two spaces, and thus, obtain
 	// the widest string
 	for (uint i = 0; i < submenu->items.size(); i++) {
 		MacMenuItem *item = submenu->items[i];
 		if (item->unicodeText.empty())
 			continue;
 
-		int pos = item->unicodeText.find(tabSymbol);
+		Common::U32String res(item->unicodeText);
 
-		if (pos == Common::U32String::npos)
-			continue;
+		int pos = item->unicodeText.find(tabSymbol);
 
-		// Sanity check
-		if (pos == 0 || pos >= item->unicodeText.size())
-			error("Malformed menu: tab position");
+		if (pos != Common::U32String::npos) {
+			// Sanity check
+			if (pos == 0 || pos >= item->unicodeText.size())
+				error("Malformed menu: tab position");
 
-		if (item->unicodeText.find(tabSymbol, pos + 1) != Common::U32String::npos)
-			error("Malformed menu: extra tab");
+			if (item->unicodeText.find(tabSymbol, pos + 1) != Common::U32String::npos)
+				error("Malformed menu: extra tab");
 
-		haveTabs = true;
+			haveTabs = true;
 
-		Common::U32String start(item->unicodeText.c_str(), &item->unicodeText.c_str()[pos]);
-		Common::U32String end(&item->unicodeText.c_str()[pos + 1]);
-		Common::U32String res;
+			Common::U32String start(item->unicodeText.c_str(), &item->unicodeText.c_str()[pos]);
+			Common::U32String end(&item->unicodeText.c_str()[pos + 1]);
 
-		res = start;
-		res += Common::U32String(" ");
-		res += end;
+			res = start;
+			res += Common::U32String("  ");
+			res += end;
+		}
 
 		int width = _font->getStringWidth(res);
 		if (width > maxWidth) {
@@ -672,8 +672,12 @@ int MacMenu::calcSubMenuWidth(MacMenuSubMenu *submenu) {
 				maxWidth = width;
 			}
 		} else if (!item->unicodeText.empty()) {
-			// add accelerator
-			int width = _font->getStringWidth(item->unicodeText);
+			Common::U32String text(item->unicodeText);
+
+			if (item->submenu != nullptr) // If we're drawing triangle
+				text += Common::U32String("  ");
+
+			int width = _font->getStringWidth(text);
 			if (width > maxWidth) {
 				maxWidth = width;
 			}





More information about the Scummvm-git-logs mailing list