aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2012-04-09 18:33:45 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-01-13 22:40:52 +0100
commit09eacc82176c37fdc12c903061ffa3ff960ac4cf (patch)
tree91b8c9eab484a838504cebc4c0a9eda4d7fe4b01
parentde10bbae4602917aae0ed648824f75c3f674eb4a (diff)
downloadusdx-09eacc82176c37fdc12c903061ffa3ff960ac4cf.tar.gz
usdx-09eacc82176c37fdc12c903061ffa3ff960ac4cf.tar.xz
usdx-09eacc82176c37fdc12c903061ffa3ff960ac4cf.zip
menu/container: calculate window coordinates
the container have to keep the current window coordinates of its left, bottom corner, therefor they have to be recalculated on every size/position change (need virtual functions in DrawableControl)
-rw-r--r--src/menu/container.cpp36
-rw-r--r--src/menu/container.hpp37
-rw-r--r--src/menu/drawable_control.hpp4
3 files changed, 74 insertions, 3 deletions
diff --git a/src/menu/container.cpp b/src/menu/container.cpp
index ce73c1c2..3cf8d770 100644
--- a/src/menu/container.cpp
+++ b/src/menu/container.cpp
@@ -91,4 +91,40 @@ namespace usdx
{
return window_coords;
}
+
+ void Container::recalculate_window_coords(void)
+ {
+ if (parent) {
+ assert(parent != NULL);
+ window_coords.set_x(parent->get_width() -
+ (get_left() + get_width()));
+
+ window_coords.set_y(parent->get_height() -
+ (get_top() + get_height()));
+ }
+ }
+
+ void Container::set_position(const Point<int>& position)
+ {
+ DrawableControl::set_position(position);
+ recalculate_window_coords();
+ }
+
+ void Container::set_position(int left, int top)
+ {
+ DrawableControl::set_position(left, top);
+ recalculate_window_coords();
+ }
+
+ void Container::set_size(const Dimension<int>& size)
+ {
+ DrawableControl::set_size(size);
+ recalculate_window_coords();
+ }
+
+ void Container::set_size(int width, int height)
+ {
+ DrawableControl::set_size(width, height);
+ recalculate_window_coords();
+ }
};
diff --git a/src/menu/container.hpp b/src/menu/container.hpp
index 147a0d92..0fa4803e 100644
--- a/src/menu/container.hpp
+++ b/src/menu/container.hpp
@@ -45,11 +45,18 @@ namespace usdx
Frame* frame;
std::list<DrawableControl*> controls;
+ /**
+ * Left bottom corner of the container in window coordinats. This is
+ * used for calculating the window coordinates of the containing
+ * controls for clipping, that only works with window coordinates.
+ */
+ Point<int> window_coords;
+ void recalculate_window_coords(void);
+
protected:
Container(Container*, const ContainerHelper&);
virtual void draw(void);
- Point<int> window_coords;
public:
Container(Container*);
@@ -62,6 +69,34 @@ namespace usdx
virtual void removeFrame(void);
const Point<int>& get_window_coords(void) const;
+
+ /**
+ * Overwritten here to be able to recalculate the window coordinates.
+ *
+ * @see window_coords
+ */
+ virtual void set_position(const Point<int>& position);
+
+ /**
+ * Overwritten here to be able to recalculate the window coordinates.
+ *
+ * @see window_coords
+ */
+ virtual void set_position(int left, int top);
+
+ /**
+ * Overwritten here to be able to recalculate the window coordinates.
+ *
+ * @see window_coords
+ */
+ virtual void set_size(const Dimension<int>& size);
+
+ /**
+ * Overwritten here to be able to recalculate the window coordinates.
+ *
+ * @see window_coords
+ */
+ virtual void set_size(int width, int height);
};
};
diff --git a/src/menu/drawable_control.hpp b/src/menu/drawable_control.hpp
index 7f353a5a..261f0514 100644
--- a/src/menu/drawable_control.hpp
+++ b/src/menu/drawable_control.hpp
@@ -77,8 +77,8 @@ namespace usdx
void repaint(void);
- void set_position(const Point<int>& position);
- void set_position(int left, int top);
+ virtual void set_position(const Point<int>& position);
+ virtual void set_position(int left, int top);
const Point<int>& get_position(void) const;
int get_left(void) const;