X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FMenu.h;h=91cc3a7cbbe6431a7021a4611c82dd59c54eb255;hb=a3ba4dc677ad7c92eeb78b20b642241563605c9d;hp=68deef8da0814c98144fb656c02560f5813852c6;hpb=cc3905e6ddd9536139cb5d613c3e2d90c83b60fc;p=l2e.git diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index 68deef8..91cc3a7 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -1,18 +1,12 @@ -/* - * Menu.h - * - * Created on: Aug 8, 2012 - * Author: holy - */ - #ifndef GRAPHICS_MENU_H_ #define GRAPHICS_MENU_H_ #include "Font.h" #include "fwd.h" #include "Sprite.h" -#include "../geometry/Vector.h" +#include "../math/Vector.h" +#include #include #include @@ -34,6 +28,7 @@ struct MenuProperties { int charsPerNumber; int charsPerAdditionalText; int additionalTextGap; + int thirdColumnHack; char delimiter; bool wrapX; bool wrapY; @@ -43,7 +38,7 @@ struct MenuProperties { , charsPerEntry(0), rows(1), rowGap(0) , iconSpace(0), cols(1), colGap(0) , charsPerNumber(0), charsPerAdditionalText(0) - , additionalTextGap(0), delimiter(':') + , additionalTextGap(0), thirdColumnHack(0), delimiter(':') , wrapX(false), wrapY(false) { } static void CreateTypeDescription(); @@ -63,8 +58,10 @@ 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; @@ -78,12 +75,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(); } @@ -96,8 +103,9 @@ 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; + void Draw(SDL_Surface *dest, const math::Vector &position) const; private: int GetRow(int index) const { return index / cols; } @@ -116,11 +124,13 @@ private: }; std::vector entries; int selected; + int secondarySelection; int topRow; enum State { STATE_INACTIVE, STATE_ACTIVE, STATE_SELECTED, + STATE_DUAL, }; State state; @@ -131,6 +141,7 @@ template Menu::Menu() : MenuProperties() , selected(0) +, secondarySelection(0) , topRow(0) , state(STATE_ACTIVE) { @@ -140,6 +151,7 @@ template Menu::Menu(const MenuProperties &p) : MenuProperties(p) , selected(0) +, secondarySelection(0) , topRow(0) , state(STATE_ACTIVE) { @@ -219,49 +231,52 @@ void Menu::SelectIndex(int index) { template -void Menu::Draw(SDL_Surface *dest, const geometry::Vector &position) const { +void Menu::Draw(SDL_Surface *dest, const math::Vector &position) const { int start(topRow * cols); int slots(rows * cols); int items(entries.size() - start); int end(start + (items < slots ? items : slots)); for (int i(0), count(end - start); i < count; ++i) { if (!entries[start + i].title) continue; - geometry::Vector iconOffset( + math::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); + // This fixes the position of the third column of the inventory and capsule menus. + if (thirdColumnHack && i % cols == 2) { + iconOffset += math::Vector(font->CharWidth() * thirdColumnHack, 0); } if (entries[start + i].icon) { entries[start + i].icon->Draw(dest, position + iconOffset); } - geometry::Vector textOffset(iconOffset.X() + iconSpace, iconOffset.Y()); + math::Vector textOffset(iconOffset.X() + iconSpace, iconOffset.Y()); const Font *usedFont(entries[start + i].enabled ? font : disabledFont); usedFont->DrawString(entries[start + i].title, dest, position + textOffset, charsPerEntry); - textOffset += geometry::Vector(charsPerEntry * usedFont->CharWidth(), 0); + textOffset += math::Vector(charsPerEntry * usedFont->CharWidth(), 0); if (charsPerAdditionalText) { - textOffset += geometry::Vector(additionalTextGap, 0); + textOffset += math::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); + textOffset += math::Vector(charsPerAdditionalText * usedFont->CharWidth(), 0); } if (charsPerNumber) { usedFont->DrawChar(delimiter, dest, position + textOffset); - textOffset += geometry::Vector(usedFont->CharWidth(), 0); + textOffset += math::Vector(usedFont->CharWidth(), 0); usedFont->DrawNumber(entries[start + i].number, dest, position + textOffset, charsPerNumber); } } - geometry::Vector cursorOffset( + math::Vector cursorOffset( (selected % cols) * (ColWidth() + colGap) - cursor->Width(), ((selected - start) / cols) * RowHeight()); + // This fixes the position of the third column of the inventory and capsule menus. + if (thirdColumnHack && selected % cols == 2) { + cursorOffset += math::Vector(font->CharWidth() * thirdColumnHack, 0); + } switch (state) { case STATE_INACTIVE: break; @@ -271,6 +286,16 @@ void Menu::Draw(SDL_Surface *dest, const geometry::Vector &position) con case STATE_SELECTED: selectedCursor->Draw(dest, position + cursorOffset); break; + case STATE_DUAL: + cursor->Draw(dest, position + cursorOffset + - math::Vector(selectedCursor->Width(), 0)); + if (secondarySelection >= start && secondarySelection <= end) { + math::Vector secondaryOffset( + (secondarySelection % cols) * (ColWidth() + colGap) - cursor->Width(), + ((secondarySelection - start) / cols) * RowHeight()); + selectedCursor->Draw(dest, position + secondaryOffset); + } + break; } }