diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2006-10-19 22:02:30 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2006-10-19 22:02:30 +0000 |
commit | 2592a320d42dd4a157ee16101c042d875d3142be (patch) | |
tree | 0409a06f1ef030dc9339c5c17bd3ff1854125256 /gtk2_ardour | |
parent | 0c31e4c4f3d0bfe37d26a793c934f1b436f8fa0f (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.cc | 8 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 9 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 31 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.cc | 3 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/streamview.cc | 15 | ||||
-rw-r--r-- | gtk2_ardour/streamview.h | 1 |
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 (); |