X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_ops.cc;h=a2f8048fec8931a09b8efd994326aa1d3c27981d;hb=f250d16487ba747be0276ebd15b240ddd07da132;hp=4882ac1fc39e836bba6d1ff25c328dfd7f2886a7;hpb=c52cb37bf2abc7f8e6912f59c79af060e60f4640;p=ardour.git diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 4882ac1fc3..a2f8048fec 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -133,7 +133,11 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) { bool frozen = false; - list > used_playlists; + RegionSelection pre_selected_regions = selection->regions; + bool working_on_selection = !pre_selected_regions.empty(); + + list > used_playlists; + list used_trackviews; if (regions.empty()) { return; @@ -188,9 +192,16 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) /* remember used playlists so we can thaw them later */ used_playlists.push_back(pl); + + TimeAxisView& tv = (*a)->get_time_axis_view(); + RouteTimeAxisView* rtv = dynamic_cast (&tv); + if (rtv) { + used_trackviews.push_back (rtv); + } pl->freeze(); } + if (pl) { pl->clear_changes (); pl->split_region ((*a)->region(), where); @@ -200,17 +211,38 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) a = tmp; } + vector region_added_connections; + + for (list::iterator i = used_trackviews.begin(); i != used_trackviews.end(); ++i) { + region_added_connections.push_back ((*i)->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view))); + } + + latest_regionviews.clear (); + while (used_playlists.size() > 0) { list >::iterator i = used_playlists.begin(); (*i)->thaw(); used_playlists.pop_front(); } + for (vector::iterator c = region_added_connections.begin(); c != region_added_connections.end(); ++c) { + (*c).disconnect (); + } + commit_reversible_command (); if (frozen){ EditorThaw(); /* Emit Signal */ } + + //IFF we were working on selected regions, try to reinstate the other region selections that existed before the freeze/thaw. + _ignore_follow_edits = true; //a split will change the region selection in mysterious ways; its not practical or wanted to follow this edit + if( working_on_selection ) { + selection->add ( pre_selected_regions ); + selection->add (latest_regionviews); //these are the new regions created after the split + } + _ignore_follow_edits = false; + } /** Move one extreme of the current range selection. If more than one range is selected, @@ -1448,38 +1480,6 @@ Editor::tav_zoom_smooth (bool coarser, bool force_all) } } -bool -Editor::clamp_samples_per_pixel (framecnt_t& fpp) const -{ - bool clamped = false; - - if (fpp < 1) { - fpp = 1; - clamped = true; - } - - framecnt_t sr; - - if (_session) { - sr = _session->frame_rate (); - } else { - sr = 48000; - } - - const framecnt_t three_days = 3 * 24 * 60 * 60 * sr; - const framecnt_t lots_of_pixels = 4000; - - /* if the zoom level is greater than what you'd get trying to display 3 - * days of audio on a really big screen, scale it down. - */ - - if (fpp * lots_of_pixels > three_days) { - fpp = three_days / _track_canvas->width(); - clamped = true; - } - - return clamped; -} void Editor::temporal_zoom_step (bool coarser) @@ -1516,7 +1516,6 @@ Editor::temporal_zoom (framecnt_t fpp) framecnt_t nfpp; double l; - clamp_samples_per_pixel (fpp); if (fpp == samples_per_pixel) { return; } @@ -1806,8 +1805,7 @@ Editor::temporal_zoom_to_frame (bool coarser, framepos_t frame) new_spp = samples_per_pixel - (samples_per_pixel/2); } else { /* could bail out here since we cannot zoom any finer, - but leave that to the clamp_samples_per_pixel() and - equality test below + but leave that to the equality test below */ new_spp = samples_per_pixel; } @@ -1815,8 +1813,6 @@ Editor::temporal_zoom_to_frame (bool coarser, framepos_t frame) range_before -= range_before/2; } - clamp_samples_per_pixel (new_spp); - if (new_spp == samples_per_pixel) { return; } @@ -1928,6 +1924,35 @@ Editor::add_location_from_playhead_cursor () add_location_mark (_session->audible_frame()); } +void +Editor::remove_location_at_playhead_cursor () +{ + if (_session) { + + //set up for undo + _session->begin_reversible_command (_("remove marker")); + XMLNode &before = _session->locations()->get_state(); + bool removed = false; + + //find location(s) at this time + Locations::LocationList locs; + _session->locations()->find_all_between (_session->audible_frame(), _session->audible_frame()+1, locs, Location::Flags(0)); + for (Locations::LocationList::iterator i = locs.begin(); i != locs.end(); ++i) { + if ((*i)->is_mark()) { + _session->locations()->remove (*i); + removed = true; + } + } + + //store undo + if (removed) { + XMLNode &after = _session->locations()->get_state(); + _session->add_command(new MementoCommand(*(_session->locations()), &before, &after)); + _session->commit_reversible_command (); + } + } +} + /** Add a range marker around each selected region */ void Editor::add_locations_from_region () @@ -2110,6 +2135,8 @@ Editor::unhide_ranges () } } +/* INSERT/REPLACE */ + void Editor::insert_region_list_selection (float times) { @@ -2142,6 +2169,9 @@ Editor::insert_region_list_selection (float times) begin_reversible_command (_("insert region")); playlist->clear_changes (); playlist->add_region ((RegionFactory::create (region, true)), get_preferred_edit_position(), times); + if (Config->get_edit_mode() == Ripple) + playlist->ripple (get_preferred_edit_position(), region->length() * times, boost::shared_ptr()); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -2244,7 +2274,7 @@ Editor::get_preroll () void Editor::maybe_locate_with_edit_preroll ( framepos_t location ) { - if ( _session->transport_rolling() || !Config->get_always_play_range() ) + if ( _session->transport_rolling() || !Config->get_follow_edits() || _ignore_follow_edits ) return; location -= get_preroll(); @@ -2765,8 +2795,7 @@ Editor::separate_regions_between (const TimeSelection& ts) } if (in_command) { - selection->set (new_selection); - set_mouse_mode (MouseObject); +// selection->set (new_selection); commit_reversible_command (); } @@ -3703,30 +3732,15 @@ Editor::copy () bool Editor::can_cut_copy () const { - switch (effective_mouse_mode()) { - - case MouseObject: - if (!selection->regions.empty() || !selection->points.empty()) { - return true; - } - break; - - case MouseRange: - if (!selection->time.empty()) { - return true; - } - break; - - default: - break; - } + if (!selection->time.empty() || !selection->regions.empty() || !selection->points.empty()) + return true; return false; } /** Cut, copy or clear selected regions, automation points or a time range. - * @param op Operation (Cut, Copy or Clear) + * @param op Operation (Delete, Cut, Copy or Clear) */ void Editor::cut_copy (CutCopyOp op) @@ -3762,7 +3776,7 @@ Editor::cut_copy (CutCopyOp op) } } - if ( op != Clear ) //"Delete" doesn't change copy/paste buf + if ( op != Delete ) //"Delete" doesn't change copy/paste buf cut_buffer->clear (); if (entered_marker) { @@ -3798,77 +3812,60 @@ Editor::cut_copy (CutCopyOp op) bool did_edit = false; - switch (effective_mouse_mode()) { - case MouseGain: - if (!selection->points.empty()) { - begin_reversible_command (opname + _(" points")); - did_edit = true; - cut_copy_points (op); - if (op == Cut || op == Delete) { - selection->clear_points (); - } + if (!selection->points.empty()) { + begin_reversible_command (opname + _(" points")); + did_edit = true; + cut_copy_points (op); + if (op == Cut || op == Delete) { + selection->clear_points (); } - break; - - case MouseObject: - - if (!selection->regions.empty() || !selection->points.empty()) { + } else if (!selection->regions.empty() || !selection->points.empty()) { - string thing_name; + string thing_name; - if (selection->regions.empty()) { - thing_name = _("points"); - } else if (selection->points.empty()) { - thing_name = _("regions"); - } else { - thing_name = _("objects"); - } - - begin_reversible_command (opname + ' ' + thing_name); - did_edit = true; + if (selection->regions.empty()) { + thing_name = _("points"); + } else if (selection->points.empty()) { + thing_name = _("regions"); + } else { + thing_name = _("objects"); + } + + begin_reversible_command (opname + ' ' + thing_name); + did_edit = true; - if (!selection->regions.empty()) { - cut_copy_regions (op, selection->regions); - - if (op == Cut || op == Delete) { - selection->clear_regions (); - } - } - - if (!selection->points.empty()) { - cut_copy_points (op); - - if (op == Cut || op == Delete) { - selection->clear_points (); - } - } - } - break; + if (!selection->regions.empty()) { + cut_copy_regions (op, selection->regions); - case MouseRange: - if (selection->time.empty()) { - framepos_t start, end; - /* no time selection, see if we can get an edit range - and use that. - */ - if (get_edit_op_range (start, end)) { - selection->set (start, end); + if (op == Cut || op == Delete) { + selection->clear_regions (); } } - if (!selection->time.empty()) { - begin_reversible_command (opname + _(" range")); - - did_edit = true; - cut_copy_ranges (op); + + if (!selection->points.empty()) { + cut_copy_points (op); if (op == Cut || op == Delete) { - selection->clear_time (); + selection->clear_points (); } } - break; + } else if (selection->time.empty()) { + framepos_t start, end; + /* no time selection, see if we can get an edit range + and use that. + */ + if (get_edit_op_range (start, end)) { + selection->set (start, end); + } + } else if (!selection->time.empty()) { + begin_reversible_command (opname + _(" range")); + + did_edit = true; + cut_copy_ranges (op); - default: - break; + if (op == Cut || op == Delete) { + selection->clear_time (); + } } if (did_edit) { @@ -4002,10 +3999,11 @@ Editor::remove_clicked_region () boost::shared_ptr playlist = clicked_routeview->playlist(); - begin_reversible_command (_("remove region")); playlist->clear_changes (); playlist->clear_owned_changes (); playlist->remove_region (clicked_regionview->region()); + if (Config->get_edit_mode() == Ripple) + playlist->ripple (clicked_regionview->region()->position(), -clicked_regionview->region()->length(), boost::shared_ptr()); /* We might have removed regions, which alters other regions' layering_index, so we need to do a recursive diff here. @@ -4068,6 +4066,9 @@ Editor::remove_selected_regions () playlist->clear_owned_changes (); playlist->freeze (); playlist->remove_region (*rl); + if (Config->get_edit_mode() == Ripple) + playlist->ripple ((*rl)->position(), -(*rl)->length(), boost::shared_ptr()); + } vector >::iterator pl; @@ -4197,12 +4198,16 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) switch (op) { case Delete: pl->remove_region (r); + if (Config->get_edit_mode() == Ripple) + pl->ripple (r->position(), -r->length(), boost::shared_ptr()); break; case Cut: _xx = RegionFactory::create (r); npl->add_region (_xx, r->position() - first_position); pl->remove_region (r); + if (Config->get_edit_mode() == Ripple) + pl->ripple (r->position(), -r->length(), boost::shared_ptr()); break; case Copy: @@ -4211,7 +4216,9 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) break; case Clear: - pl->remove_region (r); + pl->remove_region (r); + if (Config->get_edit_mode() == Ripple) + pl->ripple (r->position(), -r->length(), boost::shared_ptr()); break; } @@ -5556,7 +5563,7 @@ Editor::set_playhead_cursor () } } - if ( Config->get_always_play_range() ) + if ( Config->get_follow_edits() ) cancel_time_selection(); } @@ -7041,3 +7048,39 @@ Editor::unlock () start_lock_event_timing (); } } + +void +Editor::bring_in_callback (Gtk::Label* label, uint32_t n, uint32_t total, string name) +{ + Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&Editor::update_bring_in_message, this, label, n, total, name)); +} + +void +Editor::update_bring_in_message (Gtk::Label* label, uint32_t n, uint32_t total, string name) +{ + label->set_text (string_compose ("Copying %1, %2 of %3", name, n, total)); + Gtkmm2ext::UI::instance()->flush_pending (); +} + +void +Editor::bring_all_sources_into_session () +{ + if (!_session) { + return; + } + + Gtk::Label msg; + ArdourDialog w (_("Moving embedded files into session folder")); + w.get_vbox()->pack_start (msg); + w.present (); + + /* flush all pending GUI events because we're about to start copying + * files + */ + + Gtkmm2ext::UI::instance()->flush_pending (); + + cerr << " Do it\n"; + + _session->bring_all_sources_into_session (boost::bind (&Editor::bring_in_callback, this, &msg, _1, _2, _3)); +}