summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-05-18 16:52:50 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-05-18 16:52:50 +0000
commitead3796adeed06a7d314317d3ca65861409eebda (patch)
tree5095c682c12e003d98fa8e591a72afbb70921376 /gtk2_ardour
parentdcaa9cd70d04c8f6eb63c814068c9fa5a60adc7e (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.cc10
-rw-r--r--gtk2_ardour/audio_streamview.h2
-rw-r--r--gtk2_ardour/editor_route_list.cc11
-rw-r--r--gtk2_ardour/route_time_axis.cc1
-rw-r--r--gtk2_ardour/streamview.cc24
-rw-r--r--gtk2_ardour/streamview.h4
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;