aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-01-18 19:40:54 +0100
committerAlexander Sulfrian <alexander@sulfrian.net>2013-01-18 19:40:54 +0100
commit3ee941b5196cd9328f8e6d5de8fb0aeeae9e39f1 (patch)
tree263486c62c9fc1751ec5a35e97fc6fc0b7a6dfb5
parente6ab9e205cee131f75ba2435b52c68ae765360b9 (diff)
downloadusdx-3ee941b5196cd9328f8e6d5de8fb0aeeae9e39f1.tar.gz
usdx-3ee941b5196cd9328f8e6d5de8fb0aeeae9e39f1.tar.xz
usdx-3ee941b5196cd9328f8e6d5de8fb0aeeae9e39f1.zip
menu: add get_component_at to get component
This is the basis for mouse focus handling.
-rw-r--r--src/menu/container.cpp21
-rw-r--r--src/menu/container.hpp2
-rw-r--r--src/menu/drawable_control.cpp22
-rw-r--r--src/menu/drawable_control.hpp4
4 files changed, 49 insertions, 0 deletions
diff --git a/src/menu/container.cpp b/src/menu/container.cpp
index 31155e3c..fb13d398 100644
--- a/src/menu/container.cpp
+++ b/src/menu/container.cpp
@@ -144,4 +144,25 @@ namespace usdx
DrawableControl::set_size(width, height);
recalculate_window_coords();
}
+
+ DrawableControl* Container::get_component_at(const Point<int>& p)
+ {
+ if (!get_absolut_rect().is_in(p))
+ return NULL;
+
+ for (std::list<DrawableControl*>::iterator next = controls.begin(), it = next++;
+ it != controls.end(); it = next++) {
+
+ DrawableControl* c = (*it)->get_component_at(p);
+ if (c != NULL) {
+ return c;
+ }
+ }
+
+ if (frame) {
+ return frame->get_component_at(p);
+ }
+
+ return this;
+ }
};
diff --git a/src/menu/container.hpp b/src/menu/container.hpp
index f9eeacd5..67bbb3c4 100644
--- a/src/menu/container.hpp
+++ b/src/menu/container.hpp
@@ -105,6 +105,8 @@ namespace usdx
*/
virtual void set_size(int width, int height);
+ virtual DrawableControl* get_component_at(const Point<int>& p);
+
/**
* This signal gets emitted, if the window coordinates are changed.
*/
diff --git a/src/menu/drawable_control.cpp b/src/menu/drawable_control.cpp
index 47df96db..76749840 100644
--- a/src/menu/drawable_control.cpp
+++ b/src/menu/drawable_control.cpp
@@ -230,4 +230,26 @@ namespace usdx
boost::shared_lock<boost::shared_mutex> lock(background_mutex);
return background;
}
+
+ const Rectangle<int> DrawableControl::get_absolut_rect(void) const
+ {
+ Rectangle<int> rect(get_position(), get_size());
+
+ if (parent) {
+ Rectangle<int> parent_rect = parent->get_absolut_rect();
+ rect += Point<int>(parent_rect.get_left(),
+ parent_rect.get_top());
+ }
+
+ return rect;
+ }
+
+ DrawableControl* DrawableControl::get_component_at(const Point<int>& p)
+ {
+ if (focusable && get_absolut_rect().is_in(p)) {
+ return this;
+ }
+
+ return NULL;
+ }
};
diff --git a/src/menu/drawable_control.hpp b/src/menu/drawable_control.hpp
index cd1f45e0..9e15966e 100644
--- a/src/menu/drawable_control.hpp
+++ b/src/menu/drawable_control.hpp
@@ -33,6 +33,7 @@
#include "control.hpp"
#include "utils/point.hpp"
#include "utils/dimension.hpp"
+#include "utils/rectangle.hpp"
#include "background.hpp"
namespace usdx
@@ -131,6 +132,9 @@ namespace usdx
void set_background(Background*);
const Background* get_background(void) const;
+
+ const Rectangle<int> get_absolut_rect(void) const;
+ virtual DrawableControl* get_component_at(const Point<int>& p);
};
};