diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-05-18 16:52:50 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-05-18 16:52:50 +0000 |
commit | ead3796adeed06a7d314317d3ca65861409eebda (patch) | |
tree | 5095c682c12e003d98fa8e591a72afbb70921376 /gtk2_ardour | |
parent | dcaa9cd70d04c8f6eb63c814068c9fa5a60adc7e (diff) |
allow diskstream deletion after a track is removed by using weak_ptr<Diskstream> instead of shared_ptr<Diskstream> in GUI signal handling
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@1883 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/audio_streamview.cc | 10 | ||||
-rw-r--r-- | gtk2_ardour/audio_streamview.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_route_list.cc | 11 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/streamview.cc | 24 | ||||
-rw-r--r-- | gtk2_ardour/streamview.h | 4 |
6 files changed, 35 insertions, 17 deletions
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 279130ad38..35078804a2 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -279,9 +279,15 @@ AudioStreamView::playlist_modified () } void -AudioStreamView::playlist_changed (boost::shared_ptr<Diskstream> ds) +AudioStreamView::playlist_changed (boost::weak_ptr<Diskstream> wptr) { - ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::playlist_changed), ds)); + ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::playlist_changed), wptr)); + + boost::shared_ptr<Diskstream> ds = wptr.lock(); + + if (!ds) { + return; + } StreamView::playlist_changed(ds); diff --git a/gtk2_ardour/audio_streamview.h b/gtk2_ardour/audio_streamview.h index 12d400bebd..b2d538471f 100644 --- a/gtk2_ardour/audio_streamview.h +++ b/gtk2_ardour/audio_streamview.h @@ -91,7 +91,7 @@ class AudioStreamView : public StreamView void undisplay_diskstream (); void redisplay_diskstream (); void playlist_modified (); - void playlist_changed (boost::shared_ptr<ARDOUR::Diskstream>); + void playlist_changed (boost::weak_ptr<ARDOUR::Diskstream>); void add_crossfade (boost::shared_ptr<ARDOUR::Crossfade>); void add_crossfade_weak (boost::weak_ptr<ARDOUR::Crossfade>); diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc index 1876b17f10..e2ed6f7191 100644 --- a/gtk2_ardour/editor_route_list.cc +++ b/gtk2_ardour/editor_route_list.cc @@ -133,24 +133,25 @@ Editor::remove_route (TimeAxisView *tv) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::remove_route), tv)); - TrackViewList::iterator i; TreeModel::Children rows = route_display_model->children(); TreeModel::Children::iterator ri; - if ((i = find (track_views.begin(), track_views.end(), tv)) != track_views.end()) { - track_views.erase (i); - } - for (ri = rows.begin(); ri != rows.end(); ++ri) { if ((*ri)[route_display_columns.tv] == tv) { route_display_model->erase (ri); break; } } + + if ((i = find (track_views.begin(), track_views.end(), tv)) != track_views.end()) { + track_views.erase (i); + } + /* since the editor mixer goes away when you remove a route, set the * button to inactive and untick the menu option */ + editor_mixer_button.set_active(false); ActionManager::uncheck_toggleaction ("<Actions>/Editor/show-editor-mixer"); diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index f14aa53e71..dd75113f68 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -296,7 +296,6 @@ RouteTimeAxisView::set_edit_group_from_menu (RouteGroup *eg) void RouteTimeAxisView::playlist_changed () - { label_view (); diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 2a5c13a224..62d8e99254 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -194,11 +194,17 @@ StreamView::undisplay_diskstream () } void -StreamView::display_diskstream (boost::shared_ptr<Diskstream> ds) +StreamView::display_diskstream (boost::weak_ptr<Diskstream> wds) { + boost::shared_ptr<Diskstream> ds = wds.lock(); + + if (!ds) { + return; + } + playlist_change_connection.disconnect(); - playlist_changed (ds); - playlist_change_connection = ds->PlaylistChanged.connect (bind (mem_fun (*this, &StreamView::playlist_changed), ds)); + playlist_changed (wds); + playlist_change_connection = ds->PlaylistChanged.connect (bind (mem_fun (*this, &StreamView::playlist_changed), wds)); } void @@ -210,9 +216,15 @@ StreamView::playlist_modified () } void -StreamView::playlist_changed (boost::shared_ptr<Diskstream> ds) +StreamView::playlist_changed (boost::weak_ptr<Diskstream> wptr) { - ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::playlist_changed), ds)); + ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::playlist_changed), wptr)); + + boost::shared_ptr<Diskstream> ds = wptr.lock(); + + if (!ds) { + return; + } /* disconnect from old playlist */ @@ -238,7 +250,7 @@ StreamView::diskstream_changed () Track *t; if ((t = _trackview.track()) != 0) { - Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun (*this, &StreamView::display_diskstream), t->diskstream())); + Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun (*this, &StreamView::display_diskstream), boost::weak_ptr<Diskstream> (t->diskstream()))); } else { Gtkmm2ext::UI::instance()->call_slot (mem_fun (*this, &StreamView::undisplay_diskstream)); } diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h index 657bfa9044..ef55ebc4af 100644 --- a/gtk2_ardour/streamview.h +++ b/gtk2_ardour/streamview.h @@ -111,12 +111,12 @@ protected: virtual void remove_region_view (boost::weak_ptr<ARDOUR::Region> ); //void remove_rec_region (boost::shared_ptr<ARDOUR::Region>); (unused) - void display_diskstream (boost::shared_ptr<ARDOUR::Diskstream>); + void display_diskstream (boost::weak_ptr<ARDOUR::Diskstream>); virtual void undisplay_diskstream (); virtual void redisplay_diskstream () = 0; void diskstream_changed (); - virtual void playlist_changed (boost::shared_ptr<ARDOUR::Diskstream>); + virtual void playlist_changed (boost::weak_ptr<ARDOUR::Diskstream>); virtual void playlist_modified (); virtual void color_handler (ColorID, uint32_t) = 0; |