}
}
+void Widget::map_coords_to_ancestor(int &x, int &y, const Widget &ancestor) const
+{
+ for(const Widget *w=this; w; w=w->get_parent())
+ {
+ if(w==&ancestor)
+ return;
+
+ const Geometry &wgeom = w->get_geometry();
+ x += wgeom.x;
+ y += wgeom.y;
+ }
+
+ throw hierarchy_error("not an ancestor");
+}
+
void Widget::set_parent(Container *p)
{
if(parent && p)
void set_geometry(const Geometry &);
const Geometry &get_geometry() const { return geom; }
+ void map_coords_to_ancestor(int &, int &, const Widget &) const;
+
protected:
/** Sets the widget's parent Container. The widget must be unparented when
calling this function with a non-null parameter. */
public:
Container *get_parent() const { return parent; }
+ /** Finds the closest ancestor of a specific type. */
+ template<typename T>
+ T *find_ancestor() const
+ {
+ for(Widget *w=parent; w; w=w->get_parent())
+ if(T *tw = dynamic_cast<T *>(w))
+ return tw;
+ return 0;
+ }
+
/** Sets the widget style. The name of the resource to be looked up is
constructed by concatenating the widget class and the style name with a
dash. */