]> git.localhorst.tv Git - l2e.git/commitdiff
hook alternate cursor in inventory menu
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Sun, 11 Nov 2012 17:49:40 +0000 (18:49 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Sun, 11 Nov 2012 17:49:40 +0000 (18:49 +0100)
src/graphics/Menu.h
src/main.cpp
src/menu/InventoryMenu.cpp

index e42f24e0cfcf7334777f99616aaa6fa34c44b990..68deef8da0814c98144fb656c02560f5813852c6 100644 (file)
@@ -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;
+       }
 }
 
 }
index d76eca5c6b1e44be8037810ca842f89ea7060115..9ed4af396efa07c7094eddb9db08a6546da40c78 100644 (file)
@@ -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;
index 2ea7fb328eaf90dcb1ca90eb492cf7ba87626c7a..82a615b103a465c0e77ef41f78090ce0dc79f6aa 100644 (file)
@@ -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();
+               }
        }
 }