#include "Sprite.h"
#include "../geometry/Vector.h"
+#include <algorithm>
#include <vector>
#include <SDL.h>
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 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(); }
};
std::vector<Entry> entries;
int selected;
+ int secondarySelection;
int topRow;
enum State {
STATE_INACTIVE,
STATE_ACTIVE,
STATE_SELECTED,
+ STATE_DUAL,
};
State state;
Menu<T>::Menu()
: MenuProperties()
, selected(0)
+, secondarySelection(0)
, topRow(0)
, state(STATE_ACTIVE) {
Menu<T>::Menu(const MenuProperties &p)
: MenuProperties(p)
, selected(0)
+, secondarySelection(0)
, topRow(0)
, state(STATE_ACTIVE) {
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;
}
}