From 1ce8a626eb3974beb29d08cfa647b2609a2dbc33 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Tue, 14 Apr 2009 21:40:58 +0100 Subject: [PATCH] Resolved some Gtk container warnings --- src/gui/panels/panel.cpp | 8 ++++++ src/gui/widgets/timeline-widget.cpp | 22 ++++----------- .../timeline/timeline-header-container.cpp | 28 +++++++++++++++++-- .../timeline/timeline-header-container.hpp | 4 ++- .../timeline/timeline-header-widget.hpp | 2 +- src/gui/widgets/timeline/timeline-track.cpp | 5 ++++ src/gui/widgets/timeline/timeline-track.hpp | 5 ++++ 7 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/gui/panels/panel.cpp b/src/gui/panels/panel.cpp index 1c41782f9..bf1816205 100644 --- a/src/gui/panels/panel.cpp +++ b/src/gui/panels/panel.cpp @@ -61,6 +61,14 @@ Panel::Panel(workspace::PanelManager &panel_manager, Panel::~Panel() { REQUIRE(dockItem != NULL); + + // Detach the panel bar + GdlDockItemGrip *grip = GDL_DOCK_ITEM_GRIP( + gdl_dock_item_get_grip(dockItem)); + gtk_container_remove (GTK_CONTAINER(grip), + ((Widget&)panelBar).gobj()); + + // Unref the dock item g_object_unref(dockItem); dockItem = NULL; } diff --git a/src/gui/widgets/timeline-widget.cpp b/src/gui/widgets/timeline-widget.cpp index 7cb459d86..f4922c03e 100644 --- a/src/gui/widgets/timeline-widget.cpp +++ b/src/gui/widgets/timeline-widget.cpp @@ -53,11 +53,11 @@ TimelineWidget::TimelineWidget( verticalScroll(verticalAdjustment), update_tracks_frozen(false) { - body = new TimelineBody(*this); + body = manage(new TimelineBody(*this)); ENSURE(body != NULL); - headerContainer = new TimelineHeaderContainer(*this); + headerContainer = manage(new TimelineHeaderContainer(*this)); ENSURE(headerContainer != NULL); - ruler = new TimelineRuler(*this); + ruler = manage(new TimelineRuler(*this)); ENSURE(ruler != NULL); horizontalAdjustment.signal_value_changed().connect( sigc::mem_fun( @@ -82,20 +82,10 @@ TimelineWidget::TimelineWidget( TimelineWidget::~TimelineWidget() { - trackMap.clear(); - - // Destroy child widgets - REQUIRE(body != NULL); - if(body != NULL) - delete body; + REQUIRE(headerContainer); + headerContainer->clear_headers(); - REQUIRE(headerContainer != NULL); - if(headerContainer != NULL) - delete headerContainer; - - REQUIRE(ruler != NULL); - if(ruler != NULL) - delete ruler; + trackMap.clear(); } /* ===== Data Access ===== */ diff --git a/src/gui/widgets/timeline/timeline-header-container.cpp b/src/gui/widgets/timeline/timeline-header-container.cpp index 9a023fae3..5b6291ade 100644 --- a/src/gui/widgets/timeline/timeline-header-container.cpp +++ b/src/gui/widgets/timeline/timeline-header-container.cpp @@ -86,6 +86,20 @@ TimelineHeaderContainer::update_headers() ENSURE(widget.get_parent() == this); } } + +void +TimelineHeaderContainer::clear_headers() +{ + // Unparent all the headers + pair, shared_ptr > pair; + BOOST_FOREACH( pair, timelineWidget.trackMap ) + { + REQUIRE(pair.second); + Widget &widget = pair.second->get_header_widget(); + if(widget.get_parent() != NULL) // Is the header unparented? + widget.unparent(); + } +} void TimelineHeaderContainer::on_realize() @@ -298,9 +312,19 @@ TimelineHeaderContainer::forall_vfunc(gboolean /* include_internals */, } void -TimelineHeaderContainer::on_remove(Widget*) +TimelineHeaderContainer::on_remove(Widget* widget) { - // Do nothing - this is just to keep Gtk::Container happy + REQUIRE(widget); + + // Ensure headers are parented correctly + pair, shared_ptr > pair; + BOOST_FOREACH( pair, timelineWidget.trackMap ) + { + REQUIRE(pair.second); + Widget &this_widget = pair.second->get_header_widget(); + if(&this_widget == widget) + this_widget.unparent(); + } } void diff --git a/src/gui/widgets/timeline/timeline-header-container.hpp b/src/gui/widgets/timeline/timeline-header-container.hpp index 6787d7984..8243135d2 100644 --- a/src/gui/widgets/timeline/timeline-header-container.hpp +++ b/src/gui/widgets/timeline/timeline-header-container.hpp @@ -70,6 +70,8 @@ public: * the backend. */ void update_headers(); + + void clear_headers(); /* ===== Overrides ===== */ private: @@ -125,7 +127,7 @@ private: * An event handler that is called when a widget is removed from the * container. **/ - void on_remove(Widget*); + void on_remove(Widget* widget); /* ===== Events ===== */ private: diff --git a/src/gui/widgets/timeline/timeline-header-widget.hpp b/src/gui/widgets/timeline/timeline-header-widget.hpp index 62a33cb9d..3db843738 100644 --- a/src/gui/widgets/timeline/timeline-header-widget.hpp +++ b/src/gui/widgets/timeline/timeline-header-widget.hpp @@ -48,7 +48,7 @@ public: * widget **/ TimelineHeaderWidget(timeline::Track &timeline_track); - + void set_child_widget(Widget& child); private: diff --git a/src/gui/widgets/timeline/timeline-track.cpp b/src/gui/widgets/timeline/timeline-track.cpp index eeb722254..b6c69a698 100644 --- a/src/gui/widgets/timeline/timeline-track.cpp +++ b/src/gui/widgets/timeline/timeline-track.cpp @@ -84,6 +84,11 @@ Track::Track(TimelineWidget &timeline_widget, } +Track::~Track() +{ + headerWidget.remove(headerBox); +} + Gtk::Widget& Track::get_header_widget() { diff --git a/src/gui/widgets/timeline/timeline-track.hpp b/src/gui/widgets/timeline/timeline-track.hpp index e0cba3de1..fbb6b56cc 100644 --- a/src/gui/widgets/timeline/timeline-track.hpp +++ b/src/gui/widgets/timeline/timeline-track.hpp @@ -64,6 +64,11 @@ public: public: Track(TimelineWidget &timeline_widget, boost::shared_ptr track); + + /** + * Destructor + **/ + ~Track(); Gtk::Widget& get_header_widget();