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