-/*
- * Menu.h
- *
- * Created on: Aug 8, 2012
- * Author: holy
- */
-
#ifndef GRAPHICS_MENU_H_
#define GRAPHICS_MENU_H_
#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(); }
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;
};
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) {
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;
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;
}
}