Resolved some Gtk container warnings

This commit is contained in:
Joel Holdsworth 2009-04-14 21:40:58 +01:00
parent 8f201b76b7
commit 1ce8a626eb
7 changed files with 54 additions and 20 deletions

View file

@ -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;
}

View file

@ -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 ===== */

View file

@ -86,6 +86,20 @@ TimelineHeaderContainer::update_headers()
ENSURE(widget.get_parent() == this);
}
}
void
TimelineHeaderContainer::clear_headers()
{
// Unparent all the headers
pair<shared_ptr<model::Track>, shared_ptr<timeline::Track> > 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<model::Track>, shared_ptr<timeline::Track> > 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

View file

@ -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:

View file

@ -48,7 +48,7 @@ public:
* widget
**/
TimelineHeaderWidget(timeline::Track &timeline_track);
void set_child_widget(Widget& child);
private:

View file

@ -84,6 +84,11 @@ Track::Track(TimelineWidget &timeline_widget,
}
Track::~Track()
{
headerWidget.remove(headerBox);
}
Gtk::Widget&
Track::get_header_widget()
{

View file

@ -64,6 +64,11 @@ public:
public:
Track(TimelineWidget &timeline_widget,
boost::shared_ptr<model::Track> track);
/**
* Destructor
**/
~Track();
Gtk::Widget& get_header_widget();