X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FMenu.h;h=886e2fd07af5a7bacb4d0c04566bc9824719231f;hb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;hp=e42f24e0cfcf7334777f99616aaa6fa34c44b990;hpb=f552d26f537af9fa48255bd71cdc1a0a1b860bac;p=l2e.git diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index e42f24e..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,7 +33,7 @@ struct MenuProperties { bool wrapY; MenuProperties() - : font(0), disabledFont(0), cursor(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) @@ -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) { } @@ -247,7 +273,31 @@ void Menu::Draw(SDL_Surface *dest, const geometry::Vector &position) con 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; + } } }