]> git.tdb.fi Git - libs/gltk.git/commitdiff
Add some utility functions for dealing with widget hierarchy
authorMikko Rasa <tdb@tdb.fi>
Thu, 8 Aug 2013 16:02:10 +0000 (19:02 +0300)
committerMikko Rasa <tdb@tdb.fi>
Thu, 8 Aug 2013 16:02:10 +0000 (19:02 +0300)
source/widget.cpp
source/widget.h

index 13c5174df43e33cc6db256bbbe47ec45d3de7c4a..a9c233b5d8c370a0ece166c00bc81a8fb1b1f0ff 100644 (file)
@@ -75,6 +75,21 @@ void Widget::set_geometry(const Geometry &g)
        }
 }
 
        }
 }
 
+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 Widget::set_parent(Container *p)
 {
        if(parent && p)
index 5c81b8056e6f409641095b2303513a95eff4d3ae..dfef4ba7128be3b1a3e099addc5b7720a943ad8e 100644 (file)
@@ -68,6 +68,8 @@ public:
        void set_geometry(const Geometry &);
        const Geometry &get_geometry() const { return geom; }
 
        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. */
 protected:
        /** Sets the widget's parent Container.  The widget must be unparented when
        calling this function with a non-null parameter. */
@@ -75,6 +77,16 @@ protected:
 public:
        Container *get_parent() const { return parent; }
 
 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. */
        /** 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. */