summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--src/game.cpp14
-rw-r--r--src/gui/inventorywindow.cpp7
-rw-r--r--src/gui/popupmenu.cpp119
-rw-r--r--src/gui/popupmenu.h22
5 files changed, 90 insertions, 76 deletions
diff --git a/ChangeLog b/ChangeLog
index a3b80e3d..b38b5a46 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,10 @@
src/resources/resourcemanager.h: Added support for files downloaded
through the update manager to the resource manager. Changed directory name
for updates from "data" to "updates".
+ * src/game.cpp, src/gui/inventorywindow.cpp, src/gui/popupmenu.cpp,
+ src/gui/popupmenu.h: Cleaned up the showPopup() code, moved "map"-related
+ code into game.cpp, made the popup show up at mouse coordinates instead of
+ being aligned to tiles.
2005-07-27 Bjørn Lindeijer <bjorn@lindeijer.nl>
diff --git a/src/game.cpp b/src/game.cpp
index 98be0bc6..f5bd366c 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -632,7 +632,19 @@ void do_input()
// Mouse button right
else if (event.button.button == SDL_BUTTON_RIGHT)
{
- popupMenu->showPopup(mx, my);
+ Being *being;
+ FloorItem *floorItem;
+
+ if ((being = findNode(mx, my))) {
+ popupMenu->showPopup(event.button.x, event.button.y,
+ being);
+ } else if ((floorItem = find_floor_item_by_id(
+ find_floor_item_by_cor(mx, my)))) {
+ popupMenu->showPopup(event.button.x, event.button.y,
+ floorItem);
+ } else {
+ popupMenu->setVisible(false);
+ }
}
}
diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp
index 377acc1f..28dbd35e 100644
--- a/src/gui/inventorywindow.cpp
+++ b/src/gui/inventorywindow.cpp
@@ -25,7 +25,6 @@
#include "popupmenu.h"
#include "../playerinfo.h"
#include "../inventory.h"
-#include "../engine.h"
#include "button.h"
#include "scrollarea.h"
#include "item_amount.h"
@@ -148,10 +147,10 @@ void InventoryWindow::mouseClick(int x, int y, int button, int count)
{
/*
* convert relative to the window coordinates to
- * absolute tile coordinates
+ * absolute screen coordinates
*/
- int mx = (x + getX()) / 32 + camera_x;
- int my = (y + getY()) / 32 + camera_y;
+ int mx = x + getX();
+ int my = y + getY();
popupMenu->showPopup(mx, my, item);
}
}
diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp
index 32690bdb..e852e9aa 100644
--- a/src/gui/popupmenu.cpp
+++ b/src/gui/popupmenu.cpp
@@ -29,7 +29,6 @@
#include "item_amount.h"
#include "../graphics.h"
#include "../game.h"
-#include "../engine.h"
#include "../net/network.h"
#include "../resources/itemmanager.h"
#include "../item.h"
@@ -52,8 +51,6 @@ PopupMenu::PopupMenu():
being = NULL;
floorItem = NULL;
- mX = -1;
- mY = -1;
}
PopupMenu::~PopupMenu()
@@ -62,68 +59,58 @@ PopupMenu::~PopupMenu()
delete floorItem;
}
-void PopupMenu::showPopup(int mx, int my)
+void PopupMenu::showPopup(int x, int y, Being *being)
{
- being = findNode(mx, my);
- floorItem = find_floor_item_by_id(find_floor_item_by_cor(mx, my));
- mX = mx;
- mY = my;
+ std::string name;
+
+ this->being = being;
browserBox->clearRows();
- if (being) {
- std::string name;
- switch (being->getType())
- {
- case Being::PLAYER:
- // Players can be traded with. Later also attack, follow and
- // add as buddy will be options in this menu.
-
- name = being->name;
- //browserBox->addRow("@@attack|Attack " + name + "@@");
- browserBox->addRow("@@trade|Trade With " + name + "@@");
- //browserBox->addRow("@@follow|Follow " + name + "@@");
- //browserBox->addRow("@@buddy|Add " + name + " to Buddy List@@");
- break;
-
- case Being::NPC:
- // NPCs can be talked to (single option, candidate for removal
- // unless more options would be added)
- browserBox->addRow("@@talk|Talk To NPC@@");
- break;
-
- default:
- /* Other beings aren't interesting... */
- break;
- }
- }
- else if (floorItem)
- {
- // Floor item can be picked up (single option, candidate for removal)
- std::string name = itemDb->getItemInfo(floorItem->id)->getName();
- browserBox->addRow("@@pickup|Pick Up " + name + "@@");
- }
- else
+ switch (being->getType())
{
- // If there is nothing of interest, don't display menu.
- // Hide it, because it may have been visible.
- setVisible(false);
- return;
+ case Being::PLAYER:
+ // Players can be traded with. Later also attack, follow and
+ // add as buddy will be options in this menu.
+
+ name = being->name;
+ //browserBox->addRow("@@attack|Attack " + name + "@@");
+ browserBox->addRow("@@trade|Trade With " + name + "@@");
+ //browserBox->addRow("@@follow|Follow " + name + "@@");
+ //browserBox->addRow("@@buddy|Add " + name + " to Buddy List@@");
+ break;
+
+ case Being::NPC:
+ // NPCs can be talked to (single option, candidate for removal
+ // unless more options would be added)
+ browserBox->addRow("@@talk|Talk To NPC@@");
+ break;
+
+ default:
+ /* Other beings aren't interesting... */
+ break;
}
//browserBox->addRow("@@look|Look To@@");
browserBox->addRow("##3---");
browserBox->addRow("@@cancel|Cancel@@");
- setContentSize(browserBox->getWidth() + 8, browserBox->getHeight() + 8);
- mx = (mx - camera_x) * 32 + 25;
- my = (my - camera_y) * 32 + 25;
- if (guiGraphics->getWidth() < (mx + getWidth() + 5))
- mx -= (getWidth() + 50);
- if (guiGraphics->getHeight() < (my + getHeight() + 5))
- my -= (getHeight() + 50);
- setPosition(mx, my);
- setVisible(true);
- requestMoveToTop();
+ showPopup(x, y);
+}
+
+void PopupMenu::showPopup(int x, int y, FloorItem *floorItem)
+{
+ this->floorItem = floorItem;
+ browserBox->clearRows();
+
+ // Floor item can be picked up (single option, candidate for removal)
+ std::string name = itemDb->getItemInfo(floorItem->id)->getName();
+ browserBox->addRow("@@pickup|Pick Up " + name + "@@");
+
+ //browserBox->addRow("@@look|Look To@@");
+ browserBox->addRow("##3---");
+ browserBox->addRow("@@cancel|Cancel@@");
+
+ showPopup(x, y);
}
void PopupMenu::handleLink(const std::string& link)
@@ -224,11 +211,9 @@ void PopupMenu::handleLink(const std::string& link)
being = NULL;
floorItem = NULL;
m_item = NULL;
- mX = -1;
- mY = -1;
}
-void PopupMenu::showPopup(int mx, int my, Item *item)
+void PopupMenu::showPopup(int x, int y, Item *item)
{
assert(item);
m_item = item;
@@ -249,15 +234,17 @@ void PopupMenu::showPopup(int mx, int my, Item *item)
browserBox->addRow("##3---");
browserBox->addRow("@@cancel|Cancel@@");
+ showPopup(x, y);
+}
+
+void PopupMenu::showPopup(int x, int y)
+{
setContentSize(browserBox->getWidth() + 8, browserBox->getHeight() + 8);
- mx = (mx - camera_x) * 32 + 25;
- my = (my - camera_y) * 32 + 25;
- if (guiGraphics->getWidth() < (mx + getWidth() + 5))
- mx -= (getWidth() + 50);
- if (guiGraphics->getHeight() < (my + getHeight() + 5))
- my -= (getHeight() + 50);
- setPosition(mx, my);
+ if (guiGraphics->getWidth() < (x + getWidth() + 5))
+ x -= (getWidth() + 50);
+ if (guiGraphics->getHeight() < (y + getHeight() + 5))
+ y -= (getHeight() + 50);
+ setPosition(x, y);
setVisible(true);
requestMoveToTop();
}
-
diff --git a/src/gui/popupmenu.h b/src/gui/popupmenu.h
index 45c5c446..f1bebabc 100644
--- a/src/gui/popupmenu.h
+++ b/src/gui/popupmenu.h
@@ -29,6 +29,7 @@
#include "linkhandler.h"
#include "browserbox.h"
#include "../being.h"
+#include "../item.h"
#include "../floor_item.h"
/**
@@ -48,14 +49,21 @@ class PopupMenu : public Window, public LinkHandler
~PopupMenu();
/**
- * Shows the related popup menu specifies by the mouse click coords.
+ * Shows the being related popup menu at the specified mouse coords.
*/
- void showPopup(int mx, int my);
+ void showPopup(int x, int y, Being *being);
+
+ /**
+ * Shows the floor item related popup menu at the specified
+ * mouse coords.
+ */
+ void showPopup(int x, int y, FloorItem *floorItem);
/**
* Shows the related popup menu when right click on the inventory
+ * at the specified mouse coordinates.
*/
- void showPopup(int mx, int my, class Item *item);
+ void showPopup(int x, int y, Item *item);
/**
* Handles link action.
@@ -64,12 +72,16 @@ class PopupMenu : public Window, public LinkHandler
private:
BrowserBox* browserBox;
- int mX, mY;
Being* being;
FloorItem* floorItem;
- class Item *m_item;
+ Item *m_item;
+
+ /**
+ * Shared code for the various showPopup functions.
+ */
+ void showPopup(int x, int y);
};
extern PopupMenu *popupMenu;