From 3d6a2c963c24212a0650f6dce5c1a47899f0e387 Mon Sep 17 00:00:00 2001
From: Alexander Sulfrian <alexander@sulfrian.net>
Date: Thu, 22 Mar 2012 22:33:22 +0100
Subject: menu/drawable_control: added position, glTransform to position before
 drawing

software_mouse_pointer does not need an own position anymore and
simply draw it without position change
---
 src/menu/drawable_control.cpp       | 39 ++++++++++++++++++++++++++++++++++--
 src/menu/drawable_control.hpp       | 12 +++++++++++
 src/menu/software_mouse_pointer.cpp | 40 ++++++++++++++-----------------------
 src/menu/software_mouse_pointer.hpp |  5 -----
 4 files changed, 64 insertions(+), 32 deletions(-)

(limited to 'src')

diff --git a/src/menu/drawable_control.cpp b/src/menu/drawable_control.cpp
index cf44aa73..6ee5100c 100644
--- a/src/menu/drawable_control.cpp
+++ b/src/menu/drawable_control.cpp
@@ -35,14 +35,14 @@ namespace usdx
 		log4cpp::Category::getInstance("usdx.menu.drawable_control");
 
 	DrawableControl::DrawableControl(Container* parent)
-		: Control(parent), parent(parent)
+		: Control(parent), position(0, 0), parent(parent)
 	{
 		ContainerHelper(this).add(parent);
 	}
 
 	DrawableControl::DrawableControl(Container* parent,
 									 const ContainerHelper& helper)
-		: Control(parent), parent(parent)
+		: Control(parent), position(0, 0), parent(parent)
 	{
 		helper.add(parent);
 	}
@@ -59,9 +59,44 @@ namespace usdx
 	{
 		glLoadIdentity();
 
+		{
+			// position
+			boost::mutex::scoped_lock lock(position_mutex);
+			glTranslatef(position.get_x(), position.get_y(), 0.0f);
+		}
+
 		Drawable::repaint();
 	}
 
+	void DrawableControl::set_position(const Point<int>& position)
+	{
+		boost::mutex::scoped_lock lock(position_mutex);
+		this->position = position;
+	}
+
+	void DrawableControl::set_position(int left, int top)
+	{
+		boost::mutex::scoped_lock lock(position_mutex);
+		this->position = Point<int>(left, top);
+	}
+
+
+	const Point<int>& DrawableControl::get_position(void) const
+	{
+		return position;
+	}
+
+	int DrawableControl::get_left(void) const
+	{
+		return position.get_x();
+	}
+
+	int DrawableControl::get_top(void) const
+	{
+		return position.get_y();
+	}
+
+
 	DrawableControl::ContainerHelper::ContainerHelper(DrawableControl* self) :
 		self(self)
 	{
diff --git a/src/menu/drawable_control.hpp b/src/menu/drawable_control.hpp
index de3881c5..e954f291 100644
--- a/src/menu/drawable_control.hpp
+++ b/src/menu/drawable_control.hpp
@@ -28,10 +28,12 @@
 #define DRAWABLE_CONTROL_HPP
 
 #include <SDL/SDL.h>
+#include <boost/thread/mutex.hpp>
 #include <log4cpp/Category.hh>
 
 #include "drawable.hpp"
 #include "control.hpp"
+#include "utils/point.hpp"
 
 namespace usdx
 {
@@ -42,6 +44,9 @@ namespace usdx
 	private:
 		static log4cpp::Category& log;
 
+		Point<int> position;
+
+		boost::mutex position_mutex;
 	protected:
 		Container* parent;
 
@@ -61,6 +66,13 @@ namespace usdx
 		virtual ~DrawableControl();
 
 		void repaint(void);
+
+		void set_position(const Point<int>& position);
+		void set_position(int left, int top);
+
+		const Point<int>& get_position(void) const;
+		int get_left(void) const;
+		int get_top(void) const;
 	};
 };
 
diff --git a/src/menu/software_mouse_pointer.cpp b/src/menu/software_mouse_pointer.cpp
index 32609e13..dfe67475 100644
--- a/src/menu/software_mouse_pointer.cpp
+++ b/src/menu/software_mouse_pointer.cpp
@@ -31,7 +31,7 @@
 namespace usdx
 {
 	SoftwareMousePointer::SoftwareMousePointer(Container* parent, EventManager* event_manager)
-		: DrawableControl(parent), x(-1), y(-1)
+		: DrawableControl(parent)
 	{
 		this->vertices[0] = 0.0f;
 		this->vertices[1] = 40.0f;
@@ -68,6 +68,8 @@ namespace usdx
 		this->texture[6] = 0.0f;
 		this->texture[7] = 0.0f;
 
+		set_position(0, 0);
+
 		texture_normal = new Texture("game/themes/Deluxe/interface/cursor.png");
 		texture_pressed = new Texture("game/themes/Deluxe/interface/cursor_pressed.png");
 
@@ -92,38 +94,26 @@ namespace usdx
 
 	void SoftwareMousePointer::draw(void)
 	{
-		glLoadIdentity();
-
-		boost::mutex::scoped_lock lock(mutex);
-
-		if (x >= 0 && y >= 0) {
-			glTranslatef(x, y, 0.0f);
-			lock.unlock();
+		glBindTexture(GL_TEXTURE_2D, texture_normal->get_texture());
 
-			glBindTexture(GL_TEXTURE_2D, texture_normal->get_texture());
+		glEnableClientState(GL_VERTEX_ARRAY);
+		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+		glEnableClientState(GL_COLOR_ARRAY);
 
-			glEnableClientState(GL_VERTEX_ARRAY);
-			glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-			glEnableClientState(GL_COLOR_ARRAY);
+		glVertexPointer(2, GL_FLOAT, 0, vertices);
+		glColorPointer(4, GL_UNSIGNED_BYTE, 0, color);
+		glTexCoordPointer(2, GL_FLOAT, 0, texture);
 
-			glVertexPointer(2, GL_FLOAT, 0, vertices);
-			glColorPointer(4, GL_UNSIGNED_BYTE, 0, color);
-			glTexCoordPointer(2, GL_FLOAT, 0, texture);
+		glDrawArrays(GL_QUADS, 0, 4);
 
-			glDrawArrays(GL_QUADS, 0, 4);
-
-			glDisableClientState(GL_VERTEX_ARRAY);
-			glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-			glDisableClientState(GL_COLOR_ARRAY);
-		}
+		glDisableClientState(GL_VERTEX_ARRAY);
+		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+		glDisableClientState(GL_COLOR_ARRAY);
 	}
 
 	void SoftwareMousePointer::on_mouse_move(int x, int y)
 	{
-		boost::mutex::scoped_lock lock(mutex);
-
-		this->x = x;
-		this->y = y;
+		set_position(x, y);
 	}
 };
 
diff --git a/src/menu/software_mouse_pointer.hpp b/src/menu/software_mouse_pointer.hpp
index d2f8abb0..15e855db 100644
--- a/src/menu/software_mouse_pointer.hpp
+++ b/src/menu/software_mouse_pointer.hpp
@@ -41,9 +41,6 @@ namespace usdx
 	class SoftwareMousePointer : public DrawableControl
 	{
 	private:
-		int x;
-		int y;
-
 		GLfloat vertices[8];
 		GLubyte color[16];
 		GLfloat texture[8];
@@ -53,8 +50,6 @@ namespace usdx
 
 		boost::signals2::connection mouse_move_connection;
 
-		boost::mutex mutex;
-
 	protected:
 		void draw(void);
 
-- 
cgit v1.2.3