From: Daniel Karbach Date: Sun, 11 Nov 2012 17:49:40 +0000 (+0100) Subject: hook alternate cursor in inventory menu X-Git-Url: https://git.localhorst.tv/?a=commitdiff_plain;h=cc3905e6ddd9536139cb5d613c3e2d90c83b60fc;p=l2e.git hook alternate cursor in inventory menu --- 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 entries; int selected; int topRow; + enum State { + STATE_INACTIVE, + STATE_ACTIVE, + STATE_SELECTED, + }; + State state; }; @@ -118,7 +131,8 @@ template Menu::Menu() : MenuProperties() , selected(0) -, topRow(0) { +, topRow(0) +, state(STATE_ACTIVE) { } @@ -126,7 +140,8 @@ template Menu::Menu(const MenuProperties &p) : MenuProperties(p) , selected(0) -, topRow(0) { +, topRow(0) +, state(STATE_ACTIVE) { } @@ -247,7 +262,16 @@ void Menu::Draw(SDL_Surface *dest, const geometry::Vector &position) con geometry::Vector 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(); + } } }