aboutsummaryrefslogtreecommitdiffstats
path: root/src/menu/software_mouse_pointer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/menu/software_mouse_pointer.cpp')
-rw-r--r--src/menu/software_mouse_pointer.cpp55
1 files changed, 51 insertions, 4 deletions
diff --git a/src/menu/software_mouse_pointer.cpp b/src/menu/software_mouse_pointer.cpp
index 99aed07a..d5be92d1 100644
--- a/src/menu/software_mouse_pointer.cpp
+++ b/src/menu/software_mouse_pointer.cpp
@@ -30,7 +30,7 @@
namespace usdx
{
SoftwareMousePointer::SoftwareMousePointer(Container* parent, EventManager* event_manager)
- : DrawableControl(parent), color(255,255,255,100)
+ : DrawableControl(parent), color(255,255,255,100), down(false)
{
fade_inactive = new Timer(this, 2000, true);
@@ -51,11 +51,17 @@ namespace usdx
mouse_move_connection = event_manager->mouse_move.connect(
boost::bind(&SoftwareMousePointer::on_mouse_move, this, _1, _2));
+ mouse_down_connection = event_manager->mouse_down.connect(
+ boost::bind(&SoftwareMousePointer::on_mouse_down, this, _1, _2, _3));
+ mouse_up_connection = event_manager->mouse_up.connect(
+ boost::bind(&SoftwareMousePointer::on_mouse_up, this, _1, _2, _3));
}
SoftwareMousePointer::~SoftwareMousePointer()
{
mouse_move_connection.disconnect();
+ mouse_down_connection.disconnect();
+ mouse_up_connection.disconnect();
if (texture_normal != NULL) {
delete texture_normal;
@@ -68,6 +74,16 @@ namespace usdx
}
}
+ Texture* SoftwareMousePointer::get_current_texture() const
+ {
+ if (is_down()) {
+ return texture_pressed->get();
+ }
+ else {
+ return texture_normal->get();
+ }
+ }
+
void SoftwareMousePointer::draw(void)
{
if (fade_inactive->is_ready()) {
@@ -75,7 +91,7 @@ namespace usdx
return;
}
- Activator<Texture> a(texture_normal->get());
+ Activator<Texture> a(get_current_texture());
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -97,14 +113,45 @@ namespace usdx
glDisableClientState(GL_COLOR_ARRAY);
}
- void SoftwareMousePointer::on_mouse_move(uint16_t x, uint16_t y)
+ void SoftwareMousePointer::update(void)
{
- set_position(x, y);
fade_inactive->update();
if (!is_visible()) {
set_visible(true);
}
}
+
+ void SoftwareMousePointer::on_mouse_move(uint16_t x, uint16_t y)
+ {
+ set_position(x, y);
+ update();
+ }
+
+ void SoftwareMousePointer::on_mouse_down(uint8_t button, uint16_t x, uint16_t y)
+ {
+ if (button == 1) {
+ boost::unique_lock<boost::shared_mutex> lock(down_mutex);
+ down = true;
+ }
+
+ update();
+ }
+
+ void SoftwareMousePointer::on_mouse_up(uint8_t button, uint16_t x, uint16_t y)
+ {
+ if (button == 1) {
+ boost::unique_lock<boost::shared_mutex> lock(down_mutex);
+ down = false;
+ }
+
+ update();
+ }
+
+ bool SoftwareMousePointer::is_down(void) const
+ {
+ boost::shared_lock<boost::shared_mutex> lock(down_mutex);
+ return down;
+ }
};