[gtkmm] Gtk::Widget: Undeprecate reparent()



commit ba040cf19ed78a6125b64417073dff76a7683ef9
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date:   Wed Jun 11 16:33:33 2014 +0200

    Gtk::Widget: Undeprecate reparent()
    
    * gtk/src/widget.[hg|ccg]: Undeprecate reparent() and implement it without
    calling the deprecated gtk_widget_reparent().

 gtk/src/widget.ccg |   18 ++++++++++++++++++
 gtk/src/widget.hg  |   12 +++++++++---
 2 files changed, 27 insertions(+), 3 deletions(-)
---
diff --git a/gtk/src/widget.ccg b/gtk/src/widget.ccg
index 9f75d85..1453189 100644
--- a/gtk/src/widget.ccg
+++ b/gtk/src/widget.ccg
@@ -416,6 +416,24 @@ void Widget_Class::get_preferred_width_for_height_vfunc_callback(GtkWidget* self
 Widget::~Widget()
 {}
 
+void Widget::reparent(Widget& new_parent)
+{
+  //TODO: When 'Widget& new_parent' is changed to 'Container& new_parent',
+  // remove the next two statements.
+  Container* new_container = dynamic_cast<Container*>(&new_parent);
+  g_return_if_fail(new_container != 0); // if new_parent is not a Container
+  Container* old_container = get_parent();
+  g_return_if_fail(old_container != 0); // if the widget is not in a Container
+
+  if (old_container != new_container)
+  {
+    reference();
+    old_container->remove(*this);
+    new_container->add(*this);
+    unreference();
+  }
+}
+
 bool Widget::intersect(const Gdk::Rectangle& area) const
 {
   return gtk_widget_intersect(
diff --git a/gtk/src/widget.hg b/gtk/src/widget.hg
index 5a0f82c..b058f03 100644
--- a/gtk/src/widget.hg
+++ b/gtk/src/widget.hg
@@ -178,9 +178,15 @@ public:
   _WRAP_METHOD(bool send_focus_change(GdkEvent* event), gtk_widget_send_focus_change)
   _WRAP_METHOD(bool activate(), gtk_widget_activate)
 
-  //TODO: Maybe keep this or implement it ourselves,
-  //because the C API now requires manual ref/unrefing to stop remove() and add() from breaking things.
-  _WRAP_METHOD(void reparent(Widget& new_parent), gtk_widget_reparent, deprecated "Use Container::remove() 
and Container::add() instead.")
+  //TODO: When we can break ABI/API, change to void reparent(Container& new_parent).
+  // gtk_widget_reparent() is deprecated, but we want to keep Gtk::Widget::reparent().
+  /** Moves a widget from one Gtk::Container to another, handling reference
+   * count issues to avoid destroying the widget.
+   * 
+   * @param new_parent A Gtk::Container to move the widget into.
+   */
+  void reparent(Widget& new_parent);
+  _IGNORE(gtk_widget_reparent)
 
   bool intersect(const Gdk::Rectangle& area) const;
   _WRAP_METHOD(bool intersect(const Gdk::Rectangle& area, Gdk::Rectangle& intersection) const, 
gtk_widget_intersect)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]