X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FMenu.h;h=1cdddcdb01467cb752ebc979913a55a7fd03a34e;hb=8670d83df24f13cd9b4fd324dca9f13824400f7a;hp=f35a2bed2ce370cc8d19d8717a1e4de17eb1b6d7;hpb=e462583cabc752b8f03b423e98e93bca5f5045d8;p=l2e.git diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index f35a2be..1cdddcd 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -14,7 +14,6 @@ #include "../geometry/Point.h" #include "../geometry/Vector.h" -#include #include #include @@ -28,14 +27,14 @@ class Menu { public: Menu(); - Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int cols = 1, int colGap = 0); - Menu(const 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); public: int Width() const; int Height() const; - int ColWidth() const { return font->CharWidth() * charsPerEntry; } + int ColWidth() const { return iconSpace + font->CharWidth() * charsPerEntry; } 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; } @@ -58,6 +57,7 @@ public: 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; @@ -81,6 +81,7 @@ private: int charsPerEntry; int rows; int rowGap; + int iconSpace; int cols; int colGap; int selected; @@ -97,6 +98,7 @@ Menu::Menu() , charsPerEntry(0) , rows(0) , rowGap(0) +, iconSpace(0) , cols(0) , colGap(0) , selected(0) @@ -105,13 +107,14 @@ Menu::Menu() } template -Menu::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, 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) : font(font) , disabledFont(disabledFont ? disabledFont : font) , cursor(cursor) , charsPerEntry(charsPerEntry) , rows(rows) , rowGap(rowGap) +, iconSpace(iconSpace) , cols(cols) , colGap(colGap) , selected(0) @@ -119,22 +122,6 @@ Menu::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, } -template -Menu::Menu(const Menu &other) -: font(other.font) -, disabledFont(other.disabledFont) -, cursor(other.cursor) -, entries(other.entries) -, charsPerEntry(other.charsPerEntry) -, rows(other.rows) -, rowGap(other.rowGap) -, cols(other.cols) -, colGap(other.colGap) -, selected(other.selected) -, topRow(other.topRow) { - std::cout << "copied Menu" << std::endl; -} - template int Menu::Width() const { @@ -169,11 +156,10 @@ void Menu::PreviousRow() { template void Menu::SelectIndex(int index) { - if (index < 0 || int(entries.size()) < index) return; - std::cout << "selecting index " << index << std::endl; + if (index < 0 || int(entries.size()) <= index) return; selected = index; - if (GetRow(selected) - rows > topRow) { - topRow = GetRow(selected) - rows; + if (topRow <= GetRow(selected) - rows) { + topRow = GetRow(selected) - rows + 1; } else if (GetRow(selected) < topRow) { topRow = GetRow(selected); } @@ -183,22 +169,26 @@ void Menu::SelectIndex(int index) { template void Menu::Draw(SDL_Surface *dest, geometry::Point position) const { int start(topRow * cols); - int slots((topRow + rows) * cols); + int slots(rows * cols); int items(entries.size() - start); - int end(items < slots ? items : slots); + int end(start + (items < slots ? items : slots)); for (int i(0), count(end - start); i < count; ++i) { - geometry::Vector offset( + 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 + offset, charsPerEntry); + font->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry); } else { - disabledFont->DrawString(entries[start + i].title, dest, position + offset, charsPerEntry); + disabledFont->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry); } } geometry::Vector cursorOffset( (selected % cols) * (ColWidth() + colGap) - cursor->Width(), - (selected / cols) * RowHeight()); + ((selected - start) / cols) * RowHeight()); cursor->Draw(dest, position + cursorOffset); }