summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2013-12-30 13:17:52 +0300
committerAndrei Karas <akaras@inbox.ru>2013-12-30 13:17:52 +0300
commit74f89c500d278b6ac668c313b63d0f1e76f4acaf (patch)
treefe401dc562916edfaae0c060b661ccb383be9722
parentcf383ed98ff41b6086325b168e5f750b6f87d72e (diff)
downloadplus-74f89c500d278b6ac668c313b63d0f1e76f4acaf.tar.gz
plus-74f89c500d278b6ac668c313b63d0f1e76f4acaf.tar.bz2
plus-74f89c500d278b6ac668c313b63d0f1e76f4acaf.tar.xz
plus-74f89c500d278b6ac668c313b63d0f1e76f4acaf.zip
fix overhead text popups order. Now it drawed always below any windows.
-rw-r--r--src/being/being.cpp1
-rw-r--r--src/gui/popups/speechbubble.cpp7
-rw-r--r--src/gui/popups/speechbubble.h2
-rw-r--r--src/gui/widgets/windowcontainer.cpp20
-rw-r--r--src/gui/widgets/windowcontainer.h3
5 files changed, 33 insertions, 0 deletions
diff --git a/src/being/being.cpp b/src/being/being.cpp
index 2640379aa..439cbd2c9 100644
--- a/src/being/being.cpp
+++ b/src/being/being.cpp
@@ -1789,6 +1789,7 @@ void Being::drawSpeech(const int offsetX, const int offsetY)
mSpeechBubble->setPosition(px - (mSpeechBubble->getWidth() / 2),
py - getHeight() - (mSpeechBubble->getHeight()));
mSpeechBubble->setVisible(true);
+ mSpeechBubble->requestMoveToBackground();
}
else if (mSpeechTime > 0 && speech == TEXT_OVERHEAD)
{
diff --git a/src/gui/popups/speechbubble.cpp b/src/gui/popups/speechbubble.cpp
index 0c40676f6..f1c7c0b9c 100644
--- a/src/gui/popups/speechbubble.cpp
+++ b/src/gui/popups/speechbubble.cpp
@@ -24,10 +24,12 @@
#include "gui/popups/speechbubble.h"
#include "gui/sdlfont.h"
+#include "gui/viewport.h"
#include "gui/widgets/browserbox.h"
#include "gui/widgets/label.h"
#include "gui/widgets/textbox.h"
+#include "gui/widgets/windowcontainer.h"
#include <guichan/font.hpp>
@@ -89,3 +91,8 @@ void SpeechBubble::setText(const std::string &text, const bool showName)
mCaption->setPosition(0, 0);
mSpeechBox->setPosition(0, nameHeight);
}
+
+void SpeechBubble::requestMoveToBackground()
+{
+ windowContainer->moveWidgetAfter(viewport, this);
+}
diff --git a/src/gui/popups/speechbubble.h b/src/gui/popups/speechbubble.h
index 41c210eab..153c1e954 100644
--- a/src/gui/popups/speechbubble.h
+++ b/src/gui/popups/speechbubble.h
@@ -57,6 +57,8 @@ class SpeechBubble final : public Popup
*/
void setText(const std::string &text, const bool showName = true);
+ void requestMoveToBackground();
+
private:
std::string mText;
int mSpacing;
diff --git a/src/gui/widgets/windowcontainer.cpp b/src/gui/widgets/windowcontainer.cpp
index cba565cc4..d420e1183 100644
--- a/src/gui/widgets/windowcontainer.cpp
+++ b/src/gui/widgets/windowcontainer.cpp
@@ -58,6 +58,26 @@ void WindowContainer::adjustAfterResize(const int oldScreenWidth,
}
}
+void WindowContainer::moveWidgetAfter(gcn::Widget *const after,
+ gcn::Widget *const widget)
+{
+ WidgetListIterator widgetIter = std::find(
+ mWidgets.begin(), mWidgets.end(), widget);
+
+ if (widgetIter == mWidgets.end())
+ return;
+
+ WidgetListIterator afterIter = std::find(
+ mWidgets.begin(), mWidgets.end(), after);
+
+ if (afterIter == mWidgets.end())
+ return;
+
+ ++ afterIter;
+ mWidgets.erase(widgetIter);
+ mWidgets.insert(afterIter, widget);
+}
+
#ifdef USE_PROFILER
void WindowContainer::draw(gcn::Graphics* graphics)
{
diff --git a/src/gui/widgets/windowcontainer.h b/src/gui/widgets/windowcontainer.h
index 3645b94b6..c11d1b238 100644
--- a/src/gui/widgets/windowcontainer.h
+++ b/src/gui/widgets/windowcontainer.h
@@ -53,6 +53,9 @@ class WindowContainer : public Container
void adjustAfterResize(const int oldScreenWidth,
const int oldScreenHeight);
+ void moveWidgetAfter(gcn::Widget *const before,
+ gcn::Widget *const widget);
+
#ifdef USE_PROFILER
void draw(gcn::Graphics* graphics);
#endif