From cc3905e6ddd9536139cb5d613c3e2d90c83b60fc Mon Sep 17 00:00:00 2001
From: Daniel Karbach <daniel.karbach@localhorst.tv>
Date: Sun, 11 Nov 2012 18:49:40 +0100
Subject: [PATCH] hook alternate cursor in inventory menu

---
 src/graphics/Menu.h        | 32 ++++++++++++++++++++++++++++----
 src/main.cpp               |  2 ++
 src/menu/InventoryMenu.cpp | 36 +++++++++++++++++++++++++++---------
 3 files changed, 57 insertions(+), 13 deletions(-)

diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h
index e42f24e..68deef8 100644
--- a/src/graphics/Menu.h
+++ b/src/graphics/Menu.h
@@ -24,6 +24,7 @@ struct MenuProperties {
 	const Font *font;
 	const Font *disabledFont;
 	const Sprite *cursor;
+	const Sprite *selectedCursor;
 	int charsPerEntry;
 	int rows;
 	int rowGap;
@@ -38,7 +39,7 @@ struct MenuProperties {
 	bool wrapY;
 
 	MenuProperties()
-	: font(0), disabledFont(0), cursor(0)
+	: font(0), disabledFont(0), cursor(0), selectedCursor(0)
 	, charsPerEntry(0), rows(1), rowGap(0)
 	, iconSpace(0), cols(1), colGap(0)
 	, charsPerNumber(0), charsPerAdditionalText(0)
@@ -59,6 +60,12 @@ public:
 	Menu(const MenuProperties &);
 
 public:
+	void SetInactive() { state = STATE_INACTIVE; }
+	void SetActive() { state = STATE_ACTIVE; }
+	void SetSelected() { state = STATE_SELECTED; }
+	bool IsActive() const { return state == STATE_ACTIVE; }
+	bool HasSelected() const { return state == STATE_SELECTED; }
+
 	int Width() const;
 	int Height() const;
 	int ColWidth() const;
@@ -110,6 +117,12 @@ private:
 	std::vector<Entry> entries;
 	int selected;
 	int topRow;
+	enum State {
+		STATE_INACTIVE,
+		STATE_ACTIVE,
+		STATE_SELECTED,
+	};
+	State state;
 
 };
 
@@ -118,7 +131,8 @@ template<class T>
 Menu<T>::Menu()
 : MenuProperties()
 , selected(0)
-, topRow(0) {
+, topRow(0)
+, state(STATE_ACTIVE) {
 
 }
 
@@ -126,7 +140,8 @@ template<class T>
 Menu<T>::Menu(const MenuProperties &p)
 : MenuProperties(p)
 , selected(0)
-, topRow(0) {
+, topRow(0)
+, state(STATE_ACTIVE) {
 
 }
 
@@ -247,7 +262,16 @@ 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());
-	cursor->Draw(dest, position + cursorOffset);
+	switch (state) {
+		case STATE_INACTIVE:
+			break;
+		case STATE_ACTIVE:
+			cursor->Draw(dest, position + cursorOffset);
+			break;
+		case STATE_SELECTED:
+			selectedCursor->Draw(dest, position + cursorOffset);
+			break;
+	}
 }
 
 }
diff --git a/src/main.cpp b/src/main.cpp
index d76eca5..9ed4af3 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -364,6 +364,7 @@ int main(int argc, char **argv) {
 		itemMenuProperties.rowGap = 8;
 		itemMenuProperties.colGap = 16;
 		itemMenuProperties.cursor = &menuCursor;
+		itemMenuProperties.selectedCursor = &menuActiveCursor;
 		itemMenuProperties.font = &menuFont;
 		itemMenuProperties.wrapX = true;
 		itemMenuProperties.wrapY = true;
@@ -378,6 +379,7 @@ int main(int argc, char **argv) {
 		inventoryMenuProperties.charsPerEntry = 13;
 		inventoryMenuProperties.rowGap = 8;
 		inventoryMenuProperties.cursor = &menuCursor;
+		itemMenuProperties.selectedCursor = &menuActiveCursor;
 		inventoryMenuProperties.font = &menuFont;
 		// TODO: disabled font
 		inventoryMenuProperties.disabledFont = &menuFont;
diff --git a/src/menu/InventoryMenu.cpp b/src/menu/InventoryMenu.cpp
index 2ea7fb3..82a615b 100644
--- a/src/menu/InventoryMenu.cpp
+++ b/src/menu/InventoryMenu.cpp
@@ -37,6 +37,7 @@ InventoryMenu::InventoryMenu(PartyMenu *parent)
 
 
 void InventoryMenu::OnEnterState(SDL_Surface *) {
+	menu.SetSelected();
 	const Inventory &inv(parent->Game().state->inventory);
 	itemMenu.Clear();
 	itemMenu.Reserve(inv.MaxItems());
@@ -69,18 +70,35 @@ void InventoryMenu::OnResize(int width, int height) {
 
 
 void InventoryMenu::HandleEvents(const Input &input) {
-	if (input.JustPressed(Input::PAD_LEFT)) {
-		menu.PreviousItem();
-	}
-	if (input.JustPressed(Input::PAD_RIGHT)) {
-		menu.NextItem();
+	if (menu.IsActive()) {
+		if (input.JustPressed(Input::PAD_LEFT)) {
+			menu.PreviousItem();
+		}
+		if (input.JustPressed(Input::PAD_RIGHT)) {
+			menu.NextItem();
+		}
+	} else {
+		if (input.JustPressed(Input::PAD_UP)) {
+			itemMenu.PreviousItem();
+		}
+		if (input.JustPressed(Input::PAD_DOWN)) {
+			itemMenu.NextItem();
+		}
 	}
 
-	if (input.JustPressed(Input::PAD_UP)) {
-		itemMenu.PreviousItem();
+	if (input.JustPressed(Input::ACTION_A)) {
+		if (menu.IsActive()) {
+			menu.SetSelected();
+			itemMenu.SetActive();
+		}
 	}
-	if (input.JustPressed(Input::PAD_DOWN)) {
-		itemMenu.NextItem();
+	if (input.JustPressed(Input::ACTION_B)) {
+		if (menu.IsActive()) {
+			Ctrl().PopState();
+		} else {
+			menu.SetActive();
+			itemMenu.SetInactive();
+		}
 	}
 }
 
-- 
2.39.5