diff options
Diffstat (limited to 'src/menu')
-rw-r--r-- | src/menu/container.cpp | 21 | ||||
-rw-r--r-- | src/menu/container.hpp | 2 | ||||
-rw-r--r-- | src/menu/drawable_control.cpp | 22 | ||||
-rw-r--r-- | src/menu/drawable_control.hpp | 4 |
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); }; }; |