summaryrefslogtreecommitdiff
path: root/src/gui/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets')
-rw-r--r--src/gui/widgets/button.cpp74
-rw-r--r--src/gui/widgets/button.h18
-rw-r--r--src/gui/widgets/tabbedarea.cpp8
-rw-r--r--src/gui/widgets/tabbedarea.h2
4 files changed, 90 insertions, 12 deletions
diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp
index f072ef61..61ec28a2 100644
--- a/src/gui/widgets/button.cpp
+++ b/src/gui/widgets/button.cpp
@@ -25,6 +25,7 @@
#include "graphics.h"
#include "gui/palette.h"
+#include "gui/textpopup.h"
#include "resources/image.h"
#include "resources/theme.h"
@@ -36,7 +37,8 @@
int Button::mInstances = 0;
float Button::mAlpha = 1.0;
-ImageRect *Button::mButton;
+ImageRect* Button::mButton;
+TextPopup* Button::mTextPopup = 0;
enum{
BUTTON_STANDARD, // 0
@@ -81,23 +83,26 @@ Button::Button(const std::string &caption, const std::string &actionEventId,
adjustSize();
}
-void Button::setButtonIcon(const std::string& iconFile, int frameHeight,
- int frameWidth)
+bool Button::setButtonIcon(const std::string& iconFile)
{
// We clean up possible older references.
if (mButtonIcon)
removeButtonIcon();
// If nothing relevant was set, we can quit now.
- if (iconFile.empty() || !frameWidth || !frameHeight)
- return;
+ if (iconFile.empty())
+ return false;
// Load the icon frames.
Image *btnIcons = Theme::getImageFromTheme(iconFile);
if (!btnIcons)
- return;
+ return false;
- if (btnIcons->getWidth() > 0 && btnIcons->getHeight() > 0)
+ // Compute the sub images size.
+ const int frameWidth = btnIcons->getWidth() / 4;
+ const int frameHeight = btnIcons->getHeight();
+
+ if (frameWidth > 0 && frameHeight > 0)
{
mButtonIcon = new Image*[BUTTON_COUNT];
for (int mode = 0; mode < BUTTON_COUNT; ++mode)
@@ -110,6 +115,7 @@ void Button::setButtonIcon(const std::string& iconFile, int frameHeight,
}
btnIcons->decRef();
+ return (mButtonIcon);
}
void Button::removeButtonIcon()
@@ -159,6 +165,10 @@ void Button::init()
btn[mode]->decRef();
}
updateAlpha();
+
+ // Load the popup
+ if (!mTextPopup)
+ mTextPopup = new TextPopup();
}
mInstances++;
}
@@ -175,6 +185,9 @@ Button::~Button()
dtor<Image*>());
}
delete[] mButton;
+
+ // Remove the popup
+ delete mTextPopup;
}
removeButtonIcon();
}
@@ -301,3 +314,50 @@ void Button::setCaption(const std::string& caption)
mCaption = caption;
adjustSize();
}
+
+void Button::logic()
+{
+ gcn::Button::logic();
+ mTextPopup->logic();
+}
+
+void Button::mouseMoved(gcn::MouseEvent &event)
+{
+ gcn::Button::mouseMoved(event);
+ mTextPopup->mouseMoved(event);
+
+ int x = event.getX();
+ int y = event.getY();
+
+ if (event.getSource() == this && !mPopupText.empty())
+ {
+ if (mParent)
+ {
+ x += mParent->getX();
+ y += mParent->getY();
+ }
+
+ mTextPopup->show(x + getX(), y + getY(), mPopupText);
+ }
+ else
+ {
+ mTextPopup->setVisible(false);
+ }
+}
+
+void Button::mouseExited(gcn::MouseEvent &event)
+{
+ gcn::Button::mouseExited(event);
+ mTextPopup->mouseExited(event);
+
+ mTextPopup->setVisible(false);
+}
+
+void Button::setButtonPopupText(const std::string& text)
+{
+ mPopupText = text;
+ if (!mPopupText.empty())
+ mTextPopup->show(getX(), getY(), mPopupText);
+ else
+ mTextPopup->setVisible(false);
+}
diff --git a/src/gui/widgets/button.h b/src/gui/widgets/button.h
index 6d8f773c..7463d2ad 100644
--- a/src/gui/widgets/button.h
+++ b/src/gui/widgets/button.h
@@ -26,6 +26,7 @@
class ImageRect;
class Image;
+class TextPopup;
/**
* Button widget. Same as the Guichan button but with custom look.
@@ -71,8 +72,18 @@ class Button : public gcn::Button
* Standard, Highlighted, Pressed, and Disabled.
* If the image is too short, the missing states won't be loaded.
*/
- void setButtonIcon(const std::string& iconFile = std::string(),
- int frameHeight = 0, int frameWidth = 0);
+ bool setButtonIcon(const std::string& iconFile = std::string());
+
+ /**
+ * Set the button popup text when hovering it for a few seconds.
+ *
+ * @note: An empty text will disable the popup.
+ */
+ void setButtonPopupText(const std::string& text = std::string());
+
+ void logic();
+ void mouseMoved(gcn::MouseEvent &event);
+ void mouseExited(gcn::MouseEvent &event);
private:
void init();
@@ -84,6 +95,9 @@ class Button : public gcn::Button
static float mAlpha;
Image** mButtonIcon; /**< Button Icons graphics */
+
+ static TextPopup* mTextPopup; /**< The buttons popup */
+ std::string mPopupText; /**< the current button text */
};
#endif
diff --git a/src/gui/widgets/tabbedarea.cpp b/src/gui/widgets/tabbedarea.cpp
index 412d3ddc..9b51b311 100644
--- a/src/gui/widgets/tabbedarea.cpp
+++ b/src/gui/widgets/tabbedarea.cpp
@@ -33,8 +33,12 @@ TabbedArea::TabbedArea() : gcn::TabbedArea(),
mWidgetContainer->setOpaque(false);
addWidgetListener(this);
- mArrowButton[0] = new Button("<", "shift_left", this);
- mArrowButton[1] = new Button(">", "shift_right", this);
+ mArrowButton[0] = new Button("", "shift_left", this);
+ mArrowButton[1] = new Button("", "shift_right", this);
+ if (!mArrowButton[0]->setButtonIcon("tab_arrows_left.png"))
+ mArrowButton[0]->setCaption("<");
+ if (!mArrowButton[1]->setButtonIcon("tab_arrows_right.png"))
+ mArrowButton[1]->setCaption(">");
add(mArrowButton[0]);
add(mArrowButton[1]);
diff --git a/src/gui/widgets/tabbedarea.h b/src/gui/widgets/tabbedarea.h
index d364eac5..cb29a756 100644
--- a/src/gui/widgets/tabbedarea.h
+++ b/src/gui/widgets/tabbedarea.h
@@ -117,7 +117,7 @@ class TabbedArea : public gcn::TabbedArea, public gcn::WidgetListener
typedef std::vector< std::pair<gcn::Tab*, gcn::Widget*> > TabContainer;
/** The tab arrows */
- gcn::Button *mArrowButton[2];
+ Button *mArrowButton[2];
/** Check whether the arrow should be clickable */
void updateArrowEnableState();