All pastes #1840388 Raw Edit

Mine

public diff v1 · immutable
#1840388 ·published 2010-03-14 22:32 UTC
rendered paste body
From 423067e40c98c117acac129d3a745a43cf243d2b Mon Sep 17 00:00:00 2001From: Andrei Karas <akaras@inbox.ru>Date: Mon, 15 Mar 2010 00:01:12 +0200Subject: [PATCH] Add tooltips to hp, xp, mp bars.--- mana.cbp               |    2 + src/CMakeLists.txt     |    2 + src/Makefile.am        |    2 + src/gui/ministatus.cpp |   56 +++++++++++++++++++++++++++ src/gui/ministatus.h   |    7 +++ src/gui/textpopup.cpp  |  100 ++++++++++++++++++++++++++++++++++++++++++++++++ src/gui/textpopup.h    |   67 ++++++++++++++++++++++++++++++++ 7 files changed, 236 insertions(+), 0 deletions(-) create mode 100644 src/gui/textpopup.cpp create mode 100644 src/gui/textpopup.hdiff --git a/mana.cbp b/mana.cbpindex cd2045c..8210f02 100644--- a/mana.cbp+++ b/mana.cbp@@ -227,6 +227,8 @@ 		<Unit filename="src\gui\storagewindow.h" /> 		<Unit filename="src\gui\textdialog.cpp" /> 		<Unit filename="src\gui\textdialog.h" />+		<Unit filename="src\gui\textpopup.cpp" />+		<Unit filename="src\gui\textpopup.h" /> 		<Unit filename="src\gui\theme.cpp" /> 		<Unit filename="src\gui\theme.h" /> 		<Unit filename="src\gui\trade.cpp" />diff --git a/src/CMakeLists.txt b/src/CMakeLists.txtindex 8490e88..de03942 100644--- a/src/CMakeLists.txt+++ b/src/CMakeLists.txt@@ -294,6 +294,8 @@ SET(SRCS     gui/storagewindow.h     gui/textdialog.cpp     gui/textdialog.h+    gui/textpopup.cpp+    gui/textpopup.h     gui/theme.cpp     gui/theme.h     gui/trade.cppdiff --git a/src/Makefile.am b/src/Makefile.amindex 7081828..156cba4 100644--- a/src/Makefile.am+++ b/src/Makefile.am@@ -193,6 +193,8 @@ mana_SOURCES = gui/widgets/avatarlistbox.cpp \ 	      gui/storagewindow.h \ 	      gui/textdialog.cpp \ 	      gui/textdialog.h \+	      gui/textpopup.cpp \+	      gui/textpopup.h \ 	      gui/theme.cpp \ 	      gui/theme.h \ 	      gui/trade.cpp \diff --git a/src/gui/ministatus.cpp b/src/gui/ministatus.cppindex cdefc39..553ac91 100644--- a/src/gui/ministatus.cpp+++ b/src/gui/ministatus.cpp@@ -28,6 +28,7 @@  #include "gui/gui.h" #include "gui/statuswindow.h"+#include "gui/textpopup.h" #include "gui/theme.h"  #include "gui/widgets/progressbar.h"@@ -35,6 +36,7 @@ #include "net/net.h" #include "net/playerhandler.h" +#include "utils/gettext.h" #include "utils/stringutils.h"  extern volatile int tick_time;@@ -64,6 +66,11 @@ MiniStatusWindow::MiniStatusWindow():                    mXpBar->getY() + mXpBar->getHeight());      setVisible((bool) config.getValue(getPopupName() + "Visible", true));++    mTextPopup = new TextPopup();++    addMouseListener(this);+     update(StatusWindow::HP); } @@ -134,3 +141,52 @@ void MiniStatusWindow::logic()         if (mIcons[i])             mIcons[i]->update(tick_time * 10); }++void MiniStatusWindow::mouseMoved(gcn::MouseEvent &event)+{+    Popup::mouseMoved(event);++    const int x = event.getX();+    const int y = event.getY();++    if (isInBar(mXpBar, x, y))+    {+        mTextPopup->show(x + getX(), y + getY(),+                         strprintf("%u/%u", player_node->getExp(),+                                   player_node->getExpNeeded()),+                         strprintf("%s: %u", _("Need"),+                                   player_node->getExpNeeded()+                                   - player_node->getExp()));+    }+    else if (isInBar(mHpBar, x, y))+    {+        mTextPopup->show(x + getX(), y + getY(),+                         strprintf("%u/%u", player_node->getHp(),+                                   player_node->getMaxHp()));+    }+    else if (isInBar(mMpBar, x, y))+    {+        mTextPopup->show(x + getX(), y + getY(),+                         strprintf("%u/%u", player_node->getMP(),+                                   player_node->getMaxMP()));+    }+    else+    {+        mTextPopup->setVisible(false);+    }+}++bool MiniStatusWindow::isInBar(ProgressBar *bar, int x, int y) const+{+    return (x > bar->getX() && x < bar->getX() + bar->getWidth()+        && y > bar->getY() && y < bar->getY() + bar->getHeight());+}++void MiniStatusWindow::mouseExited(gcn::MouseEvent &event)+{+    Popup::mouseExited(event);++    mTextPopup->setVisible(false);+}++diff --git a/src/gui/ministatus.h b/src/gui/ministatus.hindex 917e265..bb8d409 100644--- a/src/gui/ministatus.h+++ b/src/gui/ministatus.h@@ -29,6 +29,7 @@ class AnimatedSprite; class Graphics; class ProgressBar;+class TextPopup;  /**  * The player mini-status dialog.@@ -56,13 +57,19 @@ class MiniStatusWindow : public Popup         void draw(gcn::Graphics *graphics)         { drawChildren(graphics); } +        void mouseMoved(gcn::MouseEvent &mouseEvent);+        void mouseExited(gcn::MouseEvent &event);+     private:+        bool isInBar(ProgressBar *bar, int x, int y) const;+         /*          * Mini Status Bars          */         ProgressBar *mHpBar;         ProgressBar *mMpBar;         ProgressBar *mXpBar;+        TextPopup *mTextPopup;          std::vector<AnimatedSprite *> mIcons; };diff --git a/src/gui/textpopup.cpp b/src/gui/textpopup.cppnew file mode 100644index 0000000..aa68898--- /dev/null+++ b/src/gui/textpopup.cpp@@ -0,0 +1,100 @@+/*+ *  The Mana World+ *  Copyright (C) 2008  The Legend of Mazzeroth Development Team+ *  Copyright (C) 2008-2009  The Mana World Development Team+ *  Copyright (C) 2009-2010  The Mana Developers+ *+ *  This file is part of The Mana World.+ *+ *  This program is free software; you can redistribute it and/or modify+ *  it under the terms of the GNU General Public License as published by+ *  the Free Software Foundation; either version 2 of the License, or+ *  any later version.+ *+ *  This program is distributed in the hope that it will be useful,+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+ *  GNU General Public License for more details.+ *+ *  You should have received a copy of the GNU General Public License+ *  along with this program; if not, write to the Free Software+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA+ */++#include "gui/textpopup.h"++#include "gui/gui.h"+#include "gui/palette.h"++#include "graphics.h"+#include "units.h"++#include "utils/gettext.h"+#include "utils/stringutils.h"++#include <guichan/font.hpp>+#include <guichan/widgets/label.hpp>++TextPopup::TextPopup():+    Popup("TextPopup")+{+    const int fontHeight = getFont()->getHeight();++    mText1 = new gcn::Label;+    mText1->setPosition(getPadding(), getPadding());++    mText2 = new gcn::Label;+    mText2->setPosition(getPadding(), fontHeight + getPadding());++    add(mText1);+    add(mText2);+    addMouseListener(this);++    loadPopupConfiguration();+}++TextPopup::~TextPopup()+{+}++void TextPopup::show(int x, int y, const std::string &str1, const std::string &str2)+{+    mText1->setCaption(str1);+    mText1->adjustSize();+    mText2->setCaption(str2);+    mText2->adjustSize();++    int minWidth = mText1->getWidth();+    if (mText2->getWidth() > minWidth)+        minWidth = mText2->getWidth();++    minWidth += 4 * getPadding();+    setWidth(minWidth);++    if (!str2.empty())+        setHeight((getPadding() + mText1->getFont()->getHeight()) * 2);+    else+        setHeight(2 * getPadding() + mText1->getFont()->getHeight());++    const int distance = 20;++    int posX = std::max(0, x - getWidth() / 2);+    int posY = y + distance;++    if (posX + getWidth() > graphics->getWidth())+        posX = graphics->getWidth() - getWidth();+    if (posY + getHeight() > graphics->getHeight())+        posY = y - getHeight() - distance;++    setPosition(posX, posY);+    setVisible(true);+    requestMoveToTop();+}++void TextPopup::mouseMoved(gcn::MouseEvent &event)+{+    Popup::mouseMoved(event);++    // When the mouse moved on top of the popup, hide it+    setVisible(false);+}diff --git a/src/gui/textpopup.h b/src/gui/textpopup.hnew file mode 100644index 0000000..5164659--- /dev/null+++ b/src/gui/textpopup.h@@ -0,0 +1,67 @@+/*+ *  The Mana World+ *  Copyright (C) 2008  The Legend of Mazzeroth Development Team+ *  Copyright (C) 2008-2009  The Mana World Development Team+ *  Copyright (C) 2009-2010  The Mana Developers+ *+ *  This file is part of The Mana World.+ *+ *  This program is free software; you can redistribute it and/or modify+ *  it under the terms of the GNU General Public License as published by+ *  the Free Software Foundation; either version 2 of the License, or+ *  any later version.+ *+ *  This program is distributed in the hope that it will be useful,+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+ *  GNU General Public License for more details.+ *+ *  You should have received a copy of the GNU General Public License+ *  along with this program; if not, write to the Free Software+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA+ */++#ifndef TEXTPOPUP_H+#define TEXTPOPUP_H++#include "gui/widgets/popup.h"++#include <guichan/mouselistener.hpp>++class TextBox;++/**+ * A popup that displays information about an item.+ */+class TextPopup : public Popup+{+    public:+        /**+         * Constructor. Initializes the item popup.+         */+        TextPopup();++        /**+         * Destructor. Cleans up the item popup on deletion.+         */+        ~TextPopup();++        /**+         * Sets the text to be displayed.+         */+        void show(int x, int y, const std::string &str1)+        { show(x, y, str1, (const char*)""); };++        /**+         * Sets the text to be displayed.+         */+        void show(int x, int y, const std::string &str1, const std::string &str2);++        void mouseMoved(gcn::MouseEvent &mouseEvent);++    private:+        gcn::Label *mText1;+        gcn::Label *mText2;+};++#endif // TEXTPOPUP_H-- 1.7.0