X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_ops.cc;h=9206f1516bfc1a2581d69237d028a346e5ec58d3;hb=fddb3778120e25b3b8e8134084e260dac07c1365;hp=2bb91fe229d341281dc293525a3d27c09176682b;hpb=fa701b8c065251d242342b86a54d91826d2290a0;p=ardour.git diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 2bb91fe229..9206f1516b 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -79,6 +79,7 @@ #include "editor_routes.h" #include "editor_regions.h" #include "quantize_dialog.h" +#include "interthread_progress_window.h" #include "i18n.h" @@ -155,7 +156,13 @@ Editor::split_regions_at (nframes64_t where, RegionSelection& regions) boost::shared_ptr pl = (*a)->region()->playlist(); - if (! pl->frozen()) { + if (!pl) { + cerr << "region " << (*a)->region()->name() << " has no playlist!\n"; + a = tmp; + continue; + } + + if (!pl->frozen()) { /* we haven't seen this playlist before */ /* remember used playlists so we can thaw them later */ @@ -163,16 +170,10 @@ Editor::split_regions_at (nframes64_t where, RegionSelection& regions) pl->freeze(); } - AudioRegionView* const arv = dynamic_cast(*a); - if (arv) { - _new_regionviews_show_envelope = arv->envelope_visible(); - } - if (pl) { - XMLNode &before = pl->get_state(); + pl->clear_history (); pl->split_region ((*a)->region(), where); - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl, &before, &after)); + _session->add_command (new StatefulDiffCommand (pl)); } a = tmp; @@ -185,7 +186,6 @@ Editor::split_regions_at (nframes64_t where, RegionSelection& regions) } commit_reversible_command (); - _new_regionviews_show_envelope = false; } boost::shared_ptr @@ -324,10 +324,9 @@ Editor::nudge_forward (bool next, bool force_playhead) distance = next_distance; } - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); r->set_position (r->position() + distance, this); - XMLNode &after = r->playlist()->get_state(); - _session->add_command (new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command (new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -404,16 +403,15 @@ Editor::nudge_backward (bool next, bool force_playhead) if (next) { distance = next_distance; } - - XMLNode &before = r->playlist()->get_state(); + + r->clear_history (); if (r->position() > distance) { r->set_position (r->position() - distance, this); } else { r->set_position (0, this); } - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command (new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -494,10 +492,9 @@ Editor::nudge_forward_capture_offset () for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { boost::shared_ptr r ((*i)->region()); - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); r->set_position (r->position() + distance, this); - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -524,15 +521,14 @@ Editor::nudge_backward_capture_offset () for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { boost::shared_ptr r ((*i)->region()); - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); if (r->position() > distance) { r->set_position (r->position() - distance, this); } else { r->set_position (0, this); } - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -635,8 +631,8 @@ Editor::build_region_boundary_cache () RouteTimeAxisView *rtav; if (ontrack != 0 && (rtav = dynamic_cast(ontrack)) != 0 ) { - if (rtav->get_diskstream() != 0) { - speed = rtav->get_diskstream()->speed(); + if (rtav->track() != 0) { + speed = rtav->track()->speed(); } } @@ -690,8 +686,8 @@ Editor::find_next_region (nframes64_t frame, RegionPoint point, int32_t dir, Tra track_speed = 1.0f; if ( (rtav = dynamic_cast(*i)) != 0 ) { - if (rtav->get_diskstream()!=0) - track_speed = rtav->get_diskstream()->speed(); + if (rtav->track()!=0) + track_speed = rtav->track()->speed(); } track_frame = session_frame_to_track_frame(frame, track_speed); @@ -891,8 +887,8 @@ Editor::cursor_to_region_point (EditorCursor* cursor, RegionPoint point, int32_t RouteTimeAxisView *rtav; if ( ontrack != 0 && (rtav = dynamic_cast(ontrack)) != 0 ) { - if (rtav->get_diskstream() != 0) { - speed = rtav->get_diskstream()->speed(); + if (rtav->track() != 0) { + speed = rtav->track()->speed(); } } @@ -1088,8 +1084,8 @@ Editor::selected_marker_to_region_point (RegionPoint point, int32_t dir) RouteTimeAxisView *rtav; if (ontrack != 0 && (rtav = dynamic_cast(ontrack)) != 0) { - if (rtav->get_diskstream() != 0) { - speed = rtav->get_diskstream()->speed(); + if (rtav->track() != 0) { + speed = rtav->track()->speed(); } } @@ -1554,7 +1550,7 @@ Editor::temporal_zoom (gdouble fpu) /* XXX this limit is also in ::set_frames_per_unit() */ - if (frames_per_unit <= 2.0 && fpu <= frames_per_unit) { + if (frames_per_unit <= 1.0 && fpu <= frames_per_unit) { return; } @@ -1740,7 +1736,7 @@ Editor::temporal_zoom_region (bool both_axes) for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) { - hide_track_in_display (**i, true); + hide_track_in_display (*i, true); } } @@ -1780,7 +1776,13 @@ Editor::temporal_zoom_session () ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_session) if (_session) { - temporal_zoom_by_frame (_session->current_start_frame(), _session->current_end_frame(), "zoom to _session"); + nframes_t const l = _session->current_end_frame() - _session->current_start_frame(); + double s = _session->current_start_frame() - l * 0.01; + if (s < 0) { + s = 0; + } + nframes_t const e = _session->current_end_frame() + l * 0.01; + temporal_zoom_by_frame (nframes_t (s), e, "zoom to _session"); } } @@ -2195,8 +2197,6 @@ Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) boost::shared_ptr playlist; track_canvas->window_to_world (x, y, wx, wy); - //wx += horizontal_adjustment.get_value(); - //wy += vertical_adjustment.get_value(); GdkEvent event; event.type = GDK_BUTTON_RELEASE; @@ -2226,14 +2226,15 @@ Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) snap_to (where); begin_reversible_command (_("insert dragged region")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->add_region (RegionFactory::create (region), where, 1.0); - _session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } void -Editor::insert_route_list_drag (boost::shared_ptr route, int x, int y) { +Editor::insert_route_list_drag (boost::shared_ptr route, int x, int y) +{ double wx, wy; double cx, cy; nframes_t where; @@ -2241,7 +2242,7 @@ Editor::insert_route_list_drag (boost::shared_ptr route, int x, int y) { RouteTimeAxisView *source_rtv = 0; track_canvas->window_to_world (x, y, wx, wy); - wx += horizontal_adjustment.get_value(); + wx += horizontal_position (); wy += vertical_adjustment.get_value(); GdkEvent event; @@ -2304,9 +2305,9 @@ Editor::insert_region_list_selection (float times) } begin_reversible_command (_("insert region")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->add_region ((RegionFactory::create (region)), get_preferred_edit_position(), times); - _session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -2511,8 +2512,8 @@ Editor::rename_region() d.get_vbox()->set_border_width (12); d.get_vbox()->pack_start (hbox, false, false); - d.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); d.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + d.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); d.set_size_request (300, -1); d.set_position (Gtk::WIN_POS_MOUSE); @@ -2601,39 +2602,6 @@ Editor::audition_playlist_region_standalone (boost::shared_ptr region) _session->audition_region (region); } -void -Editor::build_interthread_progress_window () -{ - interthread_progress_window = new ArdourDialog (X_("interthread progress"), true); - - interthread_progress_bar.set_orientation (Gtk::PROGRESS_LEFT_TO_RIGHT); - - interthread_progress_window->set_border_width (12); - interthread_progress_window->get_vbox()->set_spacing (6); - - interthread_progress_label.set_alignment (0.5, 0.5); - - interthread_progress_window->get_vbox()->pack_start (interthread_progress_label, false, false); - interthread_progress_window->get_vbox()->pack_start (interthread_progress_bar,false, false); - - // GTK2FIX: this button needs a modifiable label - - Button* b = interthread_progress_window->add_button (Stock::CANCEL, RESPONSE_CANCEL); - b->signal_clicked().connect (sigc::mem_fun(*this, &Editor::interthread_cancel_clicked)); - - interthread_cancel_button.add (interthread_cancel_label); - - interthread_progress_window->set_default_size (200, 100); -} - -void -Editor::interthread_cancel_clicked () -{ - if (current_interthread_info) { - current_interthread_info->cancel = true; - } -} - void Editor::region_from_selection () { @@ -2667,11 +2635,11 @@ Editor::region_from_selection () } internal_start = start - current->position(); - _session->region_name (new_name, current->name(), true); + RegionFactory::region_name (new_name, current->name(), true); PropertyList plist; - plist.add (ARDOUR::Properties::start, internal_start); + plist.add (ARDOUR::Properties::start, current->start() + internal_start); plist.add (ARDOUR::Properties::length, selection_cnt); plist.add (ARDOUR::Properties::name, new_name); plist.add (ARDOUR::Properties::layer, 0); @@ -2707,11 +2675,11 @@ Editor::create_region_from_selection (vector >& new_re } internal_start = start - current->position(); - _session->region_name (new_name, current->name(), true); + RegionFactory::region_name (new_name, current->name(), true); PropertyList plist; - plist.add (ARDOUR::Properties::start, internal_start); + plist.add (ARDOUR::Properties::start, current->start() + internal_start); plist.add (ARDOUR::Properties::length, end - start + 1); plist.add (ARDOUR::Properties::name, new_name); @@ -2813,21 +2781,17 @@ Editor::separate_regions_between (const TimeSelection& ts) /* no edits to destructive tracks */ - if (rtv->track()->diskstream()->destructive()) { + if (rtv->track()->destructive()) { continue; } if ((playlist = rtv->playlist()) != 0) { - XMLNode *before; - bool got_some; - - before = &(playlist->get_state()); - got_some = false; + playlist->clear_history (); /* XXX need to consider musical time selections here at some point */ - double speed = rtv->get_diskstream()->speed(); + double speed = rtv->track()->speed(); for (list::const_iterator t = ts.begin(); t != ts.end(); ++t) { @@ -2843,25 +2807,18 @@ Editor::separate_regions_between (const TimeSelection& ts) if (!latest_regionviews.empty()) { - got_some = true; - rtv->view()->foreach_regionview (sigc::bind ( sigc::ptr_fun (add_if_covered), &(*t), &new_selection)); - + if (!in_command) { begin_reversible_command (_("separate")); in_command = true; } - _session->add_command(new MementoCommand( - *playlist, before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); } } - - if (!got_some) { - delete before; - } } } } @@ -2981,7 +2938,7 @@ Editor::crop_region_to (nframes64_t start, nframes64_t end) boost::shared_ptr t = rtv->track(); - if (t != 0 && ! t->diskstream()->destructive()) { + if (t != 0 && ! t->destructive()) { if ((playlist = rtv->playlist()) != 0) { playlists.push_back (playlist); @@ -3023,10 +2980,9 @@ Editor::crop_region_to (nframes64_t start, nframes64_t end) the_end = min (end, the_end); cnt = the_end - the_start + 1; - XMLNode &before = (*i)->get_state(); + region->clear_history (); region->trim_to (the_start, cnt, this); - XMLNode &after = (*i)->get_state(); - _session->add_command (new MementoCommand(*(*i), &before, &after)); + _session->add_command (new StatefulDiffCommand (region)); } commit_reversible_command (); @@ -3064,9 +3020,9 @@ Editor::region_fill_track () return; } - XMLNode &before = pl->get_state(); + pl->clear_history (); pl->add_region (RegionFactory::create (region), region->last_frame(), times); - _session->add_command (new MementoCommand(*pl, &before, &pl->get_state())); + _session->add_command (new StatefulDiffCommand (pl)); } commit_reversible_command (); @@ -3108,9 +3064,9 @@ Editor::region_fill_selection () continue; } - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->add_region (RegionFactory::create (region), start, times); - _session->add_command (new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command (new StatefulDiffCommand (playlist)); } commit_reversible_command (); @@ -3143,10 +3099,9 @@ Editor::set_sync_point (nframes64_t where, const RegionSelection& rs) in_command = true; } - XMLNode &before = region->playlist()->get_state(); + region->clear_history (); region->set_sync_position (where); - XMLNode &after = region->playlist()->get_state(); - _session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (region)); } if (in_command) { @@ -3169,10 +3124,9 @@ Editor::remove_region_sync () begin_reversible_command (_("remove sync")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - XMLNode &before = (*i)->region()->playlist()->get_state(); + (*i)->region()->clear_history (); (*i)->region()->clear_sync_position (); - XMLNode &after = (*i)->region()->playlist()->get_state(); - _session->add_command(new MementoCommand(*((*i)->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand ((*i)->region())); } commit_reversible_command (); } @@ -3291,10 +3245,9 @@ Editor::align_selection_relative (RegionPoint point, nframes64_t position, const /* move first one specially */ - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); r->set_position (pos, this); - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (r)); /* move rest by the same amount */ @@ -3304,16 +3257,15 @@ Editor::align_selection_relative (RegionPoint point, nframes64_t position, const boost::shared_ptr region ((*i)->region()); - XMLNode &before = region->playlist()->get_state(); + region->clear_history (); if (dir > 0) { region->set_position (region->position() + distance, this); } else { region->set_position (region->position() - distance, this); } - - XMLNode &after = region->playlist()->get_state(); - _session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); + + _session->add_command(new StatefulDiffCommand (region)); } @@ -3347,7 +3299,7 @@ Editor::align_region (boost::shared_ptr region, RegionPoint point, nfram void Editor::align_region_internal (boost::shared_ptr region, RegionPoint point, nframes64_t position) { - XMLNode &before = region->playlist()->get_state(); + region->clear_history (); switch (point) { case SyncPoint: @@ -3365,8 +3317,7 @@ Editor::align_region_internal (boost::shared_ptr region, RegionPoint poi break; } - XMLNode &after = region->playlist()->get_state(); - _session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (region)); } void @@ -3397,15 +3348,13 @@ Editor::trim_region (bool front) for (list::const_iterator i = rs.by_layer().begin(); i != rs.by_layer().end(); ++i) { if (!(*i)->region()->locked()) { - boost::shared_ptr pl = (*i)->region()->playlist(); - XMLNode &before = pl->get_state(); + (*i)->region()->clear_history (); if (front) { (*i)->region()->trim_front (where, this); } else { (*i)->region()->trim_end (where, this); } - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand ((*i)->region())); } } @@ -3461,18 +3410,16 @@ Editor::trim_region_to_location (const Location& loc, const char* str) nframes64_t start; nframes64_t end; - if (tav->get_diskstream() != 0) { - speed = tav->get_diskstream()->speed(); + if (tav->track() != 0) { + speed = tav->track()->speed(); } start = session_frame_to_track_frame (loc.start(), speed); end = session_frame_to_track_frame (loc.end(), speed); - - XMLNode &before = rv->region()->playlist()->get_state(); + + rv->region()->clear_history (); rv->region()->trim_to (start, (end - start), this); - XMLNode &after = rv->region()->playlist()->get_state(); - _session->add_command(new MementoCommand( - *(rv->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } commit_reversible_command (); @@ -3504,15 +3451,13 @@ Editor::trim_region_to_edit_point () float speed = 1.0; - if (tav->get_diskstream() != 0) { - speed = tav->get_diskstream()->speed(); + if (tav->track() != 0) { + speed = tav->track()->speed(); } - XMLNode &before = rv->region()->playlist()->get_state(); + rv->region()->clear_history (); rv->region()->trim_end (session_frame_to_track_frame(where, speed), this); - XMLNode &after = rv->region()->playlist()->get_state(); - _session->add_command(new MementoCommand( - *(rv->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } commit_reversible_command (); @@ -3544,15 +3489,13 @@ Editor::trim_region_from_edit_point () float speed = 1.0; - if (tav->get_diskstream() != 0) { - speed = tav->get_diskstream()->speed(); + if (tav->track() != 0) { + speed = tav->track()->speed(); } - XMLNode &before = rv->region()->playlist()->get_state(); + rv->region()->clear_history (); rv->region()->trim_front (session_frame_to_track_frame(where, speed), this); - XMLNode &after = rv->region()->playlist()->get_state(); - _session->add_command(new MementoCommand( - *(rv->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } commit_reversible_command (); @@ -3597,15 +3540,15 @@ Editor::trim_to_region(bool forward) float speed = 1.0; - if (atav->get_diskstream() != 0) { - speed = atav->get_diskstream()->speed(); + if (atav->track() != 0) { + speed = atav->track()->speed(); } boost::shared_ptr region = arv->region(); boost::shared_ptr playlist (region->playlist()); - XMLNode &before = playlist->get_state(); + region->clear_history (); if(forward){ @@ -3631,8 +3574,7 @@ Editor::trim_to_region(bool forward) arv->region_changed (ARDOUR::bounds_change); } - XMLNode &after = playlist->get_state(); - _session->add_command(new MementoCommand(*playlist, &before, &after)); + _session->add_command(new StatefulDiffCommand (region)); } commit_reversible_command (); @@ -3659,18 +3601,11 @@ Editor::_freeze_thread (void* arg) void* Editor::freeze_thread () { - clicked_routeview->audio_track()->freeze (*current_interthread_info); + clicked_routeview->audio_track()->freeze_me (*current_interthread_info); current_interthread_info->done = true; return 0; } -gint -Editor::freeze_progress_timeout (void */*arg*/) -{ - interthread_progress_bar.set_fraction (current_interthread_info->progress); - return !(current_interthread_info->done || current_interthread_info->cancel); -} - void Editor::freeze_route () { @@ -3679,25 +3614,9 @@ Editor::freeze_route () } InterThreadInfo itt; - - if (interthread_progress_window == 0) { - build_interthread_progress_window (); - } - - interthread_progress_window->set_title (_("Freeze")); - interthread_progress_window->set_position (Gtk::WIN_POS_MOUSE); - interthread_progress_window->show_all (); - interthread_progress_bar.set_fraction (0.0f); - interthread_progress_label.set_text (""); - interthread_cancel_label.set_text (_("Cancel Freeze")); current_interthread_info = &itt; - interthread_progress_connection = - Glib::signal_timeout().connect (sigc::bind (sigc::mem_fun(*this, &Editor::freeze_progress_timeout), (gpointer) 0), 100); - - itt.done = false; - itt.cancel = false; - itt.progress = 0.0f; + InterthreadProgressWindow ipw (current_interthread_info, _("Freeze"), _("Cancel Freeze")); pthread_create_and_store (X_("freezer"), &itt.thread, _freeze_thread, this); @@ -3707,8 +3626,6 @@ Editor::freeze_route () gtk_main_iteration (); } - interthread_progress_connection.disconnect (); - interthread_progress_window->hide_all (); current_interthread_info = 0; track_canvas->get_window()->set_cursor (*current_canvas_cursor); } @@ -3744,11 +3661,9 @@ Editor::bounce_range_selection (bool replace, bool enable_processing) InterThreadInfo itt; - itt.done = false; - itt.cancel = false; - itt.progress = false; - - XMLNode &before = playlist->get_state(); + playlist->clear_history (); + playlist->clear_owned_history (); + boost::shared_ptr r = rtv->track()->bounce_range (start, start+cnt, itt, enable_processing); if (replace) { @@ -3758,8 +3673,13 @@ Editor::bounce_range_selection (bool replace, bool enable_processing) playlist->add_region (r, start); } - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand (*playlist, &before, &after)); + vector cmds; + playlist->rdiff (cmds); + for (vector::iterator j = cmds.begin(); j != cmds.end(); ++j) { + _session->add_command (*j); + } + + _session->add_command (new StatefulDiffCommand (playlist)); } commit_reversible_command (); @@ -3853,7 +3773,7 @@ Editor::cut_copy (CutCopyOp op) Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::really_remove_marker), loc)); } - _drags->break_drag (); + _drags->abort (); return; } @@ -3934,7 +3854,7 @@ Editor::cut_copy (CutCopyOp op) } if (op == Cut || op == Clear) { - _drags->break_drag (); + _drags->abort (); } } @@ -3966,17 +3886,6 @@ Editor::cut_copy_midi (CutCopyOp op) } } -struct PlaylistState { - boost::shared_ptr playlist; - XMLNode* before; -}; - -struct lt_playlist { - bool operator () (const PlaylistState& a, const PlaylistState& b) { - return a.playlist < b.playlist; - } -}; - struct PlaylistMapping { TimeAxisView* tv; boost::shared_ptr pl; @@ -3995,10 +3904,9 @@ Editor::remove_clicked_region () boost::shared_ptr playlist = clicked_routeview->playlist(); begin_reversible_command (_("remove region")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->remove_region (clicked_regionview->region()); - XMLNode &after = playlist->get_state(); - _session->add_command(new MementoCommand(*playlist, &before, &after)); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -4035,7 +3943,7 @@ Editor::remove_selected_regions () regions_to_remove.push_back ((*i)->region()); } - vector playlists; + vector > playlists; for (list >::iterator rl = regions_to_remove.begin(); rl != regions_to_remove.end(); ++rl) { @@ -4046,33 +3954,31 @@ Editor::remove_selected_regions () continue; } - vector::iterator i; + vector >::iterator i; - //only take state if this is a new playlist. + //only prep history if this is a new playlist. for (i = playlists.begin(); i != playlists.end(); ++i) { - if ((*i).playlist == playlist) { + if ((*i) == playlist) { break; } } if (i == playlists.end()) { - PlaylistState before; - before.playlist = playlist; - before.before = &playlist->get_state(); - + playlist->clear_history (); playlist->freeze (); - playlists.push_back(before); + + playlists.push_back (playlist); } playlist->remove_region (*rl); } - vector::iterator pl; + vector >::iterator pl; for (pl = playlists.begin(); pl != playlists.end(); ++pl) { - (*pl).playlist->thaw (); - _session->add_command(new MementoCommand(*(*pl).playlist, (*pl).before, &(*pl).playlist->get_state())); + (*pl)->thaw (); + _session->add_command(new StatefulDiffCommand (*pl)); } commit_reversible_command (); @@ -4092,8 +3998,8 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) nframes64_t first_position = max_frames; - set freezelist; - pair::iterator,bool> insert_result; + typedef set > FreezeList; + FreezeList freezelist; /* get ordering correct before we cut/copy */ @@ -4107,21 +4013,19 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) boost::shared_ptr pl = (*x)->region()->playlist(); if (pl) { - set::iterator fl; + FreezeList::iterator fl; //only take state if this is a new playlist. for (fl = freezelist.begin(); fl != freezelist.end(); ++fl) { - if ((*fl).playlist == pl) { + if ((*fl) == pl) { break; } } if (fl == freezelist.end()) { - PlaylistState before; - before.playlist = pl; - before.before = &pl->get_state(); + pl->clear_history(); pl->freeze (); - insert_result = freezelist.insert (before); + freezelist.insert (pl); } } } @@ -4212,10 +4116,10 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) if (!foo.empty()) { cut_buffer->set (foo); } - - for (set::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) { - (*pl).playlist->thaw (); - _session->add_command (new MementoCommand(*(*pl).playlist, (*pl).before, &(*pl).playlist->get_state())); + + for (FreezeList::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) { + (*pl)->thaw (); + _session->add_command (new StatefulDiffCommand (*pl)); } } @@ -4352,9 +4256,9 @@ Editor::duplicate_some_regions (RegionSelection& regions, float times) sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view)); playlist = (*i)->region()->playlist(); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->duplicate (r, end_frame + (r->first_frame() - start_frame) + 1, times); - _session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); c.disconnect (); @@ -4393,10 +4297,9 @@ Editor::duplicate_selection (float times) if ((playlist = (*i)->playlist()) == 0) { continue; } - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->duplicate (*ri, selection->time[clicked_selection].end, times); - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand(*playlist, &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist)); ++ri; if (ri == new_regions.end()) { @@ -4440,10 +4343,9 @@ void Editor::clear_playlist (boost::shared_ptr playlist) { begin_reversible_command (_("clear playlist")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->clear (); - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand(*playlist.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -4477,10 +4379,20 @@ Editor::nudge_track (bool use_edit, bool forwards) continue; } - XMLNode &before = playlist->get_state(); + playlist->clear_history (); + playlist->clear_owned_history (); + playlist->nudge_after (start, distance, forwards); - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand(*playlist, &before, &after)); + + vector cmds; + + playlist->rdiff (cmds); + + for (vector::iterator c = cmds.begin(); c != cmds.end(); ++c) { + _session->add_command (*c); + } + + _session->add_command (new StatefulDiffCommand (playlist)); } commit_reversible_command (); @@ -4530,6 +4442,8 @@ Editor::normalize_region () Dialog dialog (rs.size() > 1 ? _("Normalize regions") : _("Normalize region")); HBox hbox; + hbox.set_spacing (6); + hbox.set_border_width (6); hbox.pack_start (*manage (new Label (_("Normalize to:")))); SpinButton spin (0.2, 2); spin.set_range (-112, 0); @@ -4539,6 +4453,7 @@ Editor::normalize_region () spin.set_value (_last_normalization_value); hbox.pack_start (*manage (new Label (_("dbFS")))); hbox.show_all (); + dialog.get_vbox()->set_spacing (12); dialog.get_vbox()->pack_start (hbox); dialog.add_button (Stock::CANCEL, RESPONSE_CANCEL); dialog.add_button (_("Normalize"), RESPONSE_ACCEPT); @@ -4556,9 +4471,10 @@ Editor::normalize_region () AudioRegionView* const arv = dynamic_cast(*r); if (!arv) continue; - XMLNode &before = arv->region()->get_state(); + arv->region()->clear_history (); arv->audio_region()->normalize_to (spin.get_value()); - _session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); + _session->add_command (new StatefulDiffCommand (arv->region())); + } commit_reversible_command (); @@ -4589,9 +4505,9 @@ Editor::reset_region_scale_amplitude () AudioRegionView* const arv = dynamic_cast(*r); if (!arv) continue; - XMLNode &before = arv->region()->get_state(); + arv->region()->clear_history (); arv->audio_region()->set_scale_amplitude (1.0f); - _session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); + _session->add_command (new StatefulDiffCommand (arv->region())); } commit_reversible_command (); @@ -4616,10 +4532,12 @@ Editor::adjust_region_scale_amplitude (bool up) for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { AudioRegionView* const arv = dynamic_cast(*r); - if (!arv) + if (!arv) { continue; - XMLNode &before = arv->region()->get_state(); + } + arv->region()->clear_history (); + double fraction = gain_to_slider_position (arv->audio_region()->scale_amplitude ()); if (up) { @@ -4641,7 +4559,7 @@ Editor::adjust_region_scale_amplitude (bool up) } arv->audio_region()->set_scale_amplitude (fraction); - _session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); + _session->add_command (new StatefulDiffCommand (arv->region())); } commit_reversible_command (); @@ -4682,7 +4600,7 @@ Editor::strip_region_silence () } } - StripSilenceDialog d (ar); + StripSilenceDialog d (_session, ar); int const r = d.run (); if (r == Gtk::RESPONSE_OK) { @@ -4695,7 +4613,7 @@ Command* Editor::apply_midi_note_edit_op_to_region (MidiOperator& op, MidiRegionView& mrv) { Evoral::Sequence::Notes selected; - mrv.selection_as_notelist (selected); + mrv.selection_as_notelist (selected, true); vector::Notes> v; v.push_back (selected); @@ -4738,6 +4656,47 @@ Editor::apply_midi_note_edit_op (MidiOperator& op) rs.clear (); } +void +Editor::fork_region () +{ + RegionSelection rs; + + get_regions_for_action (rs); + + if (rs.empty()) { + return; + } + + begin_reversible_command (_("Fork Region(s)")); + + track_canvas->get_window()->set_cursor (*wait_cursor); + gdk_flush (); + + for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ) { + RegionSelection::iterator tmp = r; + ++tmp; + + MidiRegionView* const mrv = dynamic_cast(*r); + + if (mrv) { + boost::shared_ptr playlist = mrv->region()->playlist(); + boost::shared_ptr newregion = mrv->midi_region()->clone (); + + playlist->clear_history (); + cerr << "Replace region with " << newregion->name() << endl; + playlist->replace_region (mrv->region(), newregion, mrv->region()->position()); + _session->add_command(new StatefulDiffCommand (playlist)); + } + + r = tmp; + } + + commit_reversible_command (); + rs.clear (); + + track_canvas->get_window()->set_cursor (*current_canvas_cursor); +} + void Editor::quantize_region () { @@ -4787,8 +4746,8 @@ Editor::apply_filter (Filter& filter, string command) if (arv->audio_region()->apply (filter) == 0) { - XMLNode &before = playlist->get_state(); - + playlist->clear_history (); + if (filter.results.empty ()) { /* no regions returned; remove the old one */ @@ -4810,8 +4769,7 @@ Editor::apply_filter (Filter& filter, string command) } - XMLNode &after = playlist->get_state(); - _session->add_command(new MementoCommand(*playlist, &before, &after)); + _session->add_command(new StatefulDiffCommand (playlist)); } else { goto out; } @@ -4883,7 +4841,7 @@ Editor::brush (nframes64_t pos) void Editor::reset_region_gain_envelopes () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id); + RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); if (!_session || rs.empty()) { return; @@ -4908,7 +4866,7 @@ Editor::reset_region_gain_envelopes () void Editor::toggle_gain_envelope_visibility () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id); + RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); if (!_session || rs.empty()) { return; @@ -4919,10 +4877,9 @@ Editor::toggle_gain_envelope_visibility () for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { AudioRegionView* const arv = dynamic_cast(*i); if (arv) { - XMLNode &before = arv->region()->get_state (); + arv->region()->clear_history (); arv->set_envelope_visible (!arv->envelope_visible()); - XMLNode &after = arv->region()->get_state (); - _session->add_command (new MementoCommand (*(arv->region().get()), &before, &after)); + _session->add_command (new StatefulDiffCommand (arv->region())); } } @@ -4932,7 +4889,7 @@ Editor::toggle_gain_envelope_visibility () void Editor::toggle_gain_envelope_active () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id); + RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); if (!_session || rs.empty()) { return; @@ -4955,7 +4912,7 @@ Editor::toggle_gain_envelope_active () void Editor::toggle_region_lock () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id); + RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); if (!_session || rs.empty()) { return; @@ -4973,9 +4930,9 @@ Editor::toggle_region_lock () } void -Editor::set_region_lock_style (Region::PositionLockStyle ps) +Editor::toggle_region_lock_style () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id); + RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); if (!_session || rs.empty()) { return; @@ -4984,10 +4941,10 @@ Editor::set_region_lock_style (Region::PositionLockStyle ps) _session->begin_reversible_command (_("region lock style")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - XMLNode &before = (*i)->region()->get_state (); - (*i)->region()->set_position_lock_style (ps); - XMLNode &after = (*i)->region()->get_state (); - _session->add_command (new MementoCommand (*((*i)->region().get()), &before, &after)); + (*i)->region()->clear_history (); + Region::PositionLockStyle const ns = (*i)->region()->positional_lock_style() == Region::AudioTime ? Region::MusicTime : Region::AudioTime; + (*i)->region()->set_position_lock_style (ns); + _session->add_command (new StatefulDiffCommand ((*i)->region())); } _session->commit_reversible_command (); @@ -4997,7 +4954,7 @@ Editor::set_region_lock_style (Region::PositionLockStyle ps) void Editor::toggle_region_mute () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id); + RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); if (!_session || rs.empty()) { return; @@ -5017,7 +4974,7 @@ Editor::toggle_region_mute () void Editor::toggle_region_opaque () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id); + RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); if (!_session || rs.empty()) { return; @@ -5073,7 +5030,7 @@ Editor::set_fade_length (bool in) nframes64_t pos = get_preferred_edit_position(); nframes64_t len; - char* cmd; + char const * cmd; if (pos > rv->region()->last_frame() || pos < rv->region()->first_frame()) { /* edit point is outside the relevant region */ @@ -5166,14 +5123,15 @@ Editor::toggle_fade_active (bool in) have_switch = true; } - XMLNode &before = region->get_state(); + region->clear_history (); + if (in) { region->set_fade_in_active (!yn); } else { region->set_fade_out_active (!yn); } - XMLNode &after = region->get_state(); - _session->add_command(new MementoCommand(*region.get(), &before, &after)); + + _session->add_command(new StatefulDiffCommand (region)); } commit_reversible_command (); @@ -5266,13 +5224,10 @@ Editor::set_fade_in_active (bool yn) boost::shared_ptr ar (tmp->audio_region()); - - XMLNode &before = ar->get_state(); - + + ar->clear_history (); ar->set_fade_in_active (yn); - - XMLNode &after = ar->get_state(); - _session->add_command(new MementoCommand(*ar, &before, &after)); + _session->add_command (new StatefulDiffCommand (ar)); } commit_reversible_command (); @@ -5300,12 +5255,9 @@ Editor::set_fade_out_active (bool yn) boost::shared_ptr ar (tmp->audio_region()); - XMLNode &before = ar->get_state(); - + ar->clear_history (); ar->set_fade_out_active (yn); - - XMLNode &after = ar->get_state(); - _session->add_command(new MementoCommand(*ar, &before, &after)); + _session->add_command(new StatefulDiffCommand (ar)); } commit_reversible_command (); @@ -5926,7 +5878,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList nframes64_t pos = r->position(); - XMLNode& before (pl->get_state()); + pl->clear_history (); x = positions.begin(); @@ -5966,7 +5918,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList string new_name; - if (_session->region_name (new_name, r->name())) { + if (RegionFactory::region_name (new_name, r->name())) { break; } @@ -6008,9 +5960,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList pl->thaw (); - XMLNode& after (pl->get_state()); - - _session->add_command (new MementoCommand(*pl, &before, &after)); + _session->add_command (new StatefulDiffCommand (pl)); } void @@ -6031,9 +5981,9 @@ Editor::tab_to_transient (bool forward) RouteTimeAxisView* rtv = dynamic_cast (*t); if (rtv) { - boost::shared_ptr ds = rtv->get_diskstream(); - if (ds) { - boost::shared_ptr pl = rtv->get_diskstream()->playlist (); + boost::shared_ptr tr = rtv->track(); + if (tr) { + boost::shared_ptr pl = tr->playlist (); if (pl) { nframes64_t result = pl->find_next_transient (pos, forward ? 1 : -1); @@ -6115,7 +6065,7 @@ Editor::playhead_backward_to_grid () } void -Editor::set_track_height (uint32_t h) +Editor::set_track_height (Height h) { TrackSelection& ts (selection->tracks); @@ -6296,7 +6246,8 @@ Editor::do_insert_time () return; } - InsertTimeOption opt; + /* only setting this to keep GCC quiet */ + InsertTimeOption opt = LeaveIntersected; switch (intersected_combo.get_active_row_number ()) { case 0: @@ -6331,7 +6282,8 @@ Editor::insert_time (nframes64_t pos, nframes64_t frames, InsertTimeOption opt, if (pl) { - XMLNode &before = pl->get_state(); + pl->clear_history (); + pl->clear_owned_history (); if (opt == SplitIntersected) { pl->split (pos); @@ -6339,9 +6291,17 @@ Editor::insert_time (nframes64_t pos, nframes64_t frames, InsertTimeOption opt, pl->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue); - XMLNode &after = pl->get_state(); - - _session->add_command (new MementoCommand (*pl, &before, &after)); + vector cmds; + + pl->rdiff (cmds); + + cerr << "Shift generated " << cmds.size() << " sdc's\n"; + + for (vector::iterator c = cmds.begin(); c != cmds.end(); ++c) { + _session->add_command (*c); + } + + _session->add_command (new StatefulDiffCommand (pl)); commit = true; } @@ -6414,7 +6374,7 @@ Editor::fit_tracks (TrackViewList & tracks) uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / tracks.size()); double first_y_pos = DBL_MAX; - if (h < TimeAxisView::hSmall) { + if (h < TimeAxisView::preset_height (HeightSmall)) { MessageDialog msg (*this, _("There are too many tracks to fit in the current window")); /* too small to be displayed */ return; @@ -6446,7 +6406,7 @@ Editor::fit_tracks (TrackViewList & tracks) first_y_pos = std::min ((*t)->y_position (), first_y_pos); } else { if (prev_was_selected && next_is_selected) { - hide_track_in_display (**t); + hide_track_in_display (*t); } }