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

sev- sev at scummvm.org
Thu Oct 3 00:05:24 CEST 2019


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

Summary:
1ced332fde GRAPHICS: MACGUI: Render nested submenus
b157a27e2b GRAPHICS: MACGUI: Unify submenu dimension calculations
d3df14fce1 GRAPHICS: MACGUI: Finish implementation for nested submenus drawing
a843a90207 GRAPHICS: MACGUI: Implement nested submenu navigation
571a455c6a GRAPHICS: MACGUI: Close nested submenus on hover
ee139e86f3 GRAPHICS: MACGUI: Correctly render highlights for the open submenus


Commit: 1ced332fdee22366023d6c8f9d8a6825fddc46a8
    https://github.com/scummvm/scummvm/commit/1ced332fdee22366023d6c8f9d8a6825fddc46a8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-03T00:05:12+02:00

Commit Message:
GRAPHICS: MACGUI: Render nested submenus

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


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 0079ced..b4c1a60 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -792,43 +792,46 @@ bool MacMenu::mouseClick(int x, int y) {
 	if (_bbox.contains(x, y)) {
 		for (uint i = 0; i < _items.size(); i++)
 			if (_items[i]->bbox.contains(x, y)) {
-			  if ((uint)_activeItem == i)
+				if ((uint)_activeItem == i)
 					return false;
 
 				if (_activeItem != -1) { // Restore background
 					if (_items[_activeItem]->submenu != nullptr) {
-						Common::Rect r(_items[_activeItem]->submenu->bbox);
-						r.right += 3;
-						r.bottom += 3;
-
 						_wm->setFullRefresh(true);
+
+						_menustack.pop_back(); // Drop previous submenu
 					}
 				}
 
 				_activeItem = i;
 				_activeSubItem = -1;
+				if (_items[_activeItem]->submenu != nullptr) {
+					_menustack.push_back(_items[_activeItem]->submenu);
+				}
+
 				_menuActivated = true;
 
 				_contentIsDirty = true;
 
 				return true;
 			}
-	} else if (_menuActivated && _items[_activeItem]->submenu != nullptr &&
-			_items[_activeItem]->submenu->bbox.contains(x, y)) {
-		MacMenuSubMenu *it = _items[_activeItem]->submenu;
+	} else if (_menuActivated && _menustack.size() > 0 && _menustack.back()->bbox.contains(x, y)) {
+		MacMenuSubMenu *it = _menustack.back();
 		int numSubItem = (y - it->bbox.top) / kMenuDropdownItemHeight;
 
 		if (numSubItem != _activeSubItem) {
 			_activeSubItem = numSubItem;
 
-			renderSubmenu(_items[_activeItem]->submenu);
+			renderSubmenu(it);
 			_contentIsDirty = true;
 		}
-	} else if (_menuActivated && _activeItem != -1) {
+	} else if (_menuActivated && _activeItem != -1 && _activeSubItem != -1) {
 		_activeSubItem = -1;
 
-		renderSubmenu(_items[_activeItem]->submenu);
-		_contentIsDirty = true;
+		if (_menustack.size()) {
+			renderSubmenu(_menustack.back());
+			_contentIsDirty = true;
+		}
 	}
 
 	return false;
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index 1239ceb..208e93d 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -117,7 +117,7 @@ private:
 	bool _isVisible;
 
 	int _activeItem;
-	Common::Array<int> _menustack;
+	Common::Array<MacMenuSubMenu *> _menustack;
 	int _activeSubItem;
 
 	void (*_ccallback)(int action, Common::String &text, void *data);


Commit: b157a27e2bcfe04bcdfae539304509f859ec17d0
    https://github.com/scummvm/scummvm/commit/b157a27e2bcfe04bcdfae539304509f859ec17d0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-03T00:05:12+02:00

Commit Message:
GRAPHICS: MACGUI: Unify submenu dimension calculations

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


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index b4c1a60..5be18ac 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -136,6 +136,8 @@ MacMenu::MacMenu(int id, const Common::Rect &bounds, MacWindowManager *wm)
 
 	_menuActivated = false;
 
+	_dimensionsDirty = true;
+
 	if (_wm->_mode & kWMModeAutohideMenu)
 		_isVisible = false;
 	else
@@ -308,16 +310,12 @@ void MacMenu::addStaticMenus(const MacMenuData *data) {
 		const MacMenuData *m = &data[i];
 
 		if (m->menunum == kMenuHighLevel) {
-			MacMenuItem *item = new MacMenuItem(m->title);
-			_items.push_back(item);
+			addMenuItem(m->title);
 
 			continue;
 		}
 
-		if (_items[m->menunum]->submenu == nullptr)
-			_items[m->menunum]->submenu = new MacMenuSubMenu();
-
-		_items[m->menunum]->submenu->subitems.push_back(new MacMenuSubItem(m->title, m->action, 0, m->shortcut, m->enabled));
+		addMenuSubItem(m->menunum, m->title, m->action, 0, m->shortcut, m->enabled);
 	}
 
 	calcDimensions();
@@ -327,6 +325,8 @@ int MacMenu::addMenuItem(const Common::String &name) {
 	MacMenuItem *i = new MacMenuItem(name);
 	_items.push_back(i);
 
+	_dimensionsDirty = true;
+
 	return _items.size() - 1;
 }
 
@@ -334,10 +334,14 @@ int MacMenu::addMenuItem(const Common::U32String &name) {
 	MacMenuItem *i = new MacMenuItem(name);
 	_items.push_back(i);
 
+	_dimensionsDirty = true;
+
 	return _items.size() - 1;
 }
 
 MacMenuSubMenu *MacMenu::addSubMenu(MacMenuSubMenu *submenu) {
+	_dimensionsDirty = true;
+
 	if (submenu == nullptr) {
 		return (_items.back()->submenu = new MacMenuSubMenu());
 	} else {
@@ -346,37 +350,37 @@ MacMenuSubMenu *MacMenu::addSubMenu(MacMenuSubMenu *submenu) {
 }
 
 void MacMenu::addMenuSubItem(int id, const Common::String &text, int action, int style, char shortcut, bool enabled) {
+	_dimensionsDirty = true;
+
 	if (_items[id]->submenu == nullptr)
 		_items[id]->submenu = new MacMenuSubMenu();
 
 	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
-
-	calcSubMenuBounds(_items[id]->submenu, _items[id]->bbox.left - 1, _items[id]->bbox.bottom + 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();
 
 	_items[id]->submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
-
-	calcSubMenuBounds(_items[id]->submenu, _items[id]->bbox.left - 1, _items[id]->bbox.bottom + 1);
 }
 
 void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::String &text, int action, int style, char shortcut, bool enabled) {
 	assert(submenu != nullptr);
 
-	submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
+	_dimensionsDirty = true;
 
-	calcSubMenuBounds(submenu, 0, 0); // FIXME
+	submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
 }
 
 void MacMenu::addSubMenuItem(MacMenuSubMenu *submenu, const Common::U32String &text, int action, int style, char shortcut, bool enabled) {
 	assert(submenu != nullptr);
 
-	submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
+	_dimensionsDirty = true;
 
-	calcSubMenuBounds(submenu, 0, 0); // FIXME
+	submenu->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
 }
 
 void MacMenu::calcDimensions() {
@@ -398,6 +402,8 @@ void MacMenu::calcDimensions() {
 
 		x += w + kMenuSpacing;
 	}
+
+	_dimensionsDirty = false;
 }
 
 void MacMenu::loadMenuResource(Common::MacResManager *resFork, uint16 id) {
@@ -461,19 +467,15 @@ void MacMenu::clearSubMenu(int id) {
 void MacMenu::createSubMenuFromString(int id, const char *str, int commandId) {
 	clearSubMenu(id);
 
-	MacMenuItem *menu = _items[id];
 	Common::String string(str);
-
 	Common::String item;
 
-	menu->submenu = new MacMenuSubMenu();
-
 	for (uint i = 0; i < string.size(); i++) {
 		while(i < string.size() && string[i] != ';') // Read token
 			item += string[i++];
 
 		if (item == "(-") {
-			menu->submenu->subitems.push_back(new MacMenuSubItem(NULL, 0));
+			addMenuSubItem(id, NULL, 0);
 		} else {
 			bool enabled = true;
 			int style = 0;
@@ -522,13 +524,11 @@ void MacMenu::createSubMenuFromString(int id, const char *str, int commandId) {
 					}
 			}
 
-			menu->submenu->subitems.push_back(new MacMenuSubItem(item, commandId, style, shortcut, enabled));
+			addMenuSubItem(id, item, commandId, style, shortcut, enabled);
 		}
 
 		item.clear();
 	}
-
-	calcSubMenuBounds(menu->submenu, menu->bbox.left - 1, menu->bbox.bottom + 1);
 }
 
 const Font *MacMenu::getMenuFont() {
@@ -589,6 +589,13 @@ void MacMenu::calcSubMenuBounds(MacMenuSubMenu *submenu, int x, int y) {
 	submenu->bbox.top = y1;
 	submenu->bbox.right = x2;
 	submenu->bbox.bottom = y2;
+
+	for (uint i = 0; i < submenu->subitems.size(); i++) {
+		MacMenuSubMenu *submenu = submenu->subitems[i]->submenu;
+
+		if (submenu != nullptr)
+			calcSubMenuBounds(submenu, x2 - 4, y1 + i * kMenuDropdownItemHeight + 1);
+	}
 }
 
 static void drawPixelPlain(int x, int y, int color, void *data) {
@@ -608,6 +615,9 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 	if (!_isVisible)
 		return false;
 
+	if (_dimensionsDirty)
+		calcDimensions();
+
 	if (!_contentIsDirty && !forceRedraw)
 		return false;
 
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index 208e93d..224ec66 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -116,6 +116,8 @@ private:
 	bool _menuActivated;
 	bool _isVisible;
 
+	bool _dimensionsDirty;
+
 	int _activeItem;
 	Common::Array<MacMenuSubMenu *> _menustack;
 	int _activeSubItem;


Commit: d3df14fce121460ae7ee810fc751e66c17a04b16
    https://github.com/scummvm/scummvm/commit/d3df14fce121460ae7ee810fc751e66c17a04b16
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-03T00:05:12+02:00

Commit Message:
GRAPHICS: MACGUI: Finish implementation for nested submenus drawing

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


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 5be18ac..48db042 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -591,10 +591,10 @@ void MacMenu::calcSubMenuBounds(MacMenuSubMenu *submenu, int x, int y) {
 	submenu->bbox.bottom = y2;
 
 	for (uint i = 0; i < submenu->subitems.size(); i++) {
-		MacMenuSubMenu *submenu = submenu->subitems[i]->submenu;
+		MacMenuSubMenu *menu = submenu->subitems[i]->submenu;
 
-		if (submenu != nullptr)
-			calcSubMenuBounds(submenu, x2 - 4, y1 + i * kMenuDropdownItemHeight + 1);
+		if (menu != nullptr)
+			calcSubMenuBounds(menu, x2 - 4, y1 + i * kMenuDropdownItemHeight + 1);
 	}
 }
 
@@ -647,9 +647,6 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 
 			_screen.fillRect(hbox, _wm->_colorBlack);
 			color = _wm->_colorWhite;
-
-			if (it->submenu != nullptr)
-				renderSubmenu(it->submenu);
 		}
 
 		if (it->unicode) {
@@ -661,6 +658,10 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 		}
 	}
 
+	for (uint i = 0; i < _menustack.size(); i++) {
+		renderSubmenu(_menustack[i], (i == _menustack.size() - 1));
+	}
+
 	g->transBlitFrom(_screen, kColorGreen);
 
 	g_system->copyRectToScreen(g->getPixels(), g->pitch, 0, 0, g->w, g->h);
@@ -668,7 +669,7 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 	return true;
 }
 
-void MacMenu::renderSubmenu(MacMenuSubMenu *menu) {
+void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 	Common::Rect *r = &menu->bbox;
 
 	if (r->width() == 0 || r->height() == 0)
@@ -752,8 +753,8 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu) {
 		y += kMenuDropdownItemHeight;
 	}
 
-	if (_activeSubItem != -1 && menu->subitems[_activeSubItem]->submenu != nullptr)
-		renderSubmenu(menu->subitems[_activeSubItem]->submenu);
+	if (recursive && _activeSubItem != -1 && menu->subitems[_activeSubItem]->submenu != nullptr)
+		renderSubmenu(menu->subitems[_activeSubItem]->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);
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index 224ec66..3b21647 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -96,7 +96,7 @@ private:
 	const Common::String getAcceleratorString(MacMenuSubItem *item, const char *prefix);
 	int calcSubMenuWidth(MacMenuSubMenu *menu);
 	void calcSubMenuBounds(MacMenuSubMenu *menu, int x, int y);
-	void renderSubmenu(MacMenuSubMenu *menu);
+	void renderSubmenu(MacMenuSubMenu *menu, bool recursive = true);
 
 	bool keyEvent(Common::Event &event);
 	bool mouseClick(int x, int y);


Commit: a843a902075ae118cd7e0ef0a4110e431c350acd
    https://github.com/scummvm/scummvm/commit/a843a902075ae118cd7e0ef0a4110e431c350acd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-03T00:05:12+02:00

Commit Message:
GRAPHICS: MACGUI: Implement nested submenu navigation

Changed paths:
    graphics/macgui/macmenu.cpp


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 48db042..aaa86ae 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -836,13 +836,25 @@ bool MacMenu::mouseClick(int x, int y) {
 			renderSubmenu(it);
 			_contentIsDirty = true;
 		}
-	} else if (_menuActivated && _activeItem != -1 && _activeSubItem != -1) {
+	} else if (_menuActivated && _activeSubItem != -1) {
+		if (_menustack.back()->subitems[_activeSubItem]->submenu != nullptr) {
+			if (_menustack.back()->subitems[_activeSubItem]->submenu->bbox.contains(x, y)) {
+				_menustack.push_back(_menustack.back()->subitems[_activeSubItem]->submenu);
+
+				_activeSubItem = 0;
+
+				return true;
+			}
+		}
+	} else if (_menuActivated && _activeItem != -1) {
 		_activeSubItem = -1;
 
 		if (_menustack.size()) {
 			renderSubmenu(_menustack.back());
 			_contentIsDirty = true;
 		}
+
+		return true;
 	}
 
 	return false;


Commit: 571a455c6a8f3e5b7d2ff1a149c52fa379ec0f7d
    https://github.com/scummvm/scummvm/commit/571a455c6a8f3e5b7d2ff1a149c52fa379ec0f7d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-03T00:05:12+02:00

Commit Message:
GRAPHICS: MACGUI: Close nested submenus on hover

Changed paths:
    graphics/macgui/macmenu.cpp


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index aaa86ae..895f097 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -826,7 +826,12 @@ bool MacMenu::mouseClick(int x, int y) {
 
 				return true;
 			}
-	} else if (_menuActivated && _menustack.size() > 0 && _menustack.back()->bbox.contains(x, y)) {
+	}
+
+	if (!_menuActivated)
+		return false;
+
+	if (_menustack.size() > 0 && _menustack.back()->bbox.contains(x, y)) {
 		MacMenuSubMenu *it = _menustack.back();
 		int numSubItem = (y - it->bbox.top) / kMenuDropdownItemHeight;
 
@@ -836,17 +841,36 @@ bool MacMenu::mouseClick(int x, int y) {
 			renderSubmenu(it);
 			_contentIsDirty = true;
 		}
-	} else if (_menuActivated && _activeSubItem != -1) {
+
+		return true;
+	}
+
+	if (_activeSubItem != -1) {
 		if (_menustack.back()->subitems[_activeSubItem]->submenu != nullptr) {
 			if (_menustack.back()->subitems[_activeSubItem]->submenu->bbox.contains(x, y)) {
 				_menustack.push_back(_menustack.back()->subitems[_activeSubItem]->submenu);
 
 				_activeSubItem = 0;
+				_contentIsDirty = true;
 
 				return true;
 			}
 		}
-	} else if (_menuActivated && _activeItem != -1) {
+
+		if (_menustack.size() > 1) {
+			if (_menustack[_menustack.size() - 2]->bbox.contains(x, y)) {
+				_menustack.pop_back();
+
+				_activeSubItem = (y - _menustack.back()->bbox.top) / kMenuDropdownItemHeight;
+
+				_contentIsDirty = true;
+
+				return true;
+			}
+		}
+	}
+
+	if (_activeItem != -1) {
 		_activeSubItem = -1;
 
 		if (_menustack.size()) {


Commit: ee139e86f31dd67d7a59cf7dc0da9efba212d23b
    https://github.com/scummvm/scummvm/commit/ee139e86f31dd67d7a59cf7dc0da9efba212d23b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-03T00:05:12+02:00

Commit Message:
GRAPHICS: MACGUI: Correctly render highlights for the open submenus

Changed paths:
    graphics/macgui/macmenu.cpp


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 895f097..ed430cb 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -94,6 +94,9 @@ struct MacMenuSubItem {
 struct MacMenuSubMenu {
 	SubItemArray subitems;
 	Common::Rect bbox;
+	int highlight;
+
+	MacMenuSubMenu() : highlight(-1) {}
 
 	~MacMenuSubMenu() {
 		for (uint i = 0; i < subitems.size(); i++)
@@ -695,7 +698,7 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 		int arrowX = r->right - 14;
 
 		int color = _wm->_colorBlack;
-		if (i == (uint)_activeSubItem && (!text.empty() || !unicodeText.empty()) && menu->subitems[i]->enabled) {
+		if (i == (uint)menu->highlight && (!text.empty() || !unicodeText.empty()) && menu->subitems[i]->enabled) {
 			color = _wm->_colorWhite;
 			Common::Rect trect(r->left, y - (_wm->_fontMan->hasBuiltInFonts() ? 1 : 0), r->right, y + _font->getFontHeight());
 
@@ -753,8 +756,8 @@ void MacMenu::renderSubmenu(MacMenuSubMenu *menu, bool recursive) {
 		y += kMenuDropdownItemHeight;
 	}
 
-	if (recursive && _activeSubItem != -1 && menu->subitems[_activeSubItem]->submenu != nullptr)
-		renderSubmenu(menu->subitems[_activeSubItem]->submenu, false);
+	if (recursive && menu->highlight != -1 && menu->subitems[menu->highlight]->submenu != nullptr)
+		renderSubmenu(menu->subitems[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);
@@ -838,6 +841,8 @@ bool MacMenu::mouseClick(int x, int y) {
 		if (numSubItem != _activeSubItem) {
 			_activeSubItem = numSubItem;
 
+			it->highlight = _activeSubItem;
+
 			renderSubmenu(it);
 			_contentIsDirty = true;
 		}
@@ -853,15 +858,19 @@ bool MacMenu::mouseClick(int x, int y) {
 				_activeSubItem = 0;
 				_contentIsDirty = true;
 
+				_menustack.back()->highlight = 0;
+
 				return true;
 			}
 		}
 
 		if (_menustack.size() > 1) {
 			if (_menustack[_menustack.size() - 2]->bbox.contains(x, y)) {
+				_menustack.back()->highlight = -1; // Erase it for the closed popup
+
 				_menustack.pop_back();
 
-				_activeSubItem = (y - _menustack.back()->bbox.top) / kMenuDropdownItemHeight;
+				_activeSubItem = _menustack.back()->highlight;
 
 				_contentIsDirty = true;
 





More information about the Scummvm-git-logs mailing list