summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gui/ministatus.cpp50
-rw-r--r--src/gui/ministatus.h7
-rw-r--r--src/gui/textpopup.cpp100
-rw-r--r--src/gui/textpopup.h67
6 files changed, 228 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8490e887..de03942d 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.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 7081828f..156cba44 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.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