Skip to content

Commit

Permalink
WAGE: Calculate submenu bounds
Browse files Browse the repository at this point in the history
  • Loading branch information
sev- committed Jan 12, 2016
1 parent 80bea99 commit a2053eb
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
2 changes: 2 additions & 0 deletions engines/wage/gui.h
Expand Up @@ -68,6 +68,8 @@ enum {
kMenuLeftMargin = 7,
kMenuSpacing = 13,
kMenuPadding = 6,
kMenuDropdownPadding = 6,
kMenuDropdownItemHeight = 19,
kMenuItemHeight = 20,
kBorderWidth = 17,
kDesktopArc = 7,
Expand Down
51 changes: 50 additions & 1 deletion engines/wage/menu.cpp
Expand Up @@ -67,10 +67,13 @@ struct MenuSubItem {
MenuSubItem(const char *t, int a, int s = 0, char sh = 0, bool e = true) : text(t), action(a), style(s), shortcut(sh), enabled(e) {}
};

typedef Common::Array<MenuSubItem *> SubItemArray;

struct MenuItem {
Common::String name;
Common::Array<MenuSubItem *> subitems;
SubItemArray subitems;
Common::Rect bbox;
Common::Rect subbbox;

MenuItem(const char *n) : name(n) {}
};
Expand Down Expand Up @@ -161,6 +164,8 @@ Menu::Menu(Gui *gui) : _gui(gui) {
_items[i]->bbox.bottom = y + _font->getFontHeight();
}

calcMenuBounds(_items[i]);

x += w + kMenuSpacing;
}

Expand All @@ -186,6 +191,50 @@ const Graphics::Font *Menu::getMenuFont() {
return _gui->getFont("Chicago-12", Graphics::FontManager::kBigGUIFont);
}

const char *Menu::getAcceleratorString(MenuSubItem *item) {
static char res[20];
*res = 0;

if (item->shortcut != 0)
sprintf(res, " \u2318%c", item->shortcut);

return res;
}

int Menu::calculateMenuWidth(MenuItem *menu) {
int maxWidth = 0;
for (int i = 0; i < menu->subitems.size(); i++) {
MenuSubItem *item = menu->subitems[i];
if (item->text != NULL) {
Common::String text(item->text);
Common::String acceleratorText(getAcceleratorString(item));
if (acceleratorText.size()) {
text += acceleratorText;
}

int width = _font->getStringWidth(text);
if (width > maxWidth) {
maxWidth = width;
}
}
}
return maxWidth;
}

void Menu::calcMenuBounds(MenuItem *menu) {
// TODO: cache maxWidth
int maxWidth = calculateMenuWidth(menu);
int x1 = menu->bbox.left - kMenuDropdownPadding;
int y1 = menu->bbox.bottom;
int x2 = x1 + maxWidth + kMenuDropdownPadding * 3;
int y2 = y1 + menu->subitems.size() * kMenuDropdownItemHeight;

menu->subbbox.left = x1;
menu->subbbox.top = y1;
menu->subbbox.right = x2;
menu->subbbox.bottom = y2;
}

void Menu::render() {
Common::Rect r(_bbox);
Patterns p;
Expand Down
5 changes: 5 additions & 0 deletions engines/wage/menu.h
Expand Up @@ -51,6 +51,7 @@
namespace Wage {

struct MenuItem;
struct MenuSubItem;

class Menu {
public:
Expand All @@ -70,6 +71,10 @@ class Menu {

private:
const Graphics::Font *getMenuFont();
const char *getAcceleratorString(MenuSubItem *item);
int calculateMenuWidth(MenuItem *menu);
void calcMenuBounds(MenuItem *menu);

Common::Array<MenuItem *> _items;

const Graphics::Font *_font;
Expand Down

0 comments on commit a2053eb

Please sign in to comment.