summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/popups/popupmenu.cpp63
-rw-r--r--src/gui/popups/popupmenu.h2
-rw-r--r--src/gui/viewport.cpp5
-rw-r--r--src/gui/viewport.h2
-rw-r--r--src/gui/widgets/window.cpp16
-rw-r--r--src/gui/widgets/window.h3
6 files changed, 87 insertions, 4 deletions
diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp
index 3905d91e6..330df1a6c 100644
--- a/src/gui/popups/popupmenu.cpp
+++ b/src/gui/popups/popupmenu.cpp
@@ -840,6 +840,47 @@ void PopupMenu::showChangePos(const int x, const int y)
}
}
+void PopupMenu::showWindowPopup(Window *const window,
+ const int x, const int y)
+{
+ if (!window)
+ return;
+
+ mWindow = window;
+ mBrowserBox->clearRows();
+ // TRANSLATORS: popup menu header
+ mBrowserBox->addRow(_("window"));
+
+ if (window->getCloseButton())
+ {
+ // TRANSLATORS: popup menu item
+ // TRANSLATORS: close window
+ mBrowserBox->addRow("window close", _("Close"));
+ }
+
+ if (window->isStickyButtonLock())
+ {
+ if (window->isSticky())
+ {
+ // TRANSLATORS: popup menu item
+ // TRANSLATORS: unlock window
+ mBrowserBox->addRow("window unlock", _("Unlock"));
+ }
+ else
+ {
+ // TRANSLATORS: popup menu item
+ // TRANSLATORS: lock window
+ mBrowserBox->addRow("window lock", _("Lock"));
+ }
+ }
+
+ // TRANSLATORS: popup menu item
+ // TRANSLATORS: close menu
+ mBrowserBox->addRow("cancel", _("Cancel"));
+
+ showPopup(x, y);
+}
+
void PopupMenu::handleLink(const std::string &link,
MouseEvent *event A_UNUSED)
{
@@ -1196,8 +1237,11 @@ void PopupMenu::handleLink(const std::string &link,
}
else if (link == "retrieve" && mItem)
{
- ItemAmountWindow::showWindow(ItemAmountWindow::StoreRemove,
- mWindow, mItem);
+ if (Widget::widgetExists(mWindow))
+ {
+ ItemAmountWindow::showWindow(ItemAmountWindow::StoreRemove,
+ mWindow, mItem);
+ }
}
else if (link == "retrieve 10" && mItem)
{
@@ -1748,6 +1792,21 @@ void PopupMenu::handleLink(const std::string &link,
showGMPopup();
return;
}
+ else if (link == "window close" && mWindow)
+ {
+ if (Widget::widgetExists(mWindow))
+ mWindow->close();
+ }
+ else if (link == "window unlock" && mWindow)
+ {
+ if (Widget::widgetExists(mWindow))
+ mWindow->setSticky(false);
+ }
+ else if (link == "window lock" && mWindow)
+ {
+ if (Widget::widgetExists(mWindow))
+ mWindow->setSticky(true);
+ }
else if (!link.compare(0, 10, "guild-pos-"))
{
if (player_node)
diff --git a/src/gui/popups/popupmenu.h b/src/gui/popups/popupmenu.h
index 7eb38dc15..8bdbd3b1b 100644
--- a/src/gui/popups/popupmenu.h
+++ b/src/gui/popups/popupmenu.h
@@ -182,6 +182,8 @@ class PopupMenu final : public Popup, public LinkHandler
void showNpcDialogPopup(const int npcId, const int x, const int y);
+ void showWindowPopup(Window *const window, const int x, const int y);
+
/**
* Handles link action.
*/
diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp
index 16112fef6..ba11bdf95 100644
--- a/src/gui/viewport.cpp
+++ b/src/gui/viewport.cpp
@@ -846,6 +846,11 @@ void Viewport::showNpcDialogPopup(const int npcId)
mPopupMenu->showNpcDialogPopup(npcId, mMouseX, mMouseY);
}
+void Viewport::showWindowPopup(Window *const window)
+{
+ mPopupMenu->showWindowPopup(window, mMouseX, mMouseY);
+}
+
void Viewport::closePopupMenu()
{
if (mPopupMenu)
diff --git a/src/gui/viewport.h b/src/gui/viewport.h
index a627702d8..d401a3af4 100644
--- a/src/gui/viewport.h
+++ b/src/gui/viewport.h
@@ -199,6 +199,8 @@ class Viewport final : public WindowContainer,
void showNpcDialogPopup(const int npcId);
+ void showWindowPopup(Window *const window);
+
/**
* Closes the popup menu. Needed for when the player dies or switching
* maps.
diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp
index 8d457e599..4f8bc88b3 100644
--- a/src/gui/widgets/window.cpp
+++ b/src/gui/widgets/window.cpp
@@ -641,6 +641,7 @@ void Window::setStickyButton(const bool flag)
void Window::setSticky(const bool sticky)
{
mSticky = sticky;
+ mRedraw = true;
}
void Window::setStickyButtonLock(const bool lock)
@@ -704,6 +705,9 @@ void Window::scheduleDelete()
void Window::mousePressed(MouseEvent &event)
{
+ if (event.isConsumed())
+ return;
+
if (event.getSource() == this)
{
if (getParent())
@@ -714,7 +718,8 @@ void Window::mousePressed(MouseEvent &event)
mMoved = event.getY() <= static_cast<int>(mTitleBarHeight);
}
- if (event.getButton() == MouseEvent::LEFT)
+ const unsigned int button = event.getButton();
+ if (button == MouseEvent::LEFT)
{
const int x = event.getX();
const int y = event.getY();
@@ -735,7 +740,6 @@ void Window::mousePressed(MouseEvent &event)
setSticky(!isSticky());
mouseResize = 0;
mMoved = 0;
- mRedraw = true;
event.consume();
return;
}
@@ -749,6 +753,14 @@ void Window::mousePressed(MouseEvent &event)
else
mMoved = false;
}
+ else if (button == MouseEvent::RIGHT)
+ {
+ if (viewport)
+ {
+ event.consume();
+ viewport->showWindowPopup(this);
+ }
+ }
}
void Window::close()
diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h
index 2c4ee5e5f..dfd1f63b7 100644
--- a/src/gui/widgets/window.h
+++ b/src/gui/widgets/window.h
@@ -170,6 +170,9 @@ class Window : public BasicContainer2,
*/
void setCloseButton(const bool flag);
+ bool getCloseButton() const A_WARN_UNUSED
+ { return mCloseWindowButton; }
+
/**
* Returns whether the window can be resized.
*/