From 53fd14b283168b3863799c74714592750cbbcb50 Mon Sep 17 00:00:00 2001 From: ysj1173886760 <1173886760@qq.com> Date: Thu, 29 Jul 2021 11:40:18 +0800 Subject: [PATCH] GRAPHICS: MACGUI: add functions for setting member checkMark and Enable of menuItem --- graphics/macgui/macmenu.cpp | 55 ++++++++++++++++++++++++++++ graphics/macgui/macmenu.h | 5 +++ graphics/macgui/macwindowmanager.cpp | 16 ++++++++ graphics/macgui/macwindowmanager.h | 3 ++ 4 files changed, 79 insertions(+) diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp index 2ad58e99e4f..4101ef2a687 100644 --- a/graphics/macgui/macmenu.cpp +++ b/graphics/macgui/macmenu.cpp @@ -486,6 +486,61 @@ void MacMenu::loadMenuBarResource(Common::MacResManager *resFork, uint16 id) { } } +void MacMenu::setCheckMark(const Common::String &menuId, const Common::String &itemId, bool checkMark) { + MacMenuItem *item = findMenuItem(menuId, itemId); + + if (item) { + item->checked = checkMark; + _contentIsDirty = true; + } +} + +void MacMenu::setEnabled(const Common::String &menuId, const Common::String &itemId, bool enabled) { + MacMenuItem *item = findMenuItem(menuId, itemId); + + if (item) { + item->enabled = enabled; + _contentIsDirty = true; + } +} + +MacMenuItem *MacMenu::findMenuItem(const Common::String &menuId, const Common::String &itemId) { + // TODO: support arbitrary level menu item finding + // only support 2 level finding now. + + MacMenuItem *menu = nullptr; + for (uint i = 0; i < _items.size(); i++) { + // TODO: support unicode text menu + // didn't support unicode item finding yet + if (!_items[i]->unicode) { + if (_items[i]->text.equalsIgnoreCase(menuId)) { + menu = _items[i]; + break; + } + } + } + + if (!menu) { + warning("MacMenu::findMenuItem: can not find menu with id %s", menuId.c_str()); + return nullptr; + } + + if (!menu->submenu) { + warning("MacMenu::findMenuItem: menu %s doesn't have submenu", menuId.c_str()); + return nullptr; + } + + for (uint i = 0; i < menu->submenu->items.size(); i++) { + if (!menu->submenu->items[i]->unicode) { + if (menu->submenu->items[i]->text.equalsIgnoreCase(itemId)) + return menu->submenu->items[i]; + } + } + + warning("MacMenu::findMenuItem: menu %s doesn't have item with id %s", menuId.c_str(), itemId.c_str()); + return nullptr; +} + void MacMenu::clearSubMenu(int id) { MacMenuItem *menu = _items[id]; diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h index 852169fcd84..5344a141d60 100644 --- a/graphics/macgui/macmenu.h +++ b/graphics/macgui/macmenu.h @@ -97,6 +97,9 @@ public: bool checkIntersects(Common::Rect &rect); + void setCheckMark(const Common::String &menuId, const Common::String &itemId, bool checkMark); + void setEnabled(const Common::String &menuId, const Common::String &itemId, bool enabled); + Common::Rect _bbox; private: @@ -130,6 +133,8 @@ private: void eventLoop(); + MacMenuItem *findMenuItem(const Common::String &menuId, const Common::String &itemId); + ItemArray _items; const Font *_font; diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp index ee592badf59..cf66aaa3410 100644 --- a/graphics/macgui/macwindowmanager.cpp +++ b/graphics/macgui/macwindowmanager.cpp @@ -426,6 +426,22 @@ void MacWindowManager::disableScreenCopy() { g_system->copyRectToScreen(_screenCopy->getBasePtr(0, 0), _screenCopy->pitch, 0, 0, _screenCopy->w, _screenCopy->h); } +void MacWindowManager::setMenuItemCheckMark(const Common::String &menuId, const Common::String &itemId, bool checkMark) { + if (_menu) { + _menu->setCheckMark(menuId, itemId, checkMark); + } else { + warning("MacWindowManager::setMenuItemCheckMark: wm doesn't have menu"); + } +} + +void MacWindowManager::setMenuItemEnabled(const Common::String &menuId, const Common::String &itemId, bool enabled) { + if (_menu) { + _menu->setEnabled(menuId, itemId, enabled); + } else { + warning("MacWindowManager::setMenuItemEnabled: wm doesn't have menu"); + } +} + // this is refer to how we deal U32String in splitString in mactext // maybe we can optimize this specifically Common::U32String stripFormat(const Common::U32String &str) { diff --git a/graphics/macgui/macwindowmanager.h b/graphics/macgui/macwindowmanager.h index 5ae47180a1e..3eb6ebf9c06 100644 --- a/graphics/macgui/macwindowmanager.h +++ b/graphics/macgui/macwindowmanager.h @@ -334,6 +334,9 @@ public: */ void clearHandlingWidgets(); + void setMenuItemCheckMark(const Common::String &menuId, const Common::String &itemId, bool checkMark); + void setMenuItemEnabled(const Common::String &menuId, const Common::String &itemId, bool enabled); + public: MacFontManager *_fontMan; uint32 _mode;