summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_ops.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor_ops.cc')
-rw-r--r--gtk2_ardour/editor_ops.cc580
1 files changed, 374 insertions, 206 deletions
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index ea9f059fae..bcf1af444f 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -111,6 +111,9 @@ Editor::split_region ()
void
Editor::split_region_at (nframes_t where)
{
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
split_regions_at (where, selection->regions);
}
@@ -364,14 +367,17 @@ Editor::nudge_forward (bool next, bool force_playhead)
{
nframes_t distance;
nframes_t next_distance;
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
if (!session) return;
- if (!force_playhead && !selection->regions.empty()) {
+ if (!force_playhead && !rs.empty()) {
begin_reversible_command (_("nudge regions forward"));
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
boost::shared_ptr<Region> r ((*i)->region());
distance = get_nudge_distance (r->position(), next_distance);
@@ -437,14 +443,17 @@ Editor::nudge_backward (bool next, bool force_playhead)
{
nframes_t distance;
nframes_t next_distance;
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
if (!session) return;
- if (!force_playhead && !selection->regions.empty()) {
+ if (!force_playhead && !rs.empty()) {
begin_reversible_command (_("nudge regions backward"));
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
boost::shared_ptr<Region> r ((*i)->region());
distance = get_nudge_distance (r->position(), next_distance);
@@ -520,16 +529,19 @@ void
Editor::nudge_forward_capture_offset ()
{
nframes_t distance;
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
if (!session) return;
- if (!selection->regions.empty()) {
+ if (!rs.empty()) {
begin_reversible_command (_("nudge forward"));
distance = session->worst_output_latency();
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
boost::shared_ptr<Region> r ((*i)->region());
XMLNode &before = r->playlist()->get_state();
@@ -547,16 +559,19 @@ void
Editor::nudge_backward_capture_offset ()
{
nframes_t distance;
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
if (!session) return;
- if (!selection->regions.empty()) {
+ if (!rs.empty()) {
begin_reversible_command (_("nudge forward"));
distance = session->worst_output_latency();
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
boost::shared_ptr<Region> r ((*i)->region());
XMLNode &before = r->playlist()->get_state();
@@ -931,10 +946,14 @@ void
Editor::cursor_to_selection_start (Cursor *cursor)
{
nframes_t pos = 0;
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
switch (mouse_mode) {
case MouseObject:
- if (!selection->regions.empty()) {
- pos = selection->regions.start();
+ if (!rs.empty()) {
+ pos = rs.start();
}
break;
@@ -959,11 +978,14 @@ void
Editor::cursor_to_selection_end (Cursor *cursor)
{
nframes_t pos = 0;
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
switch (mouse_mode) {
case MouseObject:
- if (!selection->regions.empty()) {
- pos = selection->regions.end_frame();
+ if (!rs.empty()) {
+ pos = rs.end_frame();
}
break;
@@ -1137,10 +1159,14 @@ Editor::selected_marker_to_selection_start ()
return;
}
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
switch (mouse_mode) {
case MouseObject:
- if (!selection->regions.empty()) {
- pos = selection->regions.start();
+ if (!rs.empty()) {
+ pos = rs.start();
}
break;
@@ -1172,10 +1198,14 @@ Editor::selected_marker_to_selection_end ()
return;
}
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
switch (mouse_mode) {
case MouseObject:
- if (!selection->regions.empty()) {
- pos = selection->regions.end_frame();
+ if (!rs.empty()) {
+ pos = rs.end_frame();
}
break;
@@ -1656,14 +1686,15 @@ Editor::temporal_zoom_region ()
nframes64_t start = max_frames;
nframes64_t end = 0;
+ RegionSelection rs;
- ensure_entered_region_selected (true);
+ get_regions_for_action (rs);
- if (selection->regions.empty()) {
+ if (rs.empty()) {
return;
}
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
if ((*i)->region()->position() < start) {
start = (*i)->region()->position();
}
@@ -1853,11 +1884,15 @@ Editor::add_location_from_playhead_cursor ()
void
Editor::add_location_from_audio_region ()
{
- if (selection->regions.empty()) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
- RegionView* rv = *(selection->regions.begin());
+ RegionView* rv = *(rs.begin());
boost::shared_ptr<Region> region = rv->region();
Location *location = new Location (region->position(), region->last_frame(), region->name(), Location::IsRangeMarker);
@@ -2301,8 +2336,12 @@ Editor::play_selection ()
void
Editor::loop_selected_region ()
{
- if (!selection->regions.empty()) {
- RegionView *rv = *(selection->regions.begin());
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (!rs.empty()) {
+ RegionView *rv = *(rs.begin());
Location* tll;
if ((tll = transport_loop_location()) != 0) {
@@ -2380,7 +2419,11 @@ Editor::edit_region ()
void
Editor::rename_region()
{
- if (selection->regions.empty()) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
@@ -2405,7 +2448,7 @@ Editor::rename_region()
d.set_size_request (300, -1);
d.set_position (Gtk::WIN_POS_MOUSE);
- entry.set_text (selection->regions.front()->region()->name());
+ entry.set_text (rs.front()->region()->name());
entry.select_region (0, -1);
entry.signal_activate().connect (bind (mem_fun (d, &Dialog::response), RESPONSE_OK));
@@ -2422,7 +2465,7 @@ Editor::rename_region()
std::string str = entry.get_text();
strip_whitespace_edges (str);
if (!str.empty()) {
- selection->regions.front()->region()->set_name (str);
+ rs.front()->region()->set_name (str);
redisplay_regions ();
}
}
@@ -2463,14 +2506,15 @@ Editor::play_selected_region ()
{
nframes64_t start = max_frames;
nframes64_t end = 0;
+ RegionSelection rs;
- ExclusiveRegionSelection esr (*this, entered_regionview);
-
- if (selection->regions.empty()) {
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
if ((*i)->region()->position() < start) {
start = (*i)->region()->position();
}
@@ -2560,7 +2604,7 @@ Editor::region_from_selection ()
}
void
-Editor::create_region_from_selection (vector<boost::shared_ptr<AudioRegion> >& new_regions)
+Editor::create_region_from_selection (vector<boost::shared_ptr<Region> >& new_regions)
{
if (selection->time.empty() || selection->tracks.empty()) {
return;
@@ -2601,13 +2645,17 @@ Editor::create_region_from_selection (vector<boost::shared_ptr<AudioRegion> >& n
void
Editor::split_multichannel_region ()
{
- if (selection->regions.empty()) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
vector<boost::shared_ptr<AudioRegion> > v;
- for (list<RegionView*>::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ for (list<RegionView*>::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*>(*x);
@@ -2649,7 +2697,11 @@ Editor::separate_regions_between (const TimeSelection& ts)
/* use tracks with selected regions */
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
TimeAxisView* tv = &(*i)->get_time_axis_view();
if (find (tmptracks.begin(), tmptracks.end(), tv) == tmptracks.end()) {
@@ -2763,10 +2815,6 @@ Editor::separate_region_from_selection ()
TimeSelection ts;
ts.push_back (ar);
- /* force track selection */
-
- ensure_entered_region_selected ();
-
separate_regions_between (ts);
}
}
@@ -2790,8 +2838,6 @@ Editor::separate_regions_using_location (Location& loc)
void
Editor::crop_region_to_selection ()
{
- ensure_entered_region_selected (true);
-
if (!selection->time.empty()) {
crop_region_to (selection->time.start(), selection->time.end_frame());
@@ -2885,8 +2931,11 @@ void
Editor::region_fill_track ()
{
nframes_t end;
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
- if (!session || selection->regions.empty()) {
+ if (!session || rs.empty()) {
return;
}
@@ -2894,7 +2943,7 @@ Editor::region_fill_track ()
begin_reversible_command (_("region fill"));
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
boost::shared_ptr<Region> region ((*i)->region());
@@ -2975,8 +3024,9 @@ void
Editor::set_region_sync_from_edit_point ()
{
nframes64_t where = get_preferred_edit_position ();
- ensure_entered_region_selected (true);
- set_sync_point (where, selection->regions);
+ RegionSelection rs;
+ get_regions_for_action (rs);
+ set_sync_point (where, rs);
}
void
@@ -3028,11 +3078,16 @@ Editor::remove_region_sync ()
void
Editor::naturalize ()
{
- if (selection->regions.empty()) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
+
begin_reversible_command (_("naturalize"));
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
XMLNode &before = (*i)->region()->get_state();
(*i)->region()->move_to_natural_position (this);
XMLNode &after = (*i)->region()->get_state();
@@ -3044,16 +3099,17 @@ Editor::naturalize ()
void
Editor::align (RegionPoint what)
{
- ensure_entered_region_selected ();
+ RegionSelection rs;
+ get_regions_for_action (rs, false);
nframes64_t where = get_preferred_edit_position();
- if (!selection->regions.empty()) {
- align_selection (what, where, selection->regions);
+ if (!rs.empty()) {
+ align_selection (what, where, rs);
} else {
RegionSelection rs;
- rs = get_regions_at (where, selection->tracks);
+ get_regions_at (rs, where, selection->tracks);
align_selection (what, where, rs);
}
}
@@ -3062,15 +3118,13 @@ void
Editor::align_relative (RegionPoint what)
{
nframes64_t where = get_preferred_edit_position();
+ RegionSelection rs;
- if (!selection->regions.empty()) {
- align_selection_relative (what, where, selection->regions);
- } else {
+ get_regions_for_action (rs, false);
- RegionSelection rs;
- rs = get_regions_at (where, selection->tracks);
+ if (!rs.empty()) {
align_selection_relative (what, where, rs);
- }
+ }
}
struct RegionSortByTime {
@@ -3145,10 +3199,9 @@ Editor::align_selection_relative (RegionPoint point, nframes_t position, const R
/* move rest by the same amount */
- RegionSelection::const_iterator i = rs.begin();
- ++i;
-
- for (; i != rs.end(); ++i) {
+ sorted.pop_front();
+
+ for (list<RegionView*>::iterator i = sorted.begin(); i != sorted.end(); ++i) {
boost::shared_ptr<Region> region ((*i)->region());
@@ -3240,9 +3293,9 @@ Editor::trim_region_to_punch ()
void
Editor::trim_region_to_location (const Location& loc, const char* str)
{
- ExclusiveRegionSelection ers (*this, entered_regionview);
+ RegionSelection rs;
- RegionSelection& rs (get_regions_for_action ());
+ get_regions_for_action (rs);
begin_reversible_command (str);
@@ -3291,9 +3344,10 @@ Editor::trim_region_to_location (const Location& loc, const char* str)
void
Editor::trim_region_to_edit_point ()
{
- ExclusiveRegionSelection ers (*this, entered_regionview);
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
- RegionSelection& rs (get_regions_for_action ());
nframes64_t where = get_preferred_edit_position();
begin_reversible_command (_("trim region start to edit point"));
@@ -3335,9 +3389,10 @@ Editor::trim_region_to_edit_point ()
void
Editor::trim_region_from_edit_point ()
{
- ExclusiveRegionSelection ers (*this, entered_regionview);
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
- RegionSelection& rs (get_regions_for_action ());
nframes64_t where = get_preferred_edit_position();
begin_reversible_command (_("trim region end to edit point"));
@@ -3580,13 +3635,17 @@ Editor::cut_copy (CutCopyOp op)
return;
}
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
switch (current_mouse_mode()) {
case MouseObject:
- if (!selection->regions.empty() || !selection->points.empty()) {
+ if (!rs.empty() || !selection->points.empty()) {
begin_reversible_command (opname + _(" objects"));
- if (!selection->regions.empty()) {
+ if (!rs.empty()) {
cut_copy_regions (op);
if (op == Cut) {
@@ -3689,9 +3748,12 @@ Editor::cut_copy_regions (CutCopyOp op)
/* get ordering correct before we cut/copy */
- selection->regions.sort_by_position_and_track ();
+ RegionSelection rs;
- for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ get_regions_for_action (rs);
+ rs.sort_by_position_and_track ();
+
+ for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
first_position = min ((*x)->region()->position(), first_position);
@@ -3726,7 +3788,7 @@ Editor::cut_copy_regions (CutCopyOp op)
}
}
- for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ) {
+ for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ) {
boost::shared_ptr<Playlist> pl = (*x)->region()->playlist();
@@ -3985,8 +4047,8 @@ Editor::duplicate_selection (float times)
}
boost::shared_ptr<Playlist> playlist;
- vector<boost::shared_ptr<AudioRegion> > new_regions;
- vector<boost::shared_ptr<AudioRegion> >::iterator ri;
+ vector<boost::shared_ptr<Region> > new_regions;
+ vector<boost::shared_ptr<Region> >::iterator ri;
create_region_from_selection (new_regions);
@@ -4002,9 +4064,9 @@ Editor::duplicate_selection (float times)
if ((playlist = (*i)->playlist()) == 0) {
continue;
}
- XMLNode &before = playlist->get_state();
+ XMLNode &before = playlist->get_state();
playlist->duplicate (*ri, selection->time[clicked_selection].end, times);
- XMLNode &after = playlist->get_state();
+ XMLNode &after = playlist->get_state();
session->add_command (new MementoCommand<Playlist>(*playlist, &before, &after));
++ri;
@@ -4126,11 +4188,15 @@ Editor::remove_last_capture ()
void
Editor::normalize_region ()
{
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
if (!session) {
return;
}
- if (selection->regions.empty()) {
+ if (rs.empty()) {
return;
}
@@ -4139,7 +4205,7 @@ Editor::normalize_region ()
track_canvas.get_window()->set_cursor (*wait_cursor);
gdk_flush ();
- for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) {
+ for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
if (!arv)
continue;
@@ -4160,15 +4226,17 @@ Editor::denormalize_region ()
return;
}
- ExclusiveRegionSelection (*this, entered_regionview);
+ RegionSelection rs;
- if (selection->regions.empty()) {
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
begin_reversible_command ("denormalize");
- for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) {
+ for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
if (!arv)
continue;
@@ -4187,15 +4255,17 @@ Editor::adjust_region_scale_amplitude (bool up)
return;
}
- ExclusiveRegionSelection esr (*this, entered_regionview);
+ RegionSelection rs;
- if (selection->regions.empty()) {
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
begin_reversible_command ("denormalize");
- for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) {
+ for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
if (!arv)
continue;
@@ -4258,7 +4328,11 @@ Editor::quantize_region ()
void
Editor::apply_filter (Filter& filter, string command)
{
- if (selection->regions.empty()) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
@@ -4267,8 +4341,7 @@ Editor::apply_filter (Filter& filter, string command)
track_canvas.get_window()->set_cursor (*wait_cursor);
gdk_flush ();
- /* this is ugly. */
- for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ) {
+ for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ) {
RegionSelection::iterator tmp = r;
++tmp;
@@ -4298,7 +4371,7 @@ Editor::apply_filter (Filter& filter, string command)
}
commit_reversible_command ();
- selection->regions.clear ();
+ rs.clear ();
out:
track_canvas.get_window()->set_cursor (*current_canvas_cursor);
@@ -4342,19 +4415,17 @@ void
Editor::brush (nframes_t pos)
{
RegionSelection sel;
- snap_to (pos);
+ RegionSelection rs;
- if (selection->regions.empty()) {
- /* XXX get selection from region list */
- } else {
- sel = selection->regions;
- }
+ get_regions_for_action (rs);
+
+ snap_to (pos);
- if (sel.empty()) {
+ if (rs.empty()) {
return;
}
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
mouse_brush_insert_region ((*i), pos);
}
}
@@ -4362,13 +4433,17 @@ Editor::brush (nframes_t pos)
void
Editor::reset_region_gain_envelopes ()
{
- if (!session || selection->regions.empty()) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (!session || rs.empty()) {
return;
}
session->begin_reversible_command (_("reset region gain"));
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
boost::shared_ptr<AutomationList> alist (arv->audio_region()->envelope());
@@ -4385,7 +4460,11 @@ Editor::reset_region_gain_envelopes ()
void
Editor::toggle_gain_envelope_visibility ()
{
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
arv->set_envelope_visible (!arv->envelope_visible());
@@ -4396,7 +4475,11 @@ Editor::toggle_gain_envelope_visibility ()
void
Editor::toggle_gain_envelope_active ()
{
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
arv->audio_region()->set_envelope_active (!arv->audio_region()->envelope_active());
@@ -4407,7 +4490,11 @@ Editor::toggle_gain_envelope_active ()
void
Editor::toggle_region_lock ()
{
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
(*i)->region()->set_locked (!(*i)->region()->locked());
}
}
@@ -4415,7 +4502,11 @@ Editor::toggle_region_lock ()
void
Editor::set_region_lock_style (Region::PositionLockStyle ps)
{
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
(*i)->region()->set_position_lock_style (ps);
}
}
@@ -4424,7 +4515,11 @@ Editor::set_region_lock_style (Region::PositionLockStyle ps)
void
Editor::toggle_region_mute ()
{
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
(*i)->region()->set_muted (!(*i)->region()->muted());
}
}
@@ -4432,7 +4527,11 @@ Editor::toggle_region_mute ()
void
Editor::toggle_region_opaque ()
{
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
(*i)->region()->set_opaque (!(*i)->region()->opaque());
}
}
@@ -4440,14 +4539,16 @@ Editor::toggle_region_opaque ()
void
Editor::set_fade_length (bool in)
{
- ExclusiveRegionSelection esr (*this, entered_regionview);
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
/* we need a region to measure the offset from the start */
RegionView* rv;
- if (!selection->regions.empty()) {
- rv = selection->regions.front();
+ if (!rs.empty()) {
+ rv = rs.front();
} else if (entered_regionview) {
rv = entered_regionview;
} else {
@@ -4481,8 +4582,6 @@ Editor::set_fade_length (bool in)
begin_reversible_command (cmd);
- RegionSelection& rs (get_regions_for_action());
-
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
@@ -4501,8 +4600,10 @@ Editor::set_fade_length (bool in)
if (in) {
tmp->audio_region()->set_fade_in_length (len);
+ tmp->audio_region()->set_fade_in_active (true);
} else {
tmp->audio_region()->set_fade_out_length (len);
+ tmp->audio_region()->set_fade_out_active (true);
}
XMLNode &after = alist->get_state();
@@ -4515,9 +4616,11 @@ Editor::set_fade_length (bool in)
void
Editor::toggle_fade_active (bool in)
{
- ensure_entered_region_selected (true);
+ RegionSelection rs;
- if (selection->regions.empty()) {
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
@@ -4527,7 +4630,7 @@ Editor::toggle_fade_active (bool in)
begin_reversible_command (cmd);
- for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
@@ -4563,10 +4666,17 @@ Editor::toggle_fade_active (bool in)
void
Editor::set_fade_in_shape (AudioRegion::FadeShape shape)
{
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
+ return;
+ }
begin_reversible_command (_("set fade in shape"));
- for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
@@ -4589,9 +4699,17 @@ Editor::set_fade_in_shape (AudioRegion::FadeShape shape)
void
Editor::set_fade_out_shape (AudioRegion::FadeShape shape)
{
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
+ return;
+ }
+
begin_reversible_command (_("set fade out shape"));
- for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
@@ -4613,9 +4731,17 @@ Editor::set_fade_out_shape (AudioRegion::FadeShape shape)
void
Editor::set_fade_in_active (bool yn)
{
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
+ return;
+ }
+
begin_reversible_command (_("set fade in active"));
- for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
@@ -4639,9 +4765,17 @@ Editor::set_fade_in_active (bool yn)
void
Editor::set_fade_out_active (bool yn)
{
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
+ return;
+ }
+
begin_reversible_command (_("set fade out active"));
- for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
@@ -4731,20 +4865,17 @@ Editor::set_playhead_cursor ()
void
Editor::split ()
{
- ensure_entered_region_selected ();
+ RegionSelection rs;
- nframes64_t where = get_preferred_edit_position();
+ get_regions_for_action (rs);
- if (!selection->regions.empty()) {
-
- split_regions_at (where, selection->regions);
+ nframes64_t where = get_preferred_edit_position();
- } else {
-
- RegionSelection rs;
- rs = get_regions_at (where, selection->tracks);
- split_regions_at (where, rs);
+ if (rs.empty()) {
+ return;
}
+
+ split_regions_at (where, rs);
}
void
@@ -4766,36 +4897,6 @@ Editor::ensure_entered_track_selected (bool op_really_wants_one_track_if_none_ar
}
void
-Editor::ensure_entered_region_selected (bool op_really_wants_one_region_if_none_are_selected)
-{
- if (!entered_regionview || mouse_mode != MouseObject) {
- return;
- }
-
-
- /* heuristic:
-
- - if there is no existing selection, don't change it. the operation will thus apply to "all"
-
- - if there is an existing selection, but the entered regionview isn't in it, add it. this
- avoids key-mouse ops on unselected regions from interfering with an existing selection,
- but also means that the operation will apply to the pointed-at region.
- */
-
- if (!selection->regions.empty()) {
- if (!selection->selected (entered_regionview)) {
- selection->add (entered_regionview);
- }
- } else {
- /* there is no selection, but this operation requires/prefers selected objects */
-
- if (op_really_wants_one_region_if_none_are_selected) {
- selection->set (entered_regionview, false);
- }
- }
-}
-
-void
Editor::trim_region_front ()
{
trim_region (true);
@@ -4810,10 +4911,10 @@ Editor::trim_region_back ()
void
Editor::trim_region (bool front)
{
- ExclusiveRegionSelection ers (*this, entered_regionview);
-
nframes64_t where = get_preferred_edit_position();
- RegionSelection& rs = get_regions_for_action ();
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
if (rs.empty()) {
return;
@@ -4937,14 +5038,15 @@ Editor::set_loop_from_region (bool play)
nframes64_t start = max_frames;
nframes64_t end = 0;
- ExclusiveRegionSelection esr (*this, entered_regionview);
+ RegionSelection rs;
- if (selection->regions.empty()) {
- info << _("cannot set loop: no region selected") << endmsg;
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
if ((*i)->region()->position() < start) {
start = (*i)->region()->position();
}
@@ -4997,14 +5099,15 @@ Editor::set_punch_from_region ()
nframes64_t start = max_frames;
nframes64_t end = 0;
- ExclusiveRegionSelection esr (*this, entered_regionview);
+ RegionSelection rs;
- if (selection->regions.empty()) {
- info << _("cannot set punch: no region selected") << endmsg;
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
if ((*i)->region()->position() < start) {
start = (*i)->region()->position();
}
@@ -5019,13 +5122,15 @@ Editor::set_punch_from_region ()
void
Editor::pitch_shift_regions ()
{
- ensure_entered_region_selected (true);
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
- if (selection->regions.empty()) {
+ if (rs.empty()) {
return;
}
- pitch_shift (selection->regions, 1.2);
+ pitch_shift (rs, 1.2);
}
void
@@ -5035,13 +5140,15 @@ Editor::use_region_as_bar ()
return;
}
- ExclusiveRegionSelection esr (*this, entered_regionview);
+ RegionSelection rs;
- if (selection->regions.empty()) {
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
- RegionView* rv = selection->regions.front();
+ RegionView* rv = rs.front();
define_one_bar (rv->region()->position(), rv->region()->last_frame() + 1);
}
@@ -5092,18 +5199,20 @@ Editor::define_one_bar (nframes64_t start, nframes64_t end)
*/
vector<string> options;
- options.push_back (_("Set global tempo"));
- options.push_back (_("Add new marker"));
options.push_back (_("Cancel"));
+ options.push_back (_("Add new marker"));
+ options.push_back (_("Set global tempo"));
Choice c (_("Do you want to set the global tempo or add new tempo marker?"),
options);
+ c.set_default_response (2);
switch (c.run()) {
case 0:
+ return;
+
+ case 2:
do_global = true;
break;
- case 2:
- return;
default:
do_global = false;
@@ -5143,15 +5252,17 @@ Editor::split_region_at_transients ()
return;
}
- ExclusiveRegionSelection esr (*this, entered_regionview);
+ RegionSelection rs;
- if (selection->regions.empty()) {
+ get_regions_for_action (rs);
+
+ if (rs.empty()) {
return;
}
session->begin_reversible_command (_("split regions"));
- for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ) {
+ for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ) {
RegionSelection::iterator tmp;
@@ -5161,7 +5272,7 @@ Editor::split_region_at_transients ()
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> ((*i)->region());
if (ar && (ar->get_transients (positions) == 0)) {
- split_region_at_points ((*i)->region(), positions);
+ split_region_at_points ((*i)->region(), positions, true);
positions.clear ();
}
@@ -5173,15 +5284,11 @@ Editor::split_region_at_transients ()
}
void
-Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList& positions)
+Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList& positions, bool can_ferret)
{
- boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
-
- if (!ar) {
- return;
- }
-
- boost::shared_ptr<Playlist> pl = ar->playlist();
+ bool use_rhythmic_rodent = false;
+
+ boost::shared_ptr<Playlist> pl = r->playlist();
if (!pl) {
return;
@@ -5190,11 +5297,47 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
if (positions.empty()) {
return;
}
+
+
+ if (positions.size() > 20) {
+ Glib::ustring msgstr = string_compose (_("You are about to split\n%1\ninto %2 pieces.\nThis could take a long time."), r->name(), positions.size() + 1);
+ MessageDialog msg (msgstr,
+ false,
+ Gtk::MESSAGE_INFO,
+ Gtk::BUTTONS_OK_CANCEL);
+
+ if (can_ferret) {
+ msg.add_button (_("Call for the Ferret!"), RESPONSE_APPLY);
+ msg.set_secondary_text (_("Press OK to continue with this split operation\nor ask the Ferret dialog to tune the analysis"));
+ } else {
+ msg.set_secondary_text (_("Press OK to continue with this split operation"));
+ }
+
+ msg.set_title (_("Excessive split?"));
+ msg.present ();
+
+ int response = msg.run();
+ msg.hide ();
+ switch (response) {
+ case RESPONSE_OK:
+ break;
+ case RESPONSE_APPLY:
+ use_rhythmic_rodent = true;
+ break;
+ default:
+ return;
+ }
+ }
+ if (use_rhythmic_rodent) {
+ show_rhythm_ferret ();
+ return;
+ }
+
AnalysisFeatureList::const_iterator x;
- nframes64_t pos = ar->position();
-
+ nframes64_t pos = r->position();
+
XMLNode& before (pl->get_state());
x = positions.begin();
@@ -5203,6 +5346,7 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
if ((*x) > pos) {
break;
}
+ ++x;
}
if (x == positions.end()) {
@@ -5210,36 +5354,58 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
}
pl->freeze ();
- pl->remove_region (ar);
+ pl->remove_region (r);
- do {
+ while (x != positions.end()) {
/* file start = original start + how far we from the initial position ?
*/
- nframes64_t file_start = ar->start() + (pos - ar->position());
-
+ nframes64_t file_start = r->start() + (pos - r->position());
+
/* length = next position - current position
*/
nframes64_t len = (*x) - pos;
+
+ /* XXX we do we really want to allow even single-sample regions?
+ shouldn't we have some kind of lower limit on region size?
+ */
+
+ if (len <= 0) {
+ break;
+ }
string new_name;
- if (session->region_name (new_name, ar->name())) {
- continue;
+ if (session->region_name (new_name, r->name())) {
+ break;
}
- pl->add_region (RegionFactory::create (ar->sources(), file_start, len, new_name), pos);
-
+ /* do NOT announce new regions 1 by one, just wait till they are all done */
+
+ boost::shared_ptr<Region> nr = RegionFactory::create (r->sources(), file_start, len, new_name, 0, Region::DefaultFlags, false);
+ pl->add_region (nr, pos);
+
pos += len;
-
++x;
-
- } while (x != positions.end() && (*x) < ar->last_frame());
-
+
+ if (*x > r->last_frame()) {
+
+ /* add final fragment */
+
+ file_start = r->start() + (pos - r->position());
+ len = r->last_frame() - pos;
+
+ nr = RegionFactory::create (r->sources(), file_start, len, new_name, 0, Region::DefaultFlags);
+ pl->add_region (nr, pos);
+
+ break;
+ }
+ }
+
pl->thaw ();
-
+
XMLNode& after (pl->get_state());
session->add_command (new MementoCommand<Playlist>(*pl, &before, &after));
@@ -5279,13 +5445,15 @@ Editor::tab_to_transient (bool forward)
} else {
- ExclusiveRegionSelection esr (*this, entered_regionview);
+ RegionSelection rs;
+
+ get_regions_for_action (rs);
- if (selection->regions.empty()) {
+ if (rs.empty()) {
return;
}
- for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) {
+ for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
(*r)->region()->get_transients (positions);
}
}