X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FMenu.h;h=886e2fd07af5a7bacb4d0c04566bc9824719231f;hb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;hp=188c574b341b834e8c6fad6101fd1b85cfa8b6d8;hpb=7e59a87ac7caf96ffa38f2595581a6009a20339a;p=l2e.git diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index 188c574..886e2fd 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -1,10 +1,3 @@ -/* - * Menu.h - * - * Created on: Aug 8, 2012 - * Author: holy - */ - #ifndef GRAPHICS_MENU_H_ #define GRAPHICS_MENU_H_ @@ -13,6 +6,7 @@ #include "Sprite.h" #include "../geometry/Vector.h" +#include #include #include @@ -24,6 +18,7 @@ struct MenuProperties { const Font *font; const Font *disabledFont; const Sprite *cursor; + const Sprite *selectedCursor; int charsPerEntry; int rows; int rowGap; @@ -38,9 +33,9 @@ struct MenuProperties { bool wrapY; MenuProperties() - : font(0), disabledFont(0), cursor(0) - , charsPerEntry(0), rows(0), rowGap(0) - , iconSpace(0), cols(0), colGap(0) + : font(0), disabledFont(0), cursor(0), selectedCursor(0) + , charsPerEntry(0), rows(1), rowGap(0) + , iconSpace(0), cols(1), colGap(0) , charsPerNumber(0), charsPerAdditionalText(0) , additionalTextGap(0), delimiter(':') , wrapX(false), wrapY(false) { } @@ -59,6 +54,14 @@ public: Menu(const MenuProperties &); public: + void SetInactive() { state = STATE_INACTIVE; } + void SetActive() { state = STATE_ACTIVE; } + void SetSelected() { state = STATE_SELECTED; } + void SetDualSelection() { state = STATE_DUAL; secondarySelection = selected; } + bool IsActive() const { return state == STATE_ACTIVE; } + bool HasSelected() const { return state == STATE_SELECTED; } + bool InDualMode() const { return state == STATE_DUAL; } + int Width() const; int Height() const; int ColWidth() const; @@ -71,12 +74,22 @@ public: int SelectedNumber() const { return entries[selected].number; } bool SelectedIsEnabled() const { return entries[selected].enabled; } + T &SecondarySelection() { return entries[secondarySelection].value; } + const T &SecondarySelection() const { return entries[secondarySelection].value; } + const char *SecondaryTitle() const { return entries[secondarySelection].title; } + int SecondaryNumber() const { return entries[secondarySelection].number; } + bool SecondaryIsEnabled() const { return entries[secondarySelection].enabled; } + + void SwapSelected() { SwapEntriesAt(selected, secondarySelection); } + void SwapEntriesAt(int lhs, int rhs) { std::swap(entries[lhs], entries[rhs]); } + void NextItem(); void PreviousItem(); void NextRow(); void PreviousRow(); void SelectIndex(int index); int SelectedIndex() const { return selected; } + int SecondaryIndex() const { return secondarySelection; } bool IsSelected(int index) const { return index == selected; } int EntryCount() const { return entries.size(); } @@ -89,6 +102,7 @@ public: void Enable(int index) { entries[index].enabled = true; } void Reserve(int n) { entries.reserve(n); } void Clear() { entries.clear(); } + void ClearEntry(int at) { entries[at] = Entry(0, T(), false); } void Draw(SDL_Surface *dest, const geometry::Vector &position) const; @@ -109,7 +123,15 @@ private: }; std::vector entries; int selected; + int secondarySelection; int topRow; + enum State { + STATE_INACTIVE, + STATE_ACTIVE, + STATE_SELECTED, + STATE_DUAL, + }; + State state; }; @@ -118,7 +140,9 @@ template Menu::Menu() : MenuProperties() , selected(0) -, topRow(0) { +, secondarySelection(0) +, topRow(0) +, state(STATE_ACTIVE) { } @@ -126,7 +150,9 @@ template Menu::Menu(const MenuProperties &p) : MenuProperties(p) , selected(0) -, topRow(0) { +, secondarySelection(0) +, topRow(0) +, state(STATE_ACTIVE) { } @@ -214,6 +240,13 @@ void Menu::Draw(SDL_Surface *dest, const geometry::Vector &position) con 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); } @@ -234,13 +267,37 @@ void Menu::Draw(SDL_Surface *dest, const geometry::Vector &position) con 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( (selected % cols) * (ColWidth() + colGap) - cursor->Width(), ((selected - start) / cols) * RowHeight()); - cursor->Draw(dest, position + cursorOffset); + // Third column hack! + // This fixes the position of the "DROP" item in the inventory menu. + if (selected % cols == 2) { + cursorOffset += geometry::Vector(font->CharWidth(), 0); + } + switch (state) { + case STATE_INACTIVE: + break; + case STATE_ACTIVE: + cursor->Draw(dest, position + cursorOffset); + break; + case STATE_SELECTED: + selectedCursor->Draw(dest, position + cursorOffset); + break; + case STATE_DUAL: + cursor->Draw(dest, position + cursorOffset + - geometry::Vector(selectedCursor->Width(), 0)); + if (secondarySelection >= start && secondarySelection <= end) { + geometry::Vector secondaryOffset( + (secondarySelection % cols) * (ColWidth() + colGap) - cursor->Width(), + ((secondarySelection - start) / cols) * RowHeight()); + selectedCursor->Draw(dest, position + secondaryOffset); + } + break; + } } }