summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-10-19 22:02:30 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-10-19 22:02:30 +0000
commit2592a320d42dd4a157ee16101c042d875d3142be (patch)
tree0409a06f1ef030dc9339c5c17bd3ff1854125256 /gtk2_ardour
parent0c31e4c4f3d0bfe37d26a793c934f1b436f8fa0f (diff)
major changes to Region, AudioRegion, Playlist, AudioPlaylist and Crossfade state management, to try to fix undo/redo. Not finished, butthe speedups etc. are in place
git-svn-id: svn://localhost/ardour2/trunk@993 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/audio_streamview.cc8
-rw-r--r--gtk2_ardour/editor.cc9
-rw-r--r--gtk2_ardour/editor_mouse.cc2
-rw-r--r--gtk2_ardour/editor_ops.cc31
-rw-r--r--gtk2_ardour/route_time_axis.cc3
-rw-r--r--gtk2_ardour/route_time_axis.h1
-rw-r--r--gtk2_ardour/streamview.cc15
-rw-r--r--gtk2_ardour/streamview.h1
8 files changed, 31 insertions, 39 deletions
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc
index 0a74d89d35..3cca792523 100644
--- a/gtk2_ardour/audio_streamview.cc
+++ b/gtk2_ardour/audio_streamview.cc
@@ -254,7 +254,7 @@ AudioStreamView::add_crossfade (Crossfade *crossfade)
/* first see if we already have a CrossfadeView for this Crossfade */
for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
- if (&(*i)->crossfade == crossfade) {
+ if ((*i)->crossfade == *crossfade) {
if (!crossfades_visible) {
(*i)->hide();
} else {
@@ -313,7 +313,6 @@ AudioStreamView::redisplay_diskstream ()
list<RegionView *>::iterator i, tmp;
list<CrossfadeView*>::iterator xi, tmpx;
-
for (i = region_views.begin(); i != region_views.end(); ++i) {
(*i)->set_valid (false);
}
@@ -327,6 +326,7 @@ AudioStreamView::redisplay_diskstream ()
if (_trackview.is_audio_track()) {
_trackview.get_diskstream()->playlist()->foreach_region (static_cast<StreamView*>(this), &StreamView::add_region_view);
+
AudioPlaylist* apl = dynamic_cast<AudioPlaylist*>(_trackview.get_diskstream()->playlist());
if (apl)
apl->foreach_crossfade (this, &AudioStreamView::add_crossfade);
@@ -358,7 +358,9 @@ AudioStreamView::redisplay_diskstream ()
/* now fix layering */
- playlist_modified ();
+ for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+ region_layered (*i);
+ }
}
void
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 67f3acccf9..99e1f5bb1e 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -3074,9 +3074,6 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
switch (clicked_regionview->region()->coverage (first_frame, last_frame)) {
case OverlapNone:
- cerr << "no overlap, first = " << first_frame << " last = " << last_frame << " region = "
- << clicked_regionview->region()->first_frame() << " .. " << clicked_regionview->region()->last_frame() << endl;
-
if (last_frame < clicked_regionview->region()->first_frame()) {
first_frame = last_frame;
last_frame = clicked_regionview->region()->last_frame();
@@ -3087,9 +3084,6 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
break;
case OverlapExternal:
- cerr << "external overlap, first = " << first_frame << " last = " << last_frame << " region = "
- << clicked_regionview->region()->first_frame() << " .. " << clicked_regionview->region()->last_frame() << endl;
-
if (last_frame < clicked_regionview->region()->first_frame()) {
first_frame = last_frame;
last_frame = clicked_regionview->region()->last_frame();
@@ -3100,9 +3094,6 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
break;
case OverlapInternal:
- cerr << "internal overlap, first = " << first_frame << " last = " << last_frame << " region = "
- << clicked_regionview->region()->first_frame() << " .. " << clicked_regionview->region()->last_frame() << endl;
-
if (last_frame < clicked_regionview->region()->first_frame()) {
first_frame = last_frame;
last_frame = clicked_regionview->region()->last_frame();
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index 0ee110bf30..45252e052c 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -4837,7 +4837,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes_t pos)
// playlist is frozen, so we have to update manually
- playlist->StateChanged (Change (~0)); /* EMIT SIGNAL */
+ playlist->Modified(); /* EMIT SIGNAL */
}
gint
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 0a3104d36a..280804c94f 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -2910,14 +2910,26 @@ Editor::cut_copy_points (CutCopyOp op)
}
}
+struct PlaylistState {
+ Playlist* playlist;
+ XMLNode* before;
+};
+
+struct lt_playlist {
+ bool operator () (const PlaylistState& a, const PlaylistState& b) {
+ return a.playlist < b.playlist;
+ }
+};
+
void
Editor::cut_copy_regions (CutCopyOp op)
{
typedef std::map<AudioPlaylist*,AudioPlaylist*> PlaylistMapping;
PlaylistMapping pmap;
nframes_t first_position = max_frames;
- set<Playlist*> freezelist;
- pair<set<Playlist*>::iterator,bool> insert_result;
+
+ set<PlaylistState, lt_playlist> freezelist;
+ pair<set<PlaylistState, lt_playlist>::iterator,bool> insert_result;
for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
first_position = min ((*x)->region()->position(), first_position);
@@ -2925,10 +2937,15 @@ Editor::cut_copy_regions (CutCopyOp op)
if (op == Cut || op == Clear) {
AudioPlaylist *pl = dynamic_cast<AudioPlaylist*>((*x)->region()->playlist());
if (pl) {
- insert_result = freezelist.insert (pl);
+
+ PlaylistState before;
+ before.playlist = pl;
+ before.before = &pl->get_state();
+
+ insert_result = freezelist.insert (before);
+
if (insert_result.second) {
pl->freeze ();
- session->add_command (new MementoCommand<Playlist>(*pl, &pl->get_state(), 0));
}
}
}
@@ -2990,9 +3007,9 @@ Editor::cut_copy_regions (CutCopyOp op)
cut_buffer->set (foo);
}
- for (set<Playlist*>::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) {
- (*pl)->thaw ();
- session->add_command (new MementoCommand<Playlist>(*(*pl), 0, &(*pl)->get_state()));
+ for (set<PlaylistState, lt_playlist>::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) {
+ (*pl).playlist->thaw ();
+ session->add_command (new MementoCommand<Playlist>(*(*pl).playlist, (*pl).before, &(*pl).playlist->get_state()));
}
}
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index e0d976c233..eb96791d28 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -244,9 +244,6 @@ RouteTimeAxisView::set_playlist (Playlist *newplaylist)
assert(pl);
modified_connection.disconnect ();
- state_changed_connection.disconnect ();
-
- state_changed_connection = pl->StateChanged.connect (mem_fun(*this, &RouteTimeAxisView::playlist_state_changed));
modified_connection = pl->Modified.connect (mem_fun(*this, &RouteTimeAxisView::playlist_modified));
}
diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h
index 65d82506b8..1eb0cea00b 100644
--- a/gtk2_ardour/route_time_axis.h
+++ b/gtk2_ardour/route_time_axis.h
@@ -248,7 +248,6 @@ protected:
vector<RedirectAutomationLine*> redirect_automation_curves;
sigc::connection modified_connection;
- sigc::connection state_changed_connection;
};
#endif /* __ardour_route_time_axis_h__ */
diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc
index 10d409a9b0..75fb003d77 100644
--- a/gtk2_ardour/streamview.cc
+++ b/gtk2_ardour/streamview.cc
@@ -206,9 +206,7 @@ StreamView::playlist_modified ()
{
ENSURE_GUI_THREAD (mem_fun (*this, &StreamView::playlist_modified));
- for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
- region_layered (*i);
- }
+ redisplay_diskstream ();
}
void
@@ -231,21 +229,10 @@ StreamView::playlist_changed (boost::shared_ptr<Diskstream> ds)
/* catch changes */
- playlist_connections.push_back (ds->playlist()->RegionAdded.connect (mem_fun (*this, &StreamView::add_region_view)));
- playlist_connections.push_back (ds->playlist()->RegionRemoved.connect (mem_fun (*this, &StreamView::remove_region_view)));
- playlist_connections.push_back (ds->playlist()->StateChanged.connect (mem_fun (*this, &StreamView::playlist_state_changed)));
playlist_connections.push_back (ds->playlist()->Modified.connect (mem_fun (*this, &StreamView::playlist_modified)));
}
void
-StreamView::playlist_state_changed (Change ignored)
-{
- ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::playlist_state_changed), ignored));
-
- redisplay_diskstream ();
-}
-
-void
StreamView::diskstream_changed ()
{
Track *t;
diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h
index cc5f9cb414..657bfa9044 100644
--- a/gtk2_ardour/streamview.h
+++ b/gtk2_ardour/streamview.h
@@ -116,7 +116,6 @@ protected:
virtual void redisplay_diskstream () = 0;
void diskstream_changed ();
- void playlist_state_changed (ARDOUR::Change);
virtual void playlist_changed (boost::shared_ptr<ARDOUR::Diskstream>);
virtual void playlist_modified ();