From f019a9e52d0a3f5ca23681d5eb36bb2e56d37064 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Mon, 8 Dec 2014 22:20:27 +0300
Subject: Allow control popup menu by up/down keys.

---
 src/actions/actions.cpp        |  4 ++++
 src/actions/move.cpp           | 12 ++++++++++++
 src/gui/popups/popupmenu.cpp   | 15 +++++++++++++++
 src/gui/popups/popupmenu.h     |  6 ++++++
 src/gui/widgets/browserbox.cpp | 28 ++++++++++++++++++++++++++++
 src/gui/widgets/browserbox.h   |  6 ++++++
 6 files changed, 71 insertions(+)

diff --git a/src/actions/actions.cpp b/src/actions/actions.cpp
index 924fac801..64d05f8ab 100644
--- a/src/actions/actions.cpp
+++ b/src/actions/actions.cpp
@@ -246,6 +246,10 @@ impHandler0(ok)
         dialog->action(ActionEvent(nullptr, "ok"));
         return true;
     }
+    else if (popupMenu->isPopupVisible())
+    {
+        popupMenu->select();
+    }
     return false;
 }
 
diff --git a/src/actions/move.cpp b/src/actions/move.cpp
index 0fa4d4897..c75d24c36 100644
--- a/src/actions/move.cpp
+++ b/src/actions/move.cpp
@@ -30,6 +30,8 @@
 #include "gui/windows/npcdialog.h"
 #include "gui/windows/outfitwindow.h"
 
+#include "gui/popups/popupmenu.h"
+
 #include "net/playerhandler.h"
 
 #include "debug.h"
@@ -59,6 +61,11 @@ impHandler(moveUp)
 {
     if (inputManager.isActionActive(InputAction::EMOTE))
         return directUp(event);
+    if (popupMenu->isPopupVisible())
+    {
+        popupMenu->moveUp();
+        return true;
+    }
     return closeMoveNpcDialog(false);
 }
 
@@ -66,6 +73,11 @@ impHandler(moveDown)
 {
     if (inputManager.isActionActive(InputAction::EMOTE))
         return directDown(event);
+    if (popupMenu->isPopupVisible())
+    {
+        popupMenu->moveDown();
+        return true;
+    }
     return closeMoveNpcDialog(false);
 }
 
diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp
index f6a2959bd..eb2144de3 100644
--- a/src/gui/popups/popupmenu.cpp
+++ b/src/gui/popups/popupmenu.cpp
@@ -3035,3 +3035,18 @@ void PopupMenu::showGMPopup()
 
     showPopup(getX(), getY());
 }
+
+void PopupMenu::moveUp()
+{
+    mBrowserBox->moveSelectionUp();
+}
+
+void PopupMenu::moveDown()
+{
+    mBrowserBox->moveSelectionDown();
+}
+
+void PopupMenu::select()
+{
+    mBrowserBox->selectSelection();
+}
diff --git a/src/gui/popups/popupmenu.h b/src/gui/popups/popupmenu.h
index c98e6a26e..da0f59847 100644
--- a/src/gui/popups/popupmenu.h
+++ b/src/gui/popups/popupmenu.h
@@ -148,6 +148,12 @@ class PopupMenu final : public Popup, public LinkHandler
 
         void clear();
 
+        void moveUp();
+
+        void moveDown();
+
+        void select();
+
     private:
         void setMousePos();
 
diff --git a/src/gui/widgets/browserbox.cpp b/src/gui/widgets/browserbox.cpp
index f6f86a42d..f87bc23e3 100644
--- a/src/gui/widgets/browserbox.cpp
+++ b/src/gui/widgets/browserbox.cpp
@@ -914,3 +914,31 @@ void BrowserBox::setForegroundColorAll(const Color &color1,
     mForegroundColor = color1;
     mForegroundColor2 = color2;
 }
+
+void BrowserBox::moveSelectionUp()
+{
+    if (mSelectedLink <= 0)
+        mSelectedLink = static_cast<signed>(mLinks.size()) - 1;
+    else
+        mSelectedLink --;
+}
+
+#include "logger.h"
+
+void BrowserBox::moveSelectionDown()
+{
+    mSelectedLink ++;
+    if (mSelectedLink >= static_cast<signed int>(mLinks.size()))
+        mSelectedLink = 0;
+}
+
+void BrowserBox::selectSelection()
+{
+    if (mSelectedLink < 0 || mSelectedLink >= static_cast<signed int>(
+        mLinks.size()))
+    {
+        return;
+    }
+
+    mLinkHandler->handleLink(mLinks[mSelectedLink].link, nullptr);
+}
diff --git a/src/gui/widgets/browserbox.h b/src/gui/widgets/browserbox.h
index 85bb758f9..4fdb45189 100644
--- a/src/gui/widgets/browserbox.h
+++ b/src/gui/widgets/browserbox.h
@@ -196,6 +196,12 @@ class BrowserBox final : public Widget,
         int getDataWidth() const
         { return mDataWidth; }
 
+        void moveSelectionUp();
+
+        void moveSelectionDown();
+
+        void selectSelection();
+
     private:
         int calcHeight() A_WARN_UNUSED;
 
-- 
cgit v1.2.3-70-g09d2