From ea2353f282a48a4474b32a1ab604eaf1aeff4e2b Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Sat, 17 Nov 2012 14:18:08 +0100 Subject: [PATCH] added 'dual' menu state in this state, the selected cursor is saved and another cursor can be moved --- src/graphics/Menu.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index 68deef8..b29e968 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -13,6 +13,7 @@ #include "Sprite.h" #include "../geometry/Vector.h" +#include #include #include @@ -63,8 +64,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 +81,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(); } @@ -116,11 +129,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 +146,7 @@ template Menu::Menu() : MenuProperties() , selected(0) +, secondarySelection(0) , topRow(0) , state(STATE_ACTIVE) { @@ -140,6 +156,7 @@ template Menu::Menu(const MenuProperties &p) : MenuProperties(p) , selected(0) +, secondarySelection(0) , topRow(0) , state(STATE_ACTIVE) { @@ -271,6 +288,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 + - 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; } } -- 2.39.2