X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FMenu.h;h=e42f24e0cfcf7334777f99616aaa6fa34c44b990;hb=c1de2db3755c2cffd790c58bbd92e7fc993afcb5;hp=4d448b62df6de2b824f85eac8f2dacf587857ec4;hpb=4170813213bafe6f4a01a79bf42308ddb7f3c545;p=l2e.git diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index 4d448b6..e42f24e 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -9,9 +9,8 @@ #define GRAPHICS_MENU_H_ #include "Font.h" +#include "fwd.h" #include "Sprite.h" -#include "../geometry/operators.h" -#include "../geometry/Point.h" #include "../geometry/Vector.h" #include @@ -19,15 +18,45 @@ namespace graphics { -class Sprite; +struct MenuProperties { + static const int TYPE_ID = 407; + + const Font *font; + const Font *disabledFont; + const Sprite *cursor; + int charsPerEntry; + int rows; + int rowGap; + int iconSpace; + int cols; + int colGap; + int charsPerNumber; + int charsPerAdditionalText; + int additionalTextGap; + char delimiter; + bool wrapX; + bool wrapY; + + MenuProperties() + : font(0), disabledFont(0), cursor(0) + , charsPerEntry(0), rows(1), rowGap(0) + , iconSpace(0), cols(1), colGap(0) + , charsPerNumber(0), charsPerAdditionalText(0) + , additionalTextGap(0), delimiter(':') + , wrapX(false), wrapY(false) { } + + static void CreateTypeDescription(); + static void Construct(void *); + +}; -// TODO: animation when top row changes template -class Menu { +class Menu +: private MenuProperties { 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 = ':', int charsPerAdditionalText = 0, int additionalTextGap = 0); + Menu(const MenuProperties &); public: int Width() const; @@ -61,7 +90,7 @@ public: 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; } @@ -78,63 +107,26 @@ private: T value; bool enabled; }; - const Font *font; - const Font *disabledFont; - const Sprite *cursor; std::vector entries; - int charsPerEntry; - int rows; - int rowGap; - int iconSpace; - int cols; - int colGap; int selected; int topRow; - int charsPerNumber; - int charsPerAdditionalText; - int additionalTextGap; - char delimiter; }; template Menu::Menu() -: font(0) -, disabledFont(0) -, cursor(0) -, charsPerEntry(0) -, rows(0) -, rowGap(0) -, iconSpace(0) -, cols(0) -, colGap(0) +: MenuProperties() , selected(0) -, topRow(0) -, charsPerNumber(0) -, charsPerAdditionalText(0) -, additionalTextGap(0) -, delimiter(':') { +, topRow(0) { } 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, int charsPerAdditionalText, int additionalTextGap) -: font(font) -, disabledFont(disabledFont ? disabledFont : font) -, cursor(cursor) -, charsPerEntry(charsPerEntry) -, rows(rows) -, rowGap(rowGap) -, iconSpace(iconSpace) -, cols(cols) -, colGap(colGap) +Menu::Menu(const MenuProperties &p) +: MenuProperties(p) , selected(0) -, topRow(0) -, charsPerNumber(charsPerNumber) -, charsPerAdditionalText(charsPerAdditionalText) -, additionalTextGap(additionalTextGap) -, delimiter(delimiter) { +, topRow(0) { } @@ -165,22 +157,38 @@ int Menu::Height() const { template void Menu::NextItem() { - SelectIndex(selected + 1); + int index(selected + 1); + if (wrapX && index % cols == 0) { + index -= cols; + } + SelectIndex(index); } template void Menu::PreviousItem() { - SelectIndex(selected - 1); + int index(selected - 1); + if (wrapX && selected % cols == 0) { + index += cols; + } + SelectIndex(index); } template void Menu::NextRow() { - SelectIndex(selected + cols); + int index(selected + cols); + if (wrapY && index >= int(entries.size())) { + index -= entries.size(); + } + SelectIndex(index); } template void Menu::PreviousRow() { - SelectIndex(selected - cols); + int index(selected - cols); + if (wrapY && index < 0) { + index += entries.size(); + } + SelectIndex(index); } template @@ -196,7 +204,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); @@ -206,6 +214,13 @@ void Menu::Draw(SDL_Surface *dest, geometry::Point position) const { geometry::Vector iconOffset( (i % cols) * (ColWidth() + colGap), (i / cols) * RowHeight()); + + // Third column hack! + // This fixes the position of the "DROP" item in the inventory menu. + if (i % cols == 2) { + iconOffset += geometry::Vector(font->CharWidth(), 0); + } + if (entries[start + i].icon) { entries[start + i].icon->Draw(dest, position + iconOffset); } @@ -226,7 +241,7 @@ void Menu::Draw(SDL_Surface *dest, geometry::Point position) const { if (charsPerNumber) { usedFont->DrawChar(delimiter, dest, position + textOffset); textOffset += geometry::Vector(usedFont->CharWidth(), 0); - usedFont->DrawNumber(entries[start + i].number, dest, position + textOffset); + usedFont->DrawNumber(entries[start + i].number, dest, position + textOffset, charsPerNumber); } } geometry::Vector cursorOffset(