diff options
author | Andrei Prykhodko | 2018-07-21 11:57:01 +0300 |
---|---|---|
committer | Andrei Prykhodko | 2018-07-21 12:16:54 +0300 |
commit | df63dea4b66c61a00e3fca50dd355e4d313aa9b1 (patch) | |
tree | e4e0539bd80bebcee4d2b55df7e8f927c2a548b6 | |
parent | 1f914ea7591dd457e4220b1eccb85cc0bbee1d42 (diff) | |
download | scummvm-rg350-df63dea4b66c61a00e3fca50dd355e4d313aa9b1.tar.gz scummvm-rg350-df63dea4b66c61a00e3fca50dd355e4d313aa9b1.tar.bz2 scummvm-rg350-df63dea4b66c61a00e3fca50dd355e4d313aa9b1.zip |
GRAPHICS: MACMENU: added partial unicode support
It misses renderSubmenu impl and accelerator rendering
-rw-r--r-- | graphics/macgui/macmenu.cpp | 88 | ||||
-rw-r--r-- | graphics/macgui/macmenu.h | 9 |
2 files changed, 86 insertions, 11 deletions
diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp index 6eb9689ab5..0228798e38 100644 --- a/graphics/macgui/macmenu.cpp +++ b/graphics/macgui/macmenu.cpp @@ -58,24 +58,30 @@ enum { struct MacMenuSubItem { Common::String text; + Common::U32String unicodeText; + bool unicode; int action; int style; char shortcut; bool enabled; Common::Rect bbox; - MacMenuSubItem(const char *t, int a, int s = 0, char sh = 0, bool e = true) : text(t), action(a), style(s), shortcut(sh), enabled(e) {} + MacMenuSubItem(const char *t, int a, int s = 0, char sh = 0, bool e = true) : text(t), unicode(false), action(a), style(s), shortcut(sh), enabled(e) {} + 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) {} }; typedef Common::Array<MacMenuSubItem *> SubItemArray; struct MacMenuItem { Common::String name; + Common::U32String unicodeName; + bool unicode; SubItemArray subitems; Common::Rect bbox; Common::Rect subbbox; - MacMenuItem(const char *n) : name(n) {} + MacMenuItem(const char *n) : name(n), unicode(false) {} + MacMenuItem(const Common::U32String &n) : unicodeName(n), unicode(true) {} }; MacMenu::MacMenu(int id, const Common::Rect &bounds, MacWindowManager *wm) @@ -183,19 +189,32 @@ int MacMenu::addMenuItem(const char *name) { return _items.size() - 1; } +int MacMenu::addMenuItem(const Common::U32String &name) { + MacMenuItem *i = new MacMenuItem(name); + _items.push_back(i); + + return _items.size() - 1; +} + void MacMenu::addMenuSubItem(int id, const char *text, int action, int style, char shortcut, bool enabled) { _items[id]->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled)); calcMenuBounds(_items[id]); } +void MacMenu::addMenuSubItem(int id, const Common::U32String &text, int action, int style, char shortcut, bool enabled) { + _items[id]->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled)); + + calcMenuBounds(_items[id]); +} + void MacMenu::calcDimensions() { // Calculate menu dimensions int y = 1; int x = 18; for (uint i = 0; i < _items.size(); i++) { - int w = _font->getStringWidth(_items[i]->name); + int w = _items[i]->unicode ? _font->getStringWidth(_items[i]->unicodeName) : _font->getStringWidth(_items[i]->name); if (_items[i]->bbox.bottom == 0) { _items[i]->bbox.left = x - kMenuLeftMargin; @@ -319,6 +338,12 @@ int MacMenu::calculateMenuWidth(MacMenuItem *menu) { if (width > maxWidth) { maxWidth = width; } + } else if (!item->unicodeText.empty()) { + // add accelerator + int width = _font->getStringWidth(item->unicodeText); + if (width > maxWidth) { + maxWidth = width; + } } } return maxWidth; @@ -389,7 +414,13 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) { renderSubmenu(it); } - _font->drawString(&_screen, it->name, it->bbox.left + kMenuLeftMargin, it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color); + if (it->unicode) { + _font->drawString(&_screen, it->unicodeName, it->bbox.left + kMenuLeftMargin, + it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color); + } else { + _font->drawString(&_screen, it->name, it->bbox.left + kMenuLeftMargin, + it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color); + } } g->transBlitFrom(_screen, kColorGreen); @@ -568,9 +599,15 @@ bool MacMenu::mouseRelease(int x, int y) { if (_menuActivated) { _menuActivated = false; - if (_activeItem != -1 && _activeSubItem != -1 && _items[_activeItem]->subitems[_activeSubItem]->enabled) - (*_ccallback)(_items[_activeItem]->subitems[_activeSubItem]->action, - _items[_activeItem]->subitems[_activeSubItem]->text, _cdata); + if (_activeItem != -1 && _activeSubItem != -1 && _items[_activeItem]->subitems[_activeSubItem]->enabled) { + if (_items[_activeItem]->subitems[_activeSubItem]->unicode) { + (*_unicodeccallback)(_items[_activeItem]->subitems[_activeSubItem]->action, + _items[_activeItem]->subitems[_activeSubItem]->unicodeText, _cdata); + } else { + (*_ccallback)(_items[_activeItem]->subitems[_activeSubItem]->action, + _items[_activeItem]->subitems[_activeSubItem]->text, _cdata); + } + } _activeItem = -1; _activeSubItem = -1; @@ -590,7 +627,11 @@ bool MacMenu::processMenuShortCut(byte flags, uint16 ascii) { for (uint i = 0; i < _items.size(); i++) for (uint j = 0; j < _items[i]->subitems.size(); j++) if (_items[i]->subitems[j]->enabled && tolower(_items[i]->subitems[j]->shortcut) == ascii) { - (*_ccallback)(_items[i]->subitems[j]->action, _items[i]->subitems[j]->text, _cdata); + if (_items[i]->subitems[j]->unicode) { + (*_unicodeccallback)(_items[i]->subitems[j]->action, _items[i]->subitems[j]->unicodeText, _cdata); + } else { + (*_ccallback)(_items[i]->subitems[j]->action, _items[i]->subitems[j]->text, _cdata); + } return true; } } @@ -609,18 +650,43 @@ void MacMenu::enableCommand(int menunum, int action, bool state) { void MacMenu::enableCommand(const char *menuitem, const char *menuaction, bool state) { uint menunum = 0; - while (menunum < _items.size()) + while (menunum < _items.size()) { + assert(!_items[menunum]->unicode); if (_items[menunum]->name.equalsIgnoreCase(menuitem)) break; else menunum++; - + } if (menunum == _items.size()) return; - for (uint i = 0; i < _items[menunum]->subitems.size(); i++) + for (uint i = 0; i < _items[menunum]->subitems.size(); i++) { + assert(!_items[menunum]->subitems[i]->unicode); if (_items[menunum]->subitems[i]->text.equalsIgnoreCase(menuaction)) _items[menunum]->subitems[i]->enabled = state; + } + + _contentIsDirty = true; +} + +void MacMenu::enableCommand(const Common::U32String &menuitem, const Common::U32String &menuaction, bool state) { + uint menunum = 0; + + while (menunum < _items.size()) { + assert(_items[menunum]->unicode); + if (_items[menunum]->unicodeName.equals(menuitem)) + break; + else + menunum++; + } + if (menunum == _items.size()) + return; + + for (uint i = 0; i < _items[menunum]->subitems.size(); i++) { + assert(_items[menunum]->subitems[i]->unicode); + if (_items[menunum]->subitems[i]->unicodeText.equals(menuaction)) + _items[menunum]->subitems[i]->enabled = state; + } _contentIsDirty = true; } diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h index c98dd1f0d6..b9d8e0125b 100644 --- a/graphics/macgui/macmenu.h +++ b/graphics/macgui/macmenu.h @@ -25,6 +25,10 @@ #include "common/str-array.h" +namespace Common { +class U32String; +} + namespace Graphics { struct MacMenuItem; @@ -46,12 +50,15 @@ public: static Common::StringArray *readMenuFromResource(Common::SeekableReadStream *res); void setCommandsCallback(void (*callback)(int, Common::String &, void *), void *data) { _ccallback = callback; _cdata = data; } + void setCommandsCallback(void (*callback)(int, Common::U32String &, void *), void *data) { _unicodeccallback = callback; _cdata = data; } void addStaticMenus(const MacMenuData *data); void calcDimensions(); int addMenuItem(const char *name); + int addMenuItem(const Common::U32String &name); void addMenuSubItem(int id, const char *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 createSubMenuFromString(int id, const char *string, int commandId); void clearSubMenu(int id); @@ -60,6 +67,7 @@ public: void enableCommand(int menunum, int action, bool state); void enableCommand(const char *menuitem, const char *menuaction, bool state); + void enableCommand(const Common::U32String &menuitem, const Common::U32String &menuaction, bool state); void disableAllMenus(); void setActive(bool active) { _menuActivated = active; } @@ -99,6 +107,7 @@ private: int _activeSubItem; void (*_ccallback)(int action, Common::String &text, void *data); + void (*_unicodeccallback)(int action, Common::U32String &text, void *data); void *_cdata; }; |