From 6e6fd65992343ca37e92d24efc760666b4485160 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 30 Dec 2012 16:16:09 +0300 Subject: Allow open context menu in textfields before connecting to server. --- src/gui/popupmenu.cpp | 18 +++++++++++------- src/gui/widgets/textfield.cpp | 23 +++++++++++++++++++++-- src/gui/widgets/textfield.h | 2 ++ 3 files changed, 34 insertions(+), 9 deletions(-) (limited to 'src/gui') 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(being->getId())); - actorSpriteManager->destroy(being); + if (actorSpriteManager) + { + actorSpriteManager->addBlock(static_cast( + 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 -- cgit v1.2.3-70-g09d2