From 7946f704a4cd3a985d2fb523079fce7fa14c341e Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Thu, 9 Aug 2012 18:03:56 +0200 Subject: [PATCH] reworked Menu to include an optional number --- src/battle/BattleState.cpp | 15 ++------------ src/battle/BattleState.h | 2 -- src/graphics/Menu.h | 40 +++++++++++++++++++++++++------------- src/main.cpp | 2 +- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index 58f2965..ec56169 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -16,9 +16,7 @@ #include "../geometry/operators.h" #include "../graphics/Sprite.h" -#include #include -#include using app::Application; using app::Input; @@ -72,21 +70,12 @@ void BattleState::LoadInventory() { const Inventory &inv(*res->inventory); itemMenu.Clear(); itemMenu.Reserve(inv.MaxItems()); - itemMenuStrings.clear(); - itemMenuStrings.resize(inv.MaxItems()); - int itemNameLength(itemMenu.CharsPerEntry() - 3); - // TODO: better (maybe intrusive) solution for menus with counts for (int i(0); i < inv.MaxItems(); ++i) { const Item *item(inv.ItemAt(i)); if (item) { - std::stringstream s; - s << std::setw(itemNameLength) << std::left << std::setfill(' ') << item->Name(); - s << ':'; - s << inv.ItemCountAt(i); - itemMenuStrings[i] = s.str(); - itemMenu.Add(itemMenuStrings[i].c_str(), item, item->CanUseInBattle(), item->MenuIcon()); + itemMenu.Add(item->Name(), item, item->CanUseInBattle(), item->MenuIcon(), inv.ItemCountAt(i)); } else { - itemMenu.Add("", 0, false); + itemMenu.AddEmptyEntry(); } } } diff --git a/src/battle/BattleState.h b/src/battle/BattleState.h index 4b0ffcf..96a7ce2 100644 --- a/src/battle/BattleState.h +++ b/src/battle/BattleState.h @@ -21,7 +21,6 @@ #include "../graphics/Menu.h" #include -#include #include namespace app { class Input; } @@ -120,7 +119,6 @@ private: std::vector heroes; std::vector > spellMenus; graphics::Menu itemMenu; - std::vector itemMenuStrings; std::vector > ikariMenus; std::vector heroTags; std::vector attackChoices; diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index 1cdddcd..26b9d05 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -27,18 +27,19 @@ class Menu { public: Menu(); - Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int iconSpace = 0, int cols = 1, int colGap = 0); + Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int iconSpace = 0, int cols = 1, int colGap = 0, int charsPerNumber = 0, char delimiter = ':'); public: int Width() const; int Height() const; - int ColWidth() const { return iconSpace + font->CharWidth() * charsPerEntry; } + int ColWidth() const { return iconSpace + font->CharWidth() * (charsPerEntry + charsPerNumber) + (charsPerNumber ? font->CharWidth() : 0); } int RowHeight() const { return font->CharHeight() + rowGap; } int CharsPerEntry() const { return charsPerEntry; } T &Selected() { return entries[selected].value; } const T &Selected() const { return entries[selected].value; } const char *SelectedTitle() const { return entries[selected].title; } + int SelectedNumber() const { return entries[selected].number; } bool SelectedIsEnabled() const { return entries[selected].enabled; } void NextItem(); @@ -53,7 +54,8 @@ public: T &ValueAt(int index) { return entries[index].value; } const T &ValueAt(int index) const { return entries[index].value; } - void Add(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0) { entries.push_back(Entry(title, value, enabled, icon)); } + void Add(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0) { entries.push_back(Entry(title, value, enabled, icon, number)); } + void AddEmptyEntry() { entries.push_back(Entry(0, T(), false)); } void Disable(int index) { entries[index].enabled = false; } void Enable(int index) { entries[index].enabled = true; } void Reserve(int n) { entries.reserve(n); } @@ -67,10 +69,11 @@ private: private: struct Entry { - Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0) - : title(title), icon(icon), value(value), enabled(enabled) { } + Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0) + : title(title), icon(icon), number(number), value(value), enabled(enabled) { } const char *title; const Sprite *icon; + int number; T value; bool enabled; }; @@ -86,6 +89,8 @@ private: int colGap; int selected; int topRow; + int charsPerNumber; + char delimiter; }; @@ -102,12 +107,14 @@ Menu::Menu() , cols(0) , colGap(0) , selected(0) -, topRow(0) { +, topRow(0) +, charsPerNumber(0) +, delimiter(':') { } template -Menu::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, int iconSpace, int cols, int colGap) +Menu::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, int iconSpace, int cols, int colGap, int charsPerNumber, char delimiter) : font(font) , disabledFont(disabledFont ? disabledFont : font) , cursor(cursor) @@ -118,7 +125,9 @@ Menu::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, , cols(cols) , colGap(colGap) , selected(0) -, topRow(0) { +, topRow(0) +, charsPerNumber(charsPerNumber) +, delimiter(delimiter) { } @@ -173,17 +182,22 @@ void Menu::Draw(SDL_Surface *dest, geometry::Point position) const { int items(entries.size() - start); int end(start + (items < slots ? items : slots)); for (int i(0), count(end - start); i < count; ++i) { + if (!entries[start + i].title) continue; geometry::Vector iconOffset( (i % cols) * (ColWidth() + colGap), (i / cols) * RowHeight()); if (entries[start + i].icon) { entries[start + i].icon->Draw(dest, position + iconOffset); } - geometry::Vector labelOffset(iconOffset.X() + + iconSpace, iconOffset.Y()); - if (entries[start + i].enabled) { - font->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry); - } else { - disabledFont->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry); + geometry::Vector labelOffset(iconOffset.X() + iconSpace, iconOffset.Y()); + const Font *usedFont(entries[start + i].enabled ? font : disabledFont); + usedFont->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry); + + if (charsPerNumber) { + geometry::Vector delimiterOffset(labelOffset.X() + charsPerEntry * usedFont->CharWidth(), labelOffset.Y()); + usedFont->DrawChar(delimiter, dest, position + delimiterOffset); + geometry::Vector numberOffset(delimiterOffset.X() + usedFont->CharWidth(), delimiterOffset.Y()); + usedFont->DrawNumber(entries[start + i].number, dest, position + numberOffset); } } geometry::Vector cursorOffset( diff --git a/src/main.cpp b/src/main.cpp index cd76905..dbe50d2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -264,7 +264,7 @@ int main(int argc, char **argv) { battleRes.inventory = &inventory; battleRes.itemMenuHeadline = "Please choose an item."; - battleRes.itemMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 15, 6, 8, 16, 1, 32); + battleRes.itemMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 15, 6, 8, 16, 1, 32, 2, ':'); battleRes.ikariMenuHeadline = "Please choose equipment."; battleRes.ikariMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 26, 6, 8, 16, 1, 32); -- 2.39.2