diff options
author | Andrei Karas <akaras@inbox.ru> | 2010-03-15 00:01:12 +0200 |
---|---|---|
committer | Jared Adams <jaxad0127@gmail.com> | 2010-03-14 17:32:26 -0600 |
commit | e4f97df13f36c003a0e839e367e84d0d59ccb25f (patch) | |
tree | 29fe4cb6f40a990ed1629e9344e873eca4c76642 /src/gui | |
parent | 0c6be6e5e9acd6f0597a2fcfaf5af9d93975435b (diff) | |
download | mana-client-e4f97df13f36c003a0e839e367e84d0d59ccb25f.tar.gz mana-client-e4f97df13f36c003a0e839e367e84d0d59ccb25f.tar.bz2 mana-client-e4f97df13f36c003a0e839e367e84d0d59ccb25f.tar.xz mana-client-e4f97df13f36c003a0e839e367e84d0d59ccb25f.zip |
Add tooltips to hp, xp, mp bars.
Signed-off-by: Jared Adams <jaxad0127@gmail.com>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/ministatus.cpp | 50 | ||||
-rw-r--r-- | src/gui/ministatus.h | 7 | ||||
-rw-r--r-- | src/gui/textpopup.cpp | 100 | ||||
-rw-r--r-- | src/gui/textpopup.h | 67 |
4 files changed, 224 insertions, 0 deletions
diff --git a/src/gui/ministatus.cpp b/src/gui/ministatus.cpp index cdefc391..90581f61 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,46 @@ 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 (event.getSource() == mXpBar) + { + 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 (event.getSource() == mHpBar) + { + mTextPopup->show(x + getX(), y + getY(), + strprintf("%u/%u", player_node->getHp(), + player_node->getMaxHp())); + } + else if (event.getSource() == mMpBar) + { + mTextPopup->show(x + getX(), y + getY(), + strprintf("%u/%u", player_node->getMP(), + player_node->getMaxMP())); + } + else + { + mTextPopup->setVisible(false); + } +} + +void MiniStatusWindow::mouseExited(gcn::MouseEvent &event) +{ + Popup::mouseExited(event); + + mTextPopup->setVisible(false); +} + + diff --git a/src/gui/ministatus.h b/src/gui/ministatus.h index 917e2658..bb8d4094 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.cpp new file mode 100644 index 00000000..aa688987 --- /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.h new file mode 100644 index 00000000..51646590 --- /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 |