summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2012-12-30 16:16:09 +0300
committerAndrei Karas <akaras@inbox.ru>2012-12-30 16:16:09 +0300
commit6e6fd65992343ca37e92d24efc760666b4485160 (patch)
treecfefd917c2b33694e93902c4b96030c300ae16a0
parent6e5d8181b830694a90bba7ad5651fa0b726e4a75 (diff)
downloadmv-6e6fd65992343ca37e92d24efc760666b4485160.tar.gz
mv-6e6fd65992343ca37e92d24efc760666b4485160.tar.bz2
mv-6e6fd65992343ca37e92d24efc760666b4485160.tar.xz
mv-6e6fd65992343ca37e92d24efc760666b4485160.zip
Allow open context menu in textfields before connecting to server.
-rw-r--r--src/gui/popupmenu.cpp18
-rw-r--r--src/gui/widgets/textfield.cpp23
-rw-r--r--src/gui/widgets/textfield.h2
3 files changed, 34 insertions, 9 deletions
diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp
index 544bc028c..844fc4e3f 100644
--- a/src/gui/popupmenu.cpp
+++ b/src/gui/popupmenu.cpp
@@ -675,10 +675,9 @@ void PopupMenu::showChangePos(const int x, const int y)
void PopupMenu::handleLink(const std::string &link,
gcn::MouseEvent *event A_UNUSED)
{
- if (!actorSpriteManager)
- return;
-
- Being *being = actorSpriteManager->findBeing(mBeingId);
+ Being *being = nullptr;
+ if (actorSpriteManager)
+ being = actorSpriteManager->findBeing(mBeingId);
// Talk To action
if (link == "talk" && being && being->canTalk())
@@ -724,7 +723,8 @@ void PopupMenu::handleLink(const std::string &link,
}
else if (link == "heal" && being && being->getType() != Being::MONSTER)
{
- actorSpriteManager->heal(being);
+ if (actorSpriteManager)
+ actorSpriteManager->heal(being);
}
else if (link == "unignore" && being &&
being->getType() == ActorSprite::PLAYER)
@@ -813,8 +813,12 @@ void PopupMenu::handleLink(const std::string &link,
}
else if (link == "nuke" && being)
{
- actorSpriteManager->addBlock(static_cast<uint32_t>(being->getId()));
- actorSpriteManager->destroy(being);
+ if (actorSpriteManager)
+ {
+ actorSpriteManager->addBlock(static_cast<uint32_t>(
+ being->getId()));
+ actorSpriteManager->destroy(being);
+ }
}
// Follow Player action
else if (link == "follow" && !mNick.empty())
diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp
index 3a6212b79..950bba025 100644
--- a/src/gui/widgets/textfield.cpp
+++ b/src/gui/widgets/textfield.cpp
@@ -26,6 +26,7 @@
#include "configuration.h"
#include "keyevent.h"
+#include "gui/popupmenu.h"
#include "gui/sdlinput.h"
#include "gui/viewport.h"
@@ -58,7 +59,8 @@ TextField::TextField(const Widget2 *const widget,
mLoseFocusOnTab(loseFocusOnTab),
mLastEventPaste(false),
mPadding(1),
- mCaretColor(&getThemeColor(Theme::CARET))
+ mCaretColor(&getThemeColor(Theme::CARET)),
+ mPopupMenu(nullptr)
{
setFrameSize(2);
mForegroundColor = getThemeColor(Theme::TEXTFIELD);
@@ -90,6 +92,9 @@ TextField::TextField(const Widget2 *const widget,
TextField::~TextField()
{
+ delete mPopupMenu;
+ mPopupMenu = nullptr;
+
instances--;
if (instances == 0)
{
@@ -522,7 +527,21 @@ void TextField::mousePressed(gcn::MouseEvent &mouseEvent)
if (mouseEvent.getButton() == gcn::MouseEvent::RIGHT)
{
if (viewport)
+ {
viewport->showTextFieldPopup(this);
+ }
+ else
+ {
+ if (!mPopupMenu)
+ mPopupMenu = new PopupMenu();
+ int x = 0;
+ int y = 0;
+ SDL_GetMouseState(&x, &y);
+ mPopupMenu->showTextFieldPopup(x, y, this);
+ }
+ }
+ else
+ {
+ gcn::TextField::mousePressed(mouseEvent);
}
- else gcn::TextField::mousePressed(mouseEvent);
}
diff --git a/src/gui/widgets/textfield.h b/src/gui/widgets/textfield.h
index 9220f3dd7..6ac24066f 100644
--- a/src/gui/widgets/textfield.h
+++ b/src/gui/widgets/textfield.h
@@ -30,6 +30,7 @@
#include "localconsts.h"
class ImageRect;
+class PopupMenu;
class TextField;
/**
@@ -143,6 +144,7 @@ class TextField : public gcn::TextField,
int mLastEventPaste;
int mPadding;
const gcn::Color *mCaretColor;
+ PopupMenu *mPopupMenu;
};
#endif