X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FMenu.h;h=f1a6d2580e25e6657a222e038eca393793c8a0ad;hb=d20fa78a0dcbc95a69bb6077d2081d42b74a2d1a;hp=26b9d0527033484ee594f72d7342b816b2d46898;hpb=7946f704a4cd3a985d2fb523079fce7fa14c341e;p=l2e.git diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index 26b9d05..f1a6d25 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -10,8 +10,6 @@ #include "Font.h" #include "Sprite.h" -#include "../geometry/operators.h" -#include "../geometry/Point.h" #include "../geometry/Vector.h" #include @@ -27,12 +25,12 @@ 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, int charsPerNumber = 0, char delimiter = ':'); + 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 = ':', int charsPerAdditionalText = 0, int additionalTextGap = 0); public: int Width() const; int Height() const; - int ColWidth() const { return iconSpace + font->CharWidth() * (charsPerEntry + charsPerNumber) + (charsPerNumber ? font->CharWidth() : 0); } + int ColWidth() const; int RowHeight() const { return font->CharHeight() + rowGap; } int CharsPerEntry() const { return charsPerEntry; } @@ -54,14 +52,14 @@ 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, int number = 0) { entries.push_back(Entry(title, value, enabled, icon, number)); } + void Add(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0, const char *additionalText = 0) { entries.push_back(Entry(title, value, enabled, icon, number, additionalText)); } 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); } void Clear() { entries.clear(); } - void Draw(SDL_Surface *dest, geometry::Point position) const; + void Draw(SDL_Surface *dest, const geometry::Vector &position) const; private: int GetRow(int index) const { return index / cols; } @@ -69,9 +67,10 @@ private: private: struct Entry { - 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) { } + Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0, const char *additionalText = 0) + : title(title), additionalText(additionalText), icon(icon), number(number), value(value), enabled(enabled) { } const char *title; + const char *additionalText; const Sprite *icon; int number; T value; @@ -90,6 +89,8 @@ private: int selected; int topRow; int charsPerNumber; + int charsPerAdditionalText; + int additionalTextGap; char delimiter; }; @@ -109,12 +110,14 @@ Menu::Menu() , selected(0) , topRow(0) , charsPerNumber(0) +, charsPerAdditionalText(0) +, additionalTextGap(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, int charsPerNumber, char delimiter) +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, int charsPerAdditionalText, int additionalTextGap) : font(font) , disabledFont(disabledFont ? disabledFont : font) , cursor(cursor) @@ -127,11 +130,26 @@ Menu::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, , selected(0) , topRow(0) , charsPerNumber(charsPerNumber) +, charsPerAdditionalText(charsPerAdditionalText) +, additionalTextGap(additionalTextGap) , delimiter(delimiter) { } +template +int Menu::ColWidth() const { + int width(iconSpace); + width += font->CharWidth() * (charsPerEntry + charsPerNumber); + if (charsPerNumber) { + width += font->CharWidth(); + } + if (charsPerAdditionalText) { + width += additionalTextGap + charsPerAdditionalText * font->CharWidth(); + } + return width; +} + template int Menu::Width() const { return cols * ColWidth() + (cols - 1) * colGap; @@ -176,7 +194,7 @@ void Menu::SelectIndex(int index) { template -void Menu::Draw(SDL_Surface *dest, geometry::Point position) const { +void Menu::Draw(SDL_Surface *dest, const geometry::Vector &position) const { int start(topRow * cols); int slots(rows * cols); int items(entries.size() - start); @@ -189,15 +207,24 @@ void Menu::Draw(SDL_Surface *dest, geometry::Point position) const { if (entries[start + i].icon) { entries[start + i].icon->Draw(dest, position + iconOffset); } - geometry::Vector labelOffset(iconOffset.X() + iconSpace, iconOffset.Y()); + geometry::Vector textOffset(iconOffset.X() + iconSpace, iconOffset.Y()); const Font *usedFont(entries[start + i].enabled ? font : disabledFont); - usedFont->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry); + usedFont->DrawString(entries[start + i].title, dest, position + textOffset, charsPerEntry); + + textOffset += geometry::Vector(charsPerEntry * usedFont->CharWidth(), 0); + + if (charsPerAdditionalText) { + textOffset += geometry::Vector(additionalTextGap, 0); + if (entries[start + i].additionalText) { + usedFont->DrawString(entries[start + i].additionalText, dest, position + textOffset, charsPerAdditionalText); + } + textOffset += geometry::Vector(charsPerAdditionalText * usedFont->CharWidth(), 0); + } 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); + usedFont->DrawChar(delimiter, dest, position + textOffset); + textOffset += geometry::Vector(usedFont->CharWidth(), 0); + usedFont->DrawNumber(entries[start + i].number, dest, position + textOffset); } } geometry::Vector cursorOffset(