]> git.localhorst.tv Git - l2e.git/commitdiff
added 'dual' menu state
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 17 Nov 2012 13:18:08 +0000 (14:18 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 17 Nov 2012 13:18:08 +0000 (14:18 +0100)
in this state, the selected cursor is saved and another cursor can be moved

src/graphics/Menu.h

index 68deef8da0814c98144fb656c02560f5813852c6..b29e9687cc58bd7019bc9f879bea14c9e3b24340 100644 (file)
@@ -13,6 +13,7 @@
 #include "Sprite.h"
 #include "../geometry/Vector.h"
 
+#include <algorithm>
 #include <vector>
 #include <SDL.h>
 
@@ -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<Entry> entries;
        int selected;
+       int secondarySelection;
        int topRow;
        enum State {
                STATE_INACTIVE,
                STATE_ACTIVE,
                STATE_SELECTED,
+               STATE_DUAL,
        };
        State state;
 
@@ -131,6 +146,7 @@ template<class T>
 Menu<T>::Menu()
 : MenuProperties()
 , selected(0)
+, secondarySelection(0)
 , topRow(0)
 , state(STATE_ACTIVE) {
 
@@ -140,6 +156,7 @@ template<class T>
 Menu<T>::Menu(const MenuProperties &p)
 : MenuProperties(p)
 , selected(0)
+, secondarySelection(0)
 , topRow(0)
 , state(STATE_ACTIVE) {
 
@@ -271,6 +288,16 @@ void Menu<T>::Draw(SDL_Surface *dest, const geometry::Vector<int> &position) con
                case STATE_SELECTED:
                        selectedCursor->Draw(dest, position + cursorOffset);
                        break;
+               case STATE_DUAL:
+                       cursor->Draw(dest, position + cursorOffset
+                                       - geometry::Vector<int>(selectedCursor->Width(), 0));
+                       if (secondarySelection >= start && secondarySelection <= end) {
+                               geometry::Vector<int> secondaryOffset(
+                                               (secondarySelection % cols) * (ColWidth() + colGap) - cursor->Width(),
+                                               ((secondarySelection - start) / cols) * RowHeight());
+                               selectedCursor->Draw(dest, position + secondaryOffset);
+                       }
+                       break;
        }
 }