summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gui/gui.cpp47
-rw-r--r--src/gui/gui.h11
2 files changed, 46 insertions, 12 deletions
diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp
index 930d4939..dc6306b4 100644
--- a/src/gui/gui.cpp
+++ b/src/gui/gui.cpp
@@ -37,6 +37,7 @@
#include "../graphics.h"
#include "../log.h"
+#include "../resources/image.h"
#include "../resources/imageset.h"
#include "../resources/resourcemanager.h"
#include "../resources/imageloader.h"
@@ -74,6 +75,8 @@ class GuiConfigListener : public ConfigListener
Gui::Gui(Graphics *graphics):
mCustomCursor(false),
mMouseCursors(NULL),
+ mMouseCursorAlpha(1.0f),
+ mMouseInactivityTimer(0),
mCursorType(CURSOR_POINTER)
{
logger->log("Initializing GUI...");
@@ -157,32 +160,47 @@ Gui::~Gui()
delete hitBlueFont;
delete hitYellowFont;
- if (mMouseCursors) {
+ if (mMouseCursors)
mMouseCursors->decRef();
- }
delete mGuiFont;
delete speechFont;
delete viewport;
- delete mTop;
+ delete getTop();
delete guiInput;
}
-void
-Gui::draw()
+void Gui::logic()
+{
+ // Fade out mouse cursor after extended inactivity
+ if (mMouseInactivityTimer < 100 * 15) {
+ ++mMouseInactivityTimer;
+ mMouseCursorAlpha = std::min(1.0f, mMouseCursorAlpha + 0.05f);
+ } else {
+ mMouseCursorAlpha = std::max(0.0f, mMouseCursorAlpha - 0.005f);
+ }
+
+ gcn::Gui::logic();
+}
+
+void Gui::draw()
{
- mGraphics->pushClipArea(mTop->getDimension());
- mTop->draw(mGraphics);
+ mGraphics->pushClipArea(getTop()->getDimension());
+ getTop()->draw(mGraphics);
int mouseX, mouseY;
Uint8 button = SDL_GetMouseState(&mouseX, &mouseY);
- if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS || button & SDL_BUTTON(1)) &&
- mCustomCursor)
+ if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS || button & SDL_BUTTON(1))
+ && mCustomCursor
+ && mMouseCursorAlpha > 0.0f)
{
+ Image *mouseCursor = mMouseCursors->get(mCursorType);
+ mouseCursor->setAlpha(mMouseCursorAlpha);
+
static_cast<Graphics*>(mGraphics)->drawImage(
- mMouseCursors->get(mCursorType),
+ mouseCursor,
mouseX - 15,
mouseY - 17);
}
@@ -190,8 +208,7 @@ Gui::draw()
mGraphics->popClipArea();
}
-void
-Gui::setUseCustomCursor(bool customCursor)
+void Gui::setUseCustomCursor(bool customCursor)
{
if (customCursor != mCustomCursor)
{
@@ -224,3 +241,9 @@ Gui::setUseCustomCursor(bool customCursor)
}
}
}
+
+void Gui::handleMouseMoved(const gcn::MouseInput &mouseInput)
+{
+ gcn::Gui::handleMouseMoved(mouseInput);
+ mMouseInactivityTimer = 0;
+}
diff --git a/src/gui/gui.h b/src/gui/gui.h
index a07d236f..7d390df9 100644
--- a/src/gui/gui.h
+++ b/src/gui/gui.h
@@ -59,6 +59,12 @@ class Gui : public gcn::Gui
~Gui();
/**
+ * Performs logic of the GUI. Overridden to track mouse pointer
+ * activity.
+ */
+ void logic();
+
+ /**
* Draws the whole Gui by calling draw functions down in the
* Gui hierarchy. It also draws the mouse pointer.
*/
@@ -95,11 +101,16 @@ class Gui : public gcn::Gui
CURSOR_TOTAL
};
+ protected:
+ void handleMouseMoved(const gcn::MouseInput &mouseInput);
+
private:
GuiConfigListener *mConfigListener;
gcn::Font *mGuiFont; /**< The global GUI font */
bool mCustomCursor; /**< Show custom cursor */
ImageSet *mMouseCursors; /**< Mouse cursor images */
+ float mMouseCursorAlpha;
+ int mMouseInactivityTimer;
int mCursorType;
};