]> git.localhorst.tv Git - l2e.git/blobdiff - src/graphics/Menu.h
removed stupid file headers that eclipse put in
[l2e.git] / src / graphics / Menu.h
index 68deef8da0814c98144fb656c02560f5813852c6..886e2fd07af5a7bacb4d0c04566bc9824719231f 100644 (file)
@@ -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 <algorithm>
 #include <vector>
 #include <SDL.h>
 
@@ -63,8 +57,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 +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(); }
@@ -96,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<int> &position) const;
 
@@ -116,11 +123,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 +140,7 @@ template<class T>
 Menu<T>::Menu()
 : MenuProperties()
 , selected(0)
+, secondarySelection(0)
 , topRow(0)
 , state(STATE_ACTIVE) {
 
@@ -140,6 +150,7 @@ template<class T>
 Menu<T>::Menu(const MenuProperties &p)
 : MenuProperties(p)
 , selected(0)
+, secondarySelection(0)
 , topRow(0)
 , state(STATE_ACTIVE) {
 
@@ -262,6 +273,11 @@ void Menu<T>::Draw(SDL_Surface *dest, const geometry::Vector<int> &position) con
        geometry::Vector<int> cursorOffset(
                        (selected % cols) * (ColWidth() + colGap) - cursor->Width(),
                        ((selected - start) / cols) * RowHeight());
+       // Third column hack!
+       // This fixes the position of the "DROP" item in the inventory menu.
+       if (selected % cols == 2) {
+               cursorOffset += geometry::Vector<int>(font->CharWidth(), 0);
+       }
        switch (state) {
                case STATE_INACTIVE:
                        break;
@@ -271,6 +287,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;
        }
 }