X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_ops.cc;h=d79f1df47b7410d770d2a54b0f759933b5a0e96f;hb=7b155267505af3fedffc7972b08cb784c97b7e74;hp=a07f1dccec81b0b791178eb65f86435180dc4073;hpb=935aeb55dd5fbce9fb9b1dd7770834b3b684a6d1;p=ardour.git diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index a07f1dccec..d79f1df47b 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -55,8 +55,10 @@ #include "ardour/quantize.h" #include "ardour/strip_silence.h" #include "ardour/route_group.h" +#include "ardour/operations.h" #include "ardour_ui.h" +#include "debug.h" #include "editor.h" #include "time_axis_view.h" #include "route_time_axis.h" @@ -82,6 +84,9 @@ #include "interthread_progress_window.h" #include "insert_time_dialog.h" #include "normalize_dialog.h" +#include "editor_cursors.h" +#include "mouse_cursors.h" +#include "patch_change_dialog.h" #include "i18n.h" @@ -116,6 +121,8 @@ Editor::redo (uint32_t n) void Editor::split_regions_at (framepos_t where, RegionSelection& regions) { + bool frozen = false; + list > used_playlists; if (regions.empty()) { @@ -138,6 +145,9 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) } } else { snap_to (where); + + frozen = true; + EditorFreeze(); /* Emit Signal */ } for (RegionSelection::iterator a = regions.begin(); a != regions.end(); ) { @@ -158,10 +168,10 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) boost::shared_ptr pl = (*a)->region()->playlist(); - if (!pl) { - a = tmp; - continue; - } + if (!pl) { + a = tmp; + continue; + } if (!pl->frozen()) { /* we haven't seen this playlist before */ @@ -172,7 +182,7 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) } if (pl) { - pl->clear_changes (); + pl->clear_changes (); pl->split_region ((*a)->region(), where); _session->add_command (new StatefulDiffCommand (pl)); } @@ -187,6 +197,10 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) } commit_reversible_command (); + + if (frozen){ + EditorThaw(); /* Emit Signal */ + } } boost::shared_ptr @@ -307,9 +321,11 @@ Editor::nudge_forward (bool next, bool force_playhead) framepos_t distance; framepos_t next_distance; - RegionSelection rs = get_regions_for_action (); + if (!_session) { + return; + } - if (!_session) return; + RegionSelection rs = get_regions_from_selection_and_entered (); if (!force_playhead && !rs.empty()) { @@ -324,7 +340,7 @@ Editor::nudge_forward (bool next, bool force_playhead) distance = next_distance; } - r->clear_changes (); + r->clear_changes (); r->set_position (r->position() + distance, this); _session->add_command (new StatefulDiffCommand (r)); } @@ -385,9 +401,12 @@ Editor::nudge_backward (bool next, bool force_playhead) { framepos_t distance; framepos_t next_distance; - RegionSelection rs = get_regions_for_action (); - if (!_session) return; + if (!_session) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!force_playhead && !rs.empty()) { @@ -402,7 +421,7 @@ Editor::nudge_backward (bool next, bool force_playhead) distance = next_distance; } - r->clear_changes (); + r->clear_changes (); if (r->position() > distance) { r->set_position (r->position() - distance, this); @@ -474,61 +493,54 @@ Editor::nudge_backward (bool next, bool force_playhead) void Editor::nudge_forward_capture_offset () { - framepos_t distance; - RegionSelection rs = get_regions_for_action (); - - if (!_session) return; - - if (!rs.empty()) { - - begin_reversible_command (_("nudge forward")); - - distance = _session->worst_output_latency(); - - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - boost::shared_ptr r ((*i)->region()); - - r->clear_changes (); - r->set_position (r->position() + distance, this); - _session->add_command(new StatefulDiffCommand (r)); - } - - commit_reversible_command (); + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (!_session || rs.empty()) { + return; + } + begin_reversible_command (_("nudge forward")); + + framepos_t const distance = _session->worst_output_latency(); + + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + boost::shared_ptr r ((*i)->region()); + + r->clear_changes (); + r->set_position (r->position() + distance, this); + _session->add_command(new StatefulDiffCommand (r)); } + + commit_reversible_command (); } void Editor::nudge_backward_capture_offset () { - framepos_t distance; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); - if (!_session) { + if (!_session || rs.empty()) { return; } - if (!rs.empty()) { - - begin_reversible_command (_("nudge forward")); - - distance = _session->worst_output_latency(); - - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - boost::shared_ptr r ((*i)->region()); - - r->clear_changes (); + begin_reversible_command (_("nudge forward")); + + framepos_t const distance = _session->worst_output_latency(); - if (r->position() > distance) { - r->set_position (r->position() - distance, this); - } else { - r->set_position (0, this); - } - _session->add_command(new StatefulDiffCommand (r)); + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + boost::shared_ptr r ((*i)->region()); + + r->clear_changes (); + + if (r->position() > distance) { + r->set_position (r->position() - distance, this); + } else { + r->set_position (0, this); } - - commit_reversible_command (); + _session->add_command(new StatefulDiffCommand (r)); } + + commit_reversible_command (); } /* DISPLAY MOTION */ @@ -861,7 +873,7 @@ Editor::cursor_to_region_point (EditorCursor* cursor, RegionPoint point, int32_t return; } - switch (point){ + switch (point) { case Start: pos = r->first_frame (); break; @@ -909,12 +921,11 @@ void Editor::cursor_to_selection_start (EditorCursor *cursor) { framepos_t pos = 0; - RegionSelection rs = get_regions_for_action (); switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.start(); + if (!selection->regions.empty()) { + pos = selection->regions.start(); } break; @@ -939,12 +950,11 @@ void Editor::cursor_to_selection_end (EditorCursor *cursor) { framepos_t pos = 0; - RegionSelection rs = get_regions_for_action (); switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.end_frame(); + if (!selection->regions.empty()) { + pos = selection->regions.end_frame(); } break; @@ -1054,7 +1064,7 @@ Editor::selected_marker_to_region_point (RegionPoint point, int32_t dir) return; } - switch (point){ + switch (point) { case Start: pos = r->first_frame (); break; @@ -1109,12 +1119,10 @@ Editor::selected_marker_to_selection_start () return; } - RegionSelection rs = get_regions_for_action (); - switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.start(); + if (!selection->regions.empty()) { + pos = selection->regions.start(); } break; @@ -1146,12 +1154,10 @@ Editor::selected_marker_to_selection_end () return; } - RegionSelection rs = get_regions_for_action (); - switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.end_frame(); + if (!selection->regions.empty()) { + pos = selection->regions.end_frame(); } break; @@ -1201,68 +1207,6 @@ Editor::scroll_playhead (bool forward) _session->request_locate (pos); } -void -Editor::playhead_backward () -{ - framepos_t pos; - framepos_t cnt; - float prefix; - bool was_floating; - - if (get_prefix (prefix, was_floating)) { - cnt = 1; - } else { - if (was_floating) { - cnt = (framepos_t) floor (prefix * _session->frame_rate ()); - } else { - cnt = (framepos_t) prefix; - } - } - - pos = playhead_cursor->current_frame; - - if ((framepos_t) pos < cnt) { - pos = 0; - } else { - pos -= cnt; - } - - /* XXX this is completely insane. with the current buffering - design, we'll force a complete track buffer flush and - reload, just to move 1 sample !!! - */ - - _session->request_locate (pos); -} - -void -Editor::playhead_forward () -{ - framepos_t pos; - framepos_t cnt; - bool was_floating; - float prefix; - - if (get_prefix (prefix, was_floating)) { - cnt = 1; - } else { - if (was_floating) { - cnt = (framepos_t) floor (prefix * _session->frame_rate ()); - } else { - cnt = (framepos_t) floor (prefix); - } - } - - pos = playhead_cursor->current_frame; - - /* XXX this is completely insane. with the current buffering - design, we'll force a complete track buffer flush and - reload, just to move 1 sample !!! - */ - - _session->request_locate (pos+cnt); -} - void Editor::cursor_align (bool playhead_to_edit) { @@ -1296,98 +1240,13 @@ Editor::cursor_align (bool playhead_to_edit) } } -void -Editor::edit_cursor_backward () -{ - framepos_t pos; - framepos_t cnt; - float prefix; - bool was_floating; - - if (get_prefix (prefix, was_floating)) { - cnt = 1; - } else { - if (was_floating) { - cnt = (framepos_t) floor (prefix * _session->frame_rate ()); - } else { - cnt = (framepos_t) prefix; - } - } - - if ((pos = get_preferred_edit_position()) < 0) { - return; - } - - if (pos < cnt) { - pos = 0; - } else { - pos -= cnt; - } - - // EDIT CURSOR edit_cursor->set_position (pos); -} - -void -Editor::edit_cursor_forward () -{ - //framepos_t pos; - framepos_t cnt; - bool was_floating; - float prefix; - - if (get_prefix (prefix, was_floating)) { - cnt = 1; - } else { - if (was_floating) { - cnt = (framepos_t) floor (prefix * _session->frame_rate ()); - } else { - cnt = (framepos_t) floor (prefix); - } - } - - // pos = edit_cursor->current_frame; - // EDIT CURSOR edit_cursor->set_position (pos+cnt); -} - -void -Editor::goto_frame () -{ - float prefix; - bool was_floating; - framepos_t frame; - - if (get_prefix (prefix, was_floating)) { - return; - } - - if (was_floating) { - frame = (framepos_t) floor (prefix * _session->frame_rate()); - } else { - frame = (framepos_t) floor (prefix); - } - - _session->request_locate (frame); -} - void Editor::scroll_backward (float pages) { - framepos_t frame; - framepos_t one_page = (framepos_t) rint (_canvas_width * frames_per_unit); - bool was_floating; - float prefix; - framepos_t cnt; - - if (get_prefix (prefix, was_floating)) { - cnt = (framepos_t) floor (pages * one_page); - } else { - if (was_floating) { - cnt = (framepos_t) floor (prefix * _session->frame_rate()); - } else { - cnt = (framepos_t) floor (prefix * one_page); - } - } + framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit); + framepos_t const cnt = (framepos_t) floor (pages * one_page); + framepos_t frame; if (leftmost_frame < cnt) { frame = 0; } else { @@ -1400,22 +1259,10 @@ Editor::scroll_backward (float pages) void Editor::scroll_forward (float pages) { - framepos_t frame; - framepos_t one_page = (framepos_t) rint (_canvas_width * frames_per_unit); - bool was_floating; - float prefix; - framepos_t cnt; - - if (get_prefix (prefix, was_floating)) { - cnt = (framepos_t) floor (pages * one_page); - } else { - if (was_floating) { - cnt = (framepos_t) floor (prefix * _session->frame_rate()); - } else { - cnt = (framepos_t) floor (prefix * one_page); - } - } + framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit); + framepos_t const cnt = (framepos_t) floor (pages * one_page); + framepos_t frame; if (max_framepos - cnt < leftmost_frame) { frame = max_framepos - cnt; } else { @@ -1428,38 +1275,18 @@ Editor::scroll_forward (float pages) void Editor::scroll_tracks_down () { - float prefix; - bool was_floating; - int cnt; - - if (get_prefix (prefix, was_floating)) { - cnt = 1; - } else { - cnt = (int) floor (prefix); - } - - double vert_value = vertical_adjustment.get_value() + (cnt * - vertical_adjustment.get_page_size()); + double vert_value = vertical_adjustment.get_value() + vertical_adjustment.get_page_size(); if (vert_value > vertical_adjustment.get_upper() - _canvas_height) { vert_value = vertical_adjustment.get_upper() - _canvas_height; } + vertical_adjustment.set_value (vert_value); } void Editor::scroll_tracks_up () { - float prefix; - bool was_floating; - int cnt; - - if (get_prefix (prefix, was_floating)) { - cnt = 1; - } else { - cnt = (int) floor (prefix); - } - - vertical_adjustment.set_value (vertical_adjustment.get_value() - (cnt * vertical_adjustment.get_page_size())); + vertical_adjustment.set_value (vertical_adjustment.get_value() - vertical_adjustment.get_page_size()); } void @@ -1643,7 +1470,7 @@ Editor::temporal_zoom_region (bool both_axes) framepos_t end = 0; set tracks; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -1758,13 +1585,13 @@ Editor::temporal_zoom_session () ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_session) if (_session) { - nframes_t const l = _session->current_end_frame() - _session->current_start_frame(); + framecnt_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"); + framecnt_t const e = _session->current_end_frame() + l * 0.01; + temporal_zoom_by_frame (framecnt_t (s), e, "zoom to _session"); } } @@ -1820,10 +1647,10 @@ Editor::temporal_zoom_to_frame (bool coarser, framepos_t frame) if (new_leftmost > frame) { new_leftmost = 0; } -// begin_reversible_command (_("zoom to frame")); -// _session->add_undo (sigc::bind (sigc::mem_fun(*this, &Editor::reposition_and_zoom), leftmost_frame, frames_per_unit)); -// _session->add_redo (sigc::bind (sigc::mem_fun(*this, &Editor::reposition_and_zoom), new_leftmost, new_fpu)); -// commit_reversible_command (); + + if (new_leftmost < 0) { + new_leftmost = 0; + } reposition_and_zoom (new_leftmost, new_fpu); } @@ -1885,9 +1712,9 @@ Editor::add_location_from_selection () Location *location = new Location (*_session, start, end, rangename, Location::IsRangeMarker); _session->begin_reversible_command (_("add marker")); - XMLNode &before = _session->locations()->get_state(); + XMLNode &before = _session->locations()->get_state(); _session->locations()->add (location, true); - XMLNode &after = _session->locations()->get_state(); + XMLNode &after = _session->locations()->get_state(); _session->add_command(new MementoCommand(*(_session->locations()), &before, &after)); _session->commit_reversible_command (); } @@ -1905,9 +1732,9 @@ Editor::add_location_mark (framepos_t where) } Location *location = new Location (*_session, where, where, markername, Location::IsMark); _session->begin_reversible_command (_("add marker")); - XMLNode &before = _session->locations()->get_state(); + XMLNode &before = _session->locations()->get_state(); _session->locations()->add (location, true); - XMLNode &after = _session->locations()->get_state(); + XMLNode &after = _session->locations()->get_state(); _session->add_command(new MementoCommand(*(_session->locations()), &before, &after)); _session->commit_reversible_command (); } @@ -1918,16 +1745,17 @@ Editor::add_location_from_playhead_cursor () add_location_mark (_session->audible_frame()); } +/** Add a range marker around each selected region */ void -Editor::add_locations_from_audio_region () +Editor::add_locations_from_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } - _session->begin_reversible_command (rs.size () > 1 ? _("add markers") : _("add marker")); + _session->begin_reversible_command (selection->regions.size () > 1 ? _("add markers") : _("add marker")); XMLNode &before = _session->locations()->get_state(); for (RegionSelection::iterator i = rs.begin (); i != rs.end (); ++i) { @@ -1944,11 +1772,12 @@ Editor::add_locations_from_audio_region () _session->commit_reversible_command (); } +/** Add a single range marker around all selected regions */ void -Editor::add_location_from_audio_region () +Editor::add_location_from_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -1958,7 +1787,7 @@ Editor::add_location_from_audio_region () string markername; - if (rs.size() > 1) { // more than one region selected + if (rs.size() > 1) { _session->locations()->next_available_name(markername, "regions"); } else { RegionView* rv = *(rs.begin()); @@ -1971,7 +1800,7 @@ Editor::add_location_from_audio_region () } // single range spanning all selected - Location *location = new Location (*_session, rs.start(), rs.end_frame(), markername, Location::IsRangeMarker); + Location *location = new Location (*_session, selection->regions.start(), selection->regions.end_frame(), markername, Location::IsRangeMarker); _session->locations()->add (location, true); XMLNode &after = _session->locations()->get_state(); @@ -1979,59 +1808,6 @@ Editor::add_location_from_audio_region () _session->commit_reversible_command (); } -void -Editor::amplitude_zoom_step (bool in) -{ - gdouble zoom = 1.0; - - if (in) { - zoom *= 2.0; - } else { - if (zoom > 2.0) { - zoom /= 2.0; - } else { - zoom = 1.0; - } - } - -#ifdef FIX_FOR_CANVAS - /* XXX DO SOMETHING */ -#endif -} - - -/* DELETION */ - - -void -Editor::delete_sample_forward () -{ -} - -void -Editor::delete_sample_backward () -{ -} - -void -Editor::delete_screen () -{ -} - -/* SEARCH */ - -void -Editor::search_backwards () -{ - /* what ? */ -} - -void -Editor::search_forwards () -{ - /* what ? */ -} - /* MARKS */ void @@ -2069,25 +1845,15 @@ Editor::jump_backward_to_mark () void Editor::set_mark () { - framepos_t pos; - float prefix; - bool was_floating; - string markername; - - if (get_prefix (prefix, was_floating)) { - pos = _session->audible_frame (); - } else { - if (was_floating) { - pos = (framepos_t) floor (prefix * _session->frame_rate ()); - } else { - pos = (framepos_t) floor (prefix); - } - } + framepos_t const pos = _session->audible_frame (); - _session->locations()->next_available_name(markername,"mark"); - if (!choose_new_marker_name(markername)) { + string markername; + _session->locations()->next_available_name (markername, "mark"); + + if (!choose_new_marker_name (markername)) { return; } + _session->locations()->add (new Location (*_session, pos, 0, markername, Location::IsMark), true); } @@ -2096,9 +1862,9 @@ Editor::clear_markers () { if (_session) { _session->begin_reversible_command (_("clear markers")); - XMLNode &before = _session->locations()->get_state(); + XMLNode &before = _session->locations()->get_state(); _session->locations()->clear_markers (); - XMLNode &after = _session->locations()->get_state(); + XMLNode &after = _session->locations()->get_state(); _session->add_command(new MementoCommand(*(_session->locations()), &before, &after)); _session->commit_reversible_command (); } @@ -2109,7 +1875,7 @@ Editor::clear_ranges () { if (_session) { _session->begin_reversible_command (_("clear ranges")); - XMLNode &before = _session->locations()->get_state(); + XMLNode &before = _session->locations()->get_state(); Location * looploc = _session->locations()->auto_loop_location(); Location * punchloc = _session->locations()->auto_punch_location(); @@ -2119,7 +1885,7 @@ Editor::clear_ranges () if (looploc) _session->locations()->add (looploc); if (punchloc) _session->locations()->add (punchloc); - XMLNode &after = _session->locations()->get_state(); + XMLNode &after = _session->locations()->get_state(); _session->add_command(new MementoCommand(*(_session->locations()), &before, &after)); _session->commit_reversible_command (); } @@ -2129,9 +1895,9 @@ void Editor::clear_locations () { _session->begin_reversible_command (_("clear locations")); - XMLNode &before = _session->locations()->get_state(); + XMLNode &before = _session->locations()->get_state(); _session->locations()->clear (); - XMLNode &after = _session->locations()->get_state(); + XMLNode &after = _session->locations()->get_state(); _session->add_command(new MementoCommand(*(_session->locations()), &before, &after)); _session->commit_reversible_command (); _session->locations()->clear (); @@ -2200,7 +1966,7 @@ Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) snap_to (where); begin_reversible_command (_("insert dragged region")); - playlist->clear_changes (); + playlist->clear_changes (); playlist->add_region (RegionFactory::create (region, true), where, 1.0); _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); @@ -2211,7 +1977,7 @@ Editor::insert_route_list_drag (boost::shared_ptr route, int x, int y) { double wx, wy; double cx, cy; - nframes_t where; + framepos_t where; RouteTimeAxisView *dest_rtv = 0; RouteTimeAxisView *source_rtv = 0; @@ -2279,7 +2045,7 @@ Editor::insert_region_list_selection (float times) } begin_reversible_command (_("insert region")); - playlist->clear_changes (); + playlist->clear_changes (); playlist->add_region ((RegionFactory::create (region, true)), get_preferred_edit_position(), times); _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); @@ -2373,28 +2139,6 @@ Editor::play_selection () _session->request_play_range (&selection->time, true); } -void -Editor::loop_selected_region () -{ - RegionSelection rs = get_regions_for_action (); - - if (!rs.empty()) { - RegionView *rv = *(rs.begin()); - Location* tll; - - if ((tll = transport_loop_location()) != 0) { - - tll->set (rv->region()->position(), rv->region()->last_frame()); - - // enable looping, reposition and start rolling - - _session->request_play_loop (true); - _session->request_locate (tll->start(), false); - _session->request_transport_speed (1.0f); - } - } -} - void Editor::play_location (Location& location) { @@ -2449,7 +2193,7 @@ Editor::lower_region_to_bottom () /** Show the region editor for the selected regions */ void -Editor::edit_region () +Editor::show_region_properties () { selection->foreach_regionview (&RegionView::show_region_editor); } @@ -2462,10 +2206,10 @@ Editor::show_midi_list_editor () } void -Editor::rename_region() +Editor::rename_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -2488,7 +2232,7 @@ Editor::rename_region() d.set_size_request (300, -1); d.set_position (Gtk::WIN_POS_MOUSE); - entry.set_text (rs.front()->region()->name()); + entry.set_text (selection->regions.front()->region()->name()); entry.select_region (0, -1); entry.signal_activate().connect (sigc::bind (sigc::mem_fun (d, &Dialog::response), RESPONSE_OK)); @@ -2497,17 +2241,19 @@ Editor::rename_region() entry.grab_focus(); - int ret = d.run(); + int const ret = d.run(); d.hide (); - if (ret == RESPONSE_OK) { - std::string str = entry.get_text(); - strip_whitespace_edges (str); - if (!str.empty()) { - rs.front()->region()->set_name (str); - _regions->redisplay (); - } + if (ret != RESPONSE_OK) { + return; + } + + std::string str = entry.get_text(); + strip_whitespace_edges (str); + if (!str.empty()) { + rs.front()->region()->set_name (str); + _regions->redisplay (); } } @@ -2546,8 +2292,9 @@ Editor::play_selected_region () { framepos_t start = max_framepos; framepos_t end = 0; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -2658,8 +2405,8 @@ Editor::create_region_from_selection (vector >& new_re void Editor::split_multichannel_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -2777,20 +2524,20 @@ Editor::separate_regions_between (const TimeSelection& ts) 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; } - /* pick up changes to existing regions */ + /* pick up changes to existing regions */ - vector cmds; - playlist->rdiff (cmds); + vector cmds; + playlist->rdiff (cmds); _session->add_commands (cmds); - /* pick up changes to the playlist itself (adds/removes) - */ + /* pick up changes to the playlist itself (adds/removes) + */ _session->add_command(new StatefulDiffCommand (playlist)); } @@ -2882,15 +2629,13 @@ Editor::separate_regions_using_location (Location& loc) void Editor::separate_under_selected_regions () { - RegionSelection rs = get_regions_for_action (); - vector playlists; - if (!_session) { - return; - } + RegionSelection rs; + + rs = get_regions_from_selection_and_entered(); - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -3039,7 +2784,7 @@ Editor::crop_region_to (framepos_t start, framepos_t end) the_end = min (end, the_end); cnt = the_end - the_start + 1; - region->clear_changes (); + region->clear_changes (); region->trim_to (the_start, cnt, this); _session->add_command (new StatefulDiffCommand (region)); } @@ -3050,16 +2795,15 @@ Editor::crop_region_to (framepos_t start, framepos_t end) void Editor::region_fill_track () { - framepos_t end; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; } - end = _session->current_end_frame (); + framepos_t const end = _session->current_end_frame (); - begin_reversible_command (_("region fill")); + begin_reversible_command (Operations::region_fill); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { @@ -3077,7 +2821,7 @@ Editor::region_fill_track () return; } - pl->clear_changes (); + pl->clear_changes (); pl->add_region (RegionFactory::create (region, true), region->last_frame(), times); _session->add_command (new StatefulDiffCommand (pl)); } @@ -3113,7 +2857,7 @@ Editor::region_fill_selection () framepos_t selection_length = end - start; float times = (float)selection_length / region->length(); - begin_reversible_command (_("fill selection")); + begin_reversible_command (Operations::fill_selection); for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { @@ -3121,7 +2865,7 @@ Editor::region_fill_selection () continue; } - playlist->clear_changes (); + playlist->clear_changes (); playlist->add_region (RegionFactory::create (region, true), start, times); _session->add_command (new StatefulDiffCommand (playlist)); } @@ -3130,11 +2874,9 @@ Editor::region_fill_selection () } void -Editor::set_region_sync_from_edit_point () +Editor::set_region_sync_position () { - framepos_t where = get_preferred_edit_position (); - RegionSelection rs = get_regions_for_action (); - set_sync_point (where, rs); + set_sync_point (get_preferred_edit_position (), get_regions_from_selection_and_edit_point ()); } void @@ -3155,7 +2897,7 @@ Editor::set_sync_point (framepos_t where, const RegionSelection& rs) in_command = true; } - region->clear_changes (); + region->clear_changes (); region->set_sync_position (where); _session->add_command(new StatefulDiffCommand (region)); } @@ -3169,65 +2911,66 @@ Editor::set_sync_point (framepos_t where, const RegionSelection& rs) void Editor::remove_region_sync () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } - begin_reversible_command (_("remove sync")); + begin_reversible_command (_("remove region sync")); + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - (*i)->region()->clear_changes (); + (*i)->region()->clear_changes (); (*i)->region()->clear_sync_position (); _session->add_command(new StatefulDiffCommand ((*i)->region())); } + commit_reversible_command (); } void -Editor::naturalize () +Editor::naturalize_region () { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; } - begin_reversible_command (_("naturalize")); + if (rs.size() > 1) { + begin_reversible_command (_("move regions to original position")); + } else { + begin_reversible_command (_("move region to original position")); + } + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { (*i)->region()->clear_changes (); (*i)->region()->move_to_natural_position (this); _session->add_command (new StatefulDiffCommand ((*i)->region())); } + commit_reversible_command (); } void -Editor::align (RegionPoint what) +Editor::align_regions (RegionPoint what) { - RegionSelection rs = get_regions_for_action (); - framepos_t where = get_preferred_edit_position(); - - if (!rs.empty()) { - align_selection (what, where, rs); - } else { - - RegionSelection rs; - get_regions_at (rs, where, selection->tracks); - align_selection (what, where, rs); + RegionSelection const rs = get_regions_from_selection_and_edit_point (); + + if (rs.empty()) { + return; } -} -void -Editor::align_relative (RegionPoint what) -{ - framepos_t where = get_preferred_edit_position(); - RegionSelection rs = get_regions_for_action (); + begin_reversible_command (_("align selection")); + + framepos_t const position = get_preferred_edit_position (); - if (!rs.empty()) { - align_selection_relative (what, where, rs); + for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { + align_region_internal ((*i)->region(), what, position); } + + commit_reversible_command (); } struct RegionSortByTime { @@ -3237,12 +2980,16 @@ struct RegionSortByTime { }; void -Editor::align_selection_relative (RegionPoint point, framepos_t position, const RegionSelection& rs) +Editor::align_regions_relative (RegionPoint point) { + RegionSelection const rs = get_regions_from_selection_and_edit_point (); + if (rs.empty()) { return; } + framepos_t const position = get_preferred_edit_position (); + framepos_t distance = 0; framepos_t pos = 0; int dir = 1; @@ -3293,7 +3040,7 @@ Editor::align_selection_relative (RegionPoint point, framepos_t position, const /* move first one specially */ - r->clear_changes (); + r->clear_changes (); r->set_position (pos, this); _session->add_command(new StatefulDiffCommand (r)); @@ -3305,7 +3052,7 @@ Editor::align_selection_relative (RegionPoint point, framepos_t position, const boost::shared_ptr region ((*i)->region()); - region->clear_changes (); + region->clear_changes (); if (dir > 0) { region->set_position (region->position() + distance, this); @@ -3320,22 +3067,6 @@ Editor::align_selection_relative (RegionPoint point, framepos_t position, const commit_reversible_command (); } -void -Editor::align_selection (RegionPoint point, framepos_t position, const RegionSelection& rs) -{ - if (rs.empty()) { - return; - } - - begin_reversible_command (_("align selection")); - - for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { - align_region_internal ((*i)->region(), point, position); - } - - commit_reversible_command (); -} - void Editor::align_region (boost::shared_ptr region, RegionPoint point, framepos_t position) { @@ -3384,12 +3115,17 @@ void Editor::trim_region (bool front) { framepos_t where = get_preferred_edit_position(); - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_edit_point (); + + cerr << "trim regions\n"; if (rs.empty()) { + cerr << " no regions\n"; return; } + cerr << "where = " << where << endl; + begin_reversible_command (front ? _("trim front") : _("trim back")); for (list::const_iterator i = rs.by_layer().begin(); i != rs.by_layer().end(); ++i) { @@ -3430,10 +3166,11 @@ Editor::trim_region_to_punch () } trim_region_to_location (*loc, _("trim to punch")); } + void Editor::trim_region_to_location (const Location& loc, const char* str) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); begin_reversible_command (str); @@ -3472,78 +3209,6 @@ Editor::trim_region_to_location (const Location& loc, const char* str) commit_reversible_command (); } -void -Editor::trim_region_to_edit_point () -{ - RegionSelection rs = get_regions_for_action (); - - framepos_t where = get_preferred_edit_position(); - - begin_reversible_command (_("trim region start to edit point")); - - for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) { - RegionView* rv = (*x); - - /* require region to cover trim */ - if (!rv->region()->covers (where)) { - continue; - } - - RouteTimeAxisView* tav = dynamic_cast (&rv->get_time_axis_view()); - if (!tav) { - return; - } - - float speed = 1.0; - - if (tav->track() != 0) { - speed = tav->track()->speed(); - } - - rv->region()->clear_changes (); - rv->region()->trim_end (session_frame_to_track_frame(where, speed), this); - _session->add_command(new StatefulDiffCommand (rv->region())); - } - - commit_reversible_command (); -} - -void -Editor::trim_region_from_edit_point () -{ - RegionSelection rs = get_regions_for_action (); - - framepos_t where = get_preferred_edit_position(); - - begin_reversible_command (_("trim region end to edit point")); - - for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) { - RegionView* rv = (*x); - - /* require region to cover trim */ - if (!rv->region()->covers (where)) { - continue; - } - - RouteTimeAxisView* tav = dynamic_cast (&rv->get_time_axis_view()); - if (!tav) { - return; - } - - float speed = 1.0; - - if (tav->track() != 0) { - speed = tav->track()->speed(); - } - - rv->region()->clear_changes (); - rv->region()->trim_front (session_frame_to_track_frame(where, speed), this); - _session->add_command(new StatefulDiffCommand (rv->region())); - } - - commit_reversible_command (); -} - void Editor::trim_region_to_previous_region_end () { @@ -3559,7 +3224,7 @@ Editor::trim_region_to_next_region_start () void Editor::trim_to_region(bool forward) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); begin_reversible_command (_("trim to region")); @@ -3589,13 +3254,13 @@ Editor::trim_to_region(bool forward) boost::shared_ptr region = arv->region(); boost::shared_ptr playlist (region->playlist()); - region->clear_changes (); + region->clear_changes (); - if(forward){ + if (forward) { next_region = playlist->find_next_region (region->first_frame(), Start, 1); - if(!next_region){ + if (!next_region) { continue; } @@ -3654,6 +3319,19 @@ Editor::freeze_route () return; } + if (!clicked_routeview->track()->bounceable()) { + RouteTimeAxisView* rtv = dynamic_cast (clicked_routeview); + if (rtv && !rtv->track()->bounceable()) { + MessageDialog d ( + _("This route cannot be frozen because it has more outputs than inputs. " + "You can fix this by increasing the number of inputs.") + ); + d.set_title (_("Cannot freeze")); + d.run (); + return; + } + } + InterThreadInfo itt; current_interthread_info = &itt; @@ -3661,7 +3339,7 @@ Editor::freeze_route () pthread_create_and_store (X_("freezer"), &itt.thread, _freeze_thread, this); - set_canvas_cursor (wait_cursor); + set_canvas_cursor (_cursors->wait); while (!itt.done && !itt.cancel) { gtk_main_iteration (); @@ -3680,6 +3358,19 @@ Editor::bounce_range_selection (bool replace, bool enable_processing) TrackSelection views = selection->tracks; + for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) { + RouteTimeAxisView* rtv = dynamic_cast (*i); + if (rtv && !rtv->track()->bounceable()) { + MessageDialog d ( + _("One or more selected tracks cannot be bounced because it has more outputs than inputs. " + "You can fix this by increasing the number of inputs on that track.") + ); + d.set_title (_("Cannot bounce")); + d.run (); + return; + } + } + framepos_t start = selection->time[clicked_selection].start; framepos_t end = selection->time[clicked_selection].end; framepos_t cnt = end - start + 1; @@ -3702,7 +3393,7 @@ Editor::bounce_range_selection (bool replace, bool enable_processing) InterThreadInfo itt; - playlist->clear_changes (); + playlist->clear_changes (); playlist->clear_owned_changes (); boost::shared_ptr r = rtv->track()->bounce_range (start, start+cnt, itt, enable_processing); @@ -3718,7 +3409,7 @@ Editor::bounce_range_selection (bool replace, bool enable_processing) playlist->rdiff (cmds); _session->add_commands (cmds); - _session->add_command (new StatefulDiffCommand (playlist)); + _session->add_command (new StatefulDiffCommand (playlist)); } commit_reversible_command (); @@ -3834,7 +3525,7 @@ Editor::cut_copy (CutCopyOp op) /* we only want to cut regions if some are selected */ if (!selection->regions.empty()) { - rs = get_regions_for_action (false); + rs = selection->regions; } switch (current_mouse_mode()) { @@ -3951,7 +3642,7 @@ Editor::remove_clicked_region () boost::shared_ptr playlist = clicked_routeview->playlist(); begin_reversible_command (_("remove region")); - playlist->clear_changes (); + playlist->clear_changes (); playlist->remove_region (clicked_regionview->region()); _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); @@ -3962,13 +3653,9 @@ Editor::remove_clicked_region () void Editor::remove_selected_regions () { - RegionSelection rs = get_regions_for_action (); - - if (!_session) { - return; - } + RegionSelection rs = get_regions_from_selection_and_entered (); - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -3989,7 +3676,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) { @@ -4011,7 +3698,7 @@ Editor::remove_selected_regions () if (i == playlists.end()) { - playlist->clear_changes (); + playlist->clear_changes (); playlist->freeze (); playlists.push_back (playlist); @@ -4045,7 +3732,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) framepos_t first_position = max_framepos; typedef set > FreezeList; - FreezeList freezelist; + FreezeList freezelist; /* get ordering correct before we cut/copy */ @@ -4069,7 +3756,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) } if (fl == freezelist.end()) { - pl->clear_changes(); + pl->clear_changes(); pl->freeze (); freezelist.insert (pl); } @@ -4096,9 +3783,9 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) if (!pl) { /* region not yet associated with a playlist (e.g. unfinished - capture pass. - */ - ++x; + capture pass. + */ + ++x; continue; } @@ -4157,10 +3844,10 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) /* the pmap is in the same order as the tracks in which selected regions occured */ for (vector::iterator i = pmap.begin(); i != pmap.end(); ++i) { - if ((*i).pl) { - (*i).pl->thaw(); - foo.push_back ((*i).pl); - } + if ((*i).pl) { + (*i).pl->thaw(); + foo.push_back ((*i).pl); + } } if (!foo.empty()) { @@ -4203,6 +3890,7 @@ Editor::cut_copy_ranges (CutCopyOp op) void Editor::paste (float times) { + DEBUG_TRACE (DEBUG::CutNPaste, "paste to preferred edit pos\n"); paste_internal (get_preferred_edit_position(), times); } @@ -4223,7 +3911,7 @@ Editor::mouse_paste () void Editor::paste_internal (framepos_t position, float times) { - bool commit = false; + DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("apparent paste position is %1\n", position)); if (internal_editing()) { if (cut_buffer->midi_notes.empty()) { @@ -4237,10 +3925,9 @@ Editor::paste_internal (framepos_t position, float times) if (position == max_framepos) { position = get_preferred_edit_position(); + DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("preferred edit position is %1\n", position)); } - begin_reversible_command (_("paste")); - TrackViewList ts; TrackViewList::iterator i; size_t nth; @@ -4258,18 +3945,18 @@ Editor::paste_internal (framepos_t position, float times) ts.push_back (_last_cut_copy_source_track); } - for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) { + if (internal_editing ()) { /* undo/redo is handled by individual tracks/regions */ - - if (internal_editing()) { - + + for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) { + RegionSelection rs; RegionSelection::iterator r; MidiNoteSelection::iterator cb; - + get_regions_at (rs, position, ts); - + for (cb = cut_buffer->midi_notes.begin(), r = rs.begin(); cb != cut_buffer->midi_notes.end() && r != rs.end(); ++r) { MidiRegionView* mrv = dynamic_cast (*r); @@ -4278,16 +3965,18 @@ Editor::paste_internal (framepos_t position, float times) ++cb; } } + } + + } else { - } else { + /* we do redo (do you do voodoo?) */ - if ((*i)->paste (position, times, *cut_buffer, nth)) { - commit = true; - } + begin_reversible_command (Operations::paste); + + for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) { + (*i)->paste (position, times, *cut_buffer, nth); } - } - - if (commit) { + commit_reversible_command (); } } @@ -4299,10 +3988,10 @@ Editor::duplicate_some_regions (RegionSelection& regions, float times) RegionSelection sel = regions; // clear (below) may clear the argument list if its the current region selection RegionSelection foo; - nframes_t const start_frame = regions.start (); - nframes_t const end_frame = regions.end_frame (); + framepos_t const start_frame = regions.start (); + framepos_t const end_frame = regions.end_frame (); - begin_reversible_command (_("duplicate region")); + begin_reversible_command (Operations::duplicate_region); selection->clear_regions (); @@ -4316,7 +4005,7 @@ 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(); - playlist->clear_changes (); + playlist->clear_changes (); playlist->duplicate (r, end_frame + (r->first_frame() - start_frame), times); _session->add_command(new StatefulDiffCommand (playlist)); @@ -4357,7 +4046,7 @@ Editor::duplicate_selection (float times) if ((playlist = (*i)->playlist()) == 0) { continue; } - playlist->clear_changes (); + playlist->clear_changes (); playlist->duplicate (*ri, selection->time[clicked_selection].end, times); _session->add_command (new StatefulDiffCommand (playlist)); @@ -4399,14 +4088,13 @@ Editor::center_edit_point () center_screen_internal (get_preferred_edit_position(), page); } +/** Caller must begin and commit a reversible command */ void Editor::clear_playlist (boost::shared_ptr playlist) { - begin_reversible_command (_("clear playlist")); - playlist->clear_changes (); + playlist->clear_changes (); playlist->clear (); _session->add_command (new StatefulDiffCommand (playlist)); - commit_reversible_command (); } void @@ -4439,17 +4127,17 @@ Editor::nudge_track (bool use_edit, bool forwards) continue; } - playlist->clear_changes (); - playlist->clear_owned_changes (); + playlist->clear_changes (); + playlist->clear_owned_changes (); playlist->nudge_after (start, distance, forwards); - - vector cmds; - - playlist->rdiff (cmds); + + vector cmds; + + playlist->rdiff (cmds); _session->add_commands (cmds); - - _session->add_command (new StatefulDiffCommand (playlist)); + + _session->add_command (new StatefulDiffCommand (playlist)); } commit_reversible_command (); @@ -4476,12 +4164,12 @@ Editor::remove_last_capture () if (prompter.run () == 1) { _session->remove_last_capture (); - _regions->redisplay (); + _regions->redisplay (); } } else { _session->remove_last_capture(); - _regions->redisplay (); + _regions->redisplay (); } } @@ -4492,8 +4180,8 @@ Editor::normalize_region () return; } - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -4504,56 +4192,53 @@ Editor::normalize_region () return; } - begin_reversible_command (_("normalize")); - - set_canvas_cursor (wait_cursor); + set_canvas_cursor (_cursors->wait); gdk_flush (); - /* XXX: this should really count only audio regions */ + /* XXX: should really only count audio regions here */ + int const regions = rs.size (); - int tasks = rs.size (); - if (!dialog.normalize_individually()) { - tasks *= 2; - } - - int n = 1; + /* Make a list of the selected audio regions' maximum amplitudes, and also + obtain the maximum amplitude of them all. + */ + list max_amps; + double max_amp = 0; + for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { + AudioRegionView const * arv = dynamic_cast (*i); + if (arv) { + dialog.descend (1.0 / regions); + double const a = arv->audio_region()->maximum_amplitude (&dialog); - double maxamp = 0; - if (!dialog.normalize_individually()) { - for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { - AudioRegionView* const arv = dynamic_cast (*r); - if (!arv) { - continue; + if (a == -1) { + /* the user cancelled the operation */ + set_canvas_cursor (current_canvas_cursor); + return; } - - dialog.descend (1.0 / tasks); - maxamp = max (maxamp, arv->audio_region()->maximum_amplitude (&dialog)); - dialog.ascend (); - dialog.set_progress (float (n) / tasks); - ++n; + max_amps.push_back (a); + max_amp = max (max_amp, a); + dialog.ascend (); } } + + begin_reversible_command (_("normalize")); + + list::const_iterator a = max_amps.begin (); for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { AudioRegionView* const arv = dynamic_cast (*r); if (!arv) { continue; } - arv->region()->clear_changes (); - double amp = maxamp; - if (dialog.normalize_individually()) { - dialog.descend (1.0 / tasks); - amp = arv->audio_region()->maximum_amplitude (&dialog); - dialog.ascend (); - } + arv->region()->clear_changes (); + double const amp = dialog.normalize_individually() ? *a : max_amp; + arv->audio_region()->normalize (amp, dialog.target ()); _session->add_command (new StatefulDiffCommand (arv->region())); - dialog.set_progress (float (n) / tasks); - ++n; + ++a; } commit_reversible_command (); @@ -4568,7 +4253,7 @@ Editor::reset_region_scale_amplitude () return; } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4580,7 +4265,7 @@ Editor::reset_region_scale_amplitude () AudioRegionView* const arv = dynamic_cast(*r); if (!arv) continue; - arv->region()->clear_changes (); + arv->region()->clear_changes (); arv->audio_region()->set_scale_amplitude (1.0f); _session->add_command (new StatefulDiffCommand (arv->region())); } @@ -4589,49 +4274,33 @@ Editor::reset_region_scale_amplitude () } void -Editor::adjust_region_scale_amplitude (bool up) +Editor::adjust_region_gain (bool up) { - if (!_session) { - return; - } - - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); - if (rs.empty()) { + if (!_session || rs.empty()) { return; } - begin_reversible_command ("denormalize"); + begin_reversible_command ("adjust region gain"); for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { AudioRegionView* const arv = dynamic_cast(*r); if (!arv) { continue; - } - - arv->region()->clear_changes (); - - double fraction = gain_to_slider_position (arv->audio_region()->scale_amplitude ()); - - if (up) { - fraction += 0.05; - fraction = min (fraction, 1.0); - } else { - fraction -= 0.05; - fraction = max (fraction, 0.0); } - if (!up && fraction <= 0) { - continue; - } + arv->region()->clear_changes (); - fraction = slider_position_to_gain (fraction); + double dB = accurate_coefficient_to_dB (arv->audio_region()->scale_amplitude ()); - if (up && fraction >= 2.0) { - continue; + if (up) { + dB += 1; + } else { + dB -= 1; } - arv->audio_region()->set_scale_amplitude (fraction); + arv->audio_region()->set_scale_amplitude (dB_to_coefficient (dB)); _session->add_command (new StatefulDiffCommand (arv->region())); } @@ -4657,28 +4326,32 @@ Editor::strip_region_silence () return; } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; } - std::list > ar; + std::list audio_only; for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { AudioRegionView* const arv = dynamic_cast (*i); if (arv) { - ar.push_back (arv->audio_region ()); + audio_only.push_back (arv); } } - StripSilenceDialog d (_session, ar); + StripSilenceDialog d (_session, audio_only); int const r = d.run (); - if (r == Gtk::RESPONSE_OK) { - StripSilence s (*_session, d.threshold (), d.minimum_length (), d.fade_length ()); + d.drop_rects (); + + if (r == Gtk::RESPONSE_OK) { + ARDOUR::AudioIntervalMap silences; + d.silences (silences); + StripSilence s (*_session, silences, d.fade_length()); apply_filter (s, _("strip silence"), &d); - } + } } Command* @@ -4698,7 +4371,7 @@ Editor::apply_midi_note_edit_op (MidiOperator& op) { Command* cmd; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4724,13 +4397,12 @@ Editor::apply_midi_note_edit_op (MidiOperator& op) } commit_reversible_command (); - rs.clear (); } void Editor::fork_region () { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4738,7 +4410,7 @@ Editor::fork_region () begin_reversible_command (_("Fork Region(s)")); - set_canvas_cursor (wait_cursor); + set_canvas_cursor (_cursors->wait); gdk_flush (); for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ) { @@ -4749,18 +4421,17 @@ Editor::fork_region () if (mrv) { boost::shared_ptr playlist = mrv->region()->playlist(); - boost::shared_ptr newregion = mrv->midi_region()->clone (); + boost::shared_ptr newregion = mrv->midi_region()->clone (); - playlist->clear_changes (); - playlist->replace_region (mrv->region(), newregion, mrv->region()->position()); - _session->add_command(new StatefulDiffCommand (playlist)); + playlist->clear_changes (); + playlist->replace_region (mrv->region(), newregion, mrv->region()->position()); + _session->add_command(new StatefulDiffCommand (playlist)); } r = tmp; } commit_reversible_command (); - rs.clear (); set_canvas_cursor (current_canvas_cursor); } @@ -4768,10 +4439,29 @@ Editor::fork_region () void Editor::quantize_region () { + int selected_midi_region_cnt = 0; + if (!_session) { return; } + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (rs.empty()) { + return; + } + + for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { + MidiRegionView* const mrv = dynamic_cast (*r); + if (mrv) { + selected_midi_region_cnt++; + } + } + + if (selected_midi_region_cnt == 0) { + return; + } + QuantizeDialog* qd = new QuantizeDialog (*this); qd->present (); @@ -4788,10 +4478,37 @@ Editor::quantize_region () } } +void +Editor::insert_patch_change () +{ + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty ()) { + return; + } + + framepos_t const p = get_preferred_edit_position (false); + + Evoral::PatchChange empty (0, 0, 0, 0); + PatchChangeDialog d (0, _session, empty, Gtk::Stock::ADD); + + if (d.run() == RESPONSE_CANCEL) { + return; + } + + for (RegionSelection::iterator i = rs.begin (); i != rs.end(); ++i) { + MidiRegionView* const mrv = dynamic_cast (*i); + if (mrv) { + if (p >= mrv->region()->first_frame() && p <= mrv->region()->last_frame()) { + mrv->add_patch_change (p - mrv->region()->position(), d.patch ()); + } + } + } +} + void Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4799,7 +4516,7 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress begin_reversible_command (command); - set_canvas_cursor (wait_cursor); + set_canvas_cursor (_cursors->wait); gdk_flush (); int n = 0; @@ -4849,7 +4566,6 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress if (progress) { progress->ascend (); - progress->set_progress (float (n + 1) / N); } } @@ -4858,67 +4574,21 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress } commit_reversible_command (); - rs.clear (); out: set_canvas_cursor (current_canvas_cursor); } -void -Editor::region_selection_op (void (Region::*pmf)(void)) -{ - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - Region* region = (*i)->region().get(); - (region->*pmf)(); - } -} - - -void -Editor::region_selection_op (void (Region::*pmf)(void*), void *arg) -{ - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - Region* region = (*i)->region().get(); - (region->*pmf)(arg); - } -} - -void -Editor::region_selection_op (void (Region::*pmf)(bool), bool yn) -{ - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - Region* region = (*i)->region().get(); - (region->*pmf)(yn); - } -} - void Editor::external_edit_region () { /* more to come */ } -void -Editor::brush (framepos_t pos) -{ - RegionSelection sel; - RegionSelection rs = get_regions_for_action (); - - snap_to (pos); - - if (rs.empty()) { - return; - } - - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - mouse_brush_insert_region ((*i), pos); - } -} - void Editor::reset_region_gain_envelopes () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -4943,7 +4613,11 @@ Editor::reset_region_gain_envelopes () void Editor::toggle_gain_envelope_visibility () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -4954,7 +4628,7 @@ Editor::toggle_gain_envelope_visibility () for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { AudioRegionView* const arv = dynamic_cast(*i); if (arv) { - arv->region()->clear_changes (); + arv->region()->clear_changes (); arv->set_envelope_visible (!arv->envelope_visible()); _session->add_command (new StatefulDiffCommand (arv->region())); } @@ -4966,7 +4640,11 @@ Editor::toggle_gain_envelope_visibility () void Editor::toggle_gain_envelope_active () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -4989,13 +4667,17 @@ Editor::toggle_gain_envelope_active () void Editor::toggle_region_lock () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; } - _session->begin_reversible_command (_("region lock")); + _session->begin_reversible_command (_("toggle region lock")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { (*i)->region()->clear_changes (); @@ -5009,7 +4691,11 @@ Editor::toggle_region_lock () void Editor::toggle_region_lock_style () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -5018,7 +4704,7 @@ Editor::toggle_region_lock_style () _session->begin_reversible_command (_("region lock style")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - (*i)->region()->clear_changes (); + (*i)->region()->clear_changes (); PositionLockStyle const ns = (*i)->region()->position_lock_style() == AudioTime ? MusicTime : AudioTime; (*i)->region()->set_position_lock_style (ns); _session->add_command (new StatefulDiffCommand ((*i)->region())); @@ -5027,37 +4713,20 @@ Editor::toggle_region_lock_style () _session->commit_reversible_command (); } - void -Editor::toggle_region_mute () +Editor::toggle_opaque_region () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); - - if (!_session || rs.empty()) { + if (_ignore_region_action) { return; } - - _session->begin_reversible_command (_("region mute")); - - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - (*i)->region()->clear_changes (); - (*i)->region()->set_muted (!(*i)->region()->muted()); - _session->add_command (new StatefulDiffCommand ((*i)->region())); - } - - _session->commit_reversible_command (); -} - -void -Editor::toggle_region_opaque () -{ - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; } - _session->begin_reversible_command (_("region opacity")); + _session->begin_reversible_command (_("change region opacity")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { (*i)->region()->clear_changes (); @@ -5093,7 +4762,7 @@ Editor::toggle_record_enable () void Editor::set_fade_length (bool in) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5161,59 +4830,10 @@ Editor::set_fade_length (bool in) commit_reversible_command (); } -void -Editor::toggle_fade_active (bool in) -{ - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { - return; - } - - const char* cmd = (in ? _("toggle fade in active") : _("toggle fade out active")); - bool have_switch = false; - bool yn = false; - - begin_reversible_command (cmd); - - for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) { - AudioRegionView* tmp = dynamic_cast (*x); - - if (!tmp) { - return; - } - - boost::shared_ptr region (tmp->audio_region()); - - /* make the behaviour consistent across all regions */ - - if (!have_switch) { - if (in) { - yn = region->fade_in_active(); - } else { - yn = region->fade_out_active(); - } - have_switch = true; - } - - region->clear_changes (); - - if (in) { - region->set_fade_in_active (!yn); - } else { - region->set_fade_out_active (!yn); - } - - _session->add_command(new StatefulDiffCommand (region)); - } - - commit_reversible_command (); -} - void Editor::set_fade_in_shape (FadeShape shape) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5244,7 +4864,7 @@ Editor::set_fade_in_shape (FadeShape shape) void Editor::set_fade_out_shape (FadeShape shape) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5274,7 +4894,7 @@ Editor::set_fade_out_shape (FadeShape shape) void Editor::set_fade_in_active (bool yn) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5292,7 +4912,7 @@ Editor::set_fade_in_active (bool yn) boost::shared_ptr ar (tmp->audio_region()); - ar->clear_changes (); + ar->clear_changes (); ar->set_fade_in_active (yn); _session->add_command (new StatefulDiffCommand (ar)); } @@ -5303,7 +4923,7 @@ Editor::set_fade_in_active (bool yn) void Editor::set_fade_out_active (bool yn) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5320,7 +4940,7 @@ Editor::set_fade_out_active (bool yn) boost::shared_ptr ar (tmp->audio_region()); - ar->clear_changes (); + ar->clear_changes (); ar->set_fade_out_active (yn); _session->add_command(new StatefulDiffCommand (ar)); } @@ -5329,18 +4949,18 @@ Editor::set_fade_out_active (bool yn) } void -Editor::toggle_selected_region_fades (int dir) +Editor::toggle_region_fades (int dir) { - RegionSelection::iterator i; boost::shared_ptr ar; bool yn; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; } + RegionSelection::iterator i; for (i = rs.begin(); i != rs.end(); ++i) { if ((ar = boost::dynamic_pointer_cast((*i)->region())) != 0) { if (dir == -1) { @@ -5458,18 +5078,18 @@ Editor::set_playhead_cursor () } void -Editor::split () +Editor::split_region () { - if (((mouse_mode == MouseRange) || - (mouse_mode != MouseObject && _join_object_range_state == JOIN_OBJECT_RANGE_RANGE)) && - !selection->time.empty()) { - separate_regions_between (selection->time); - return; - } + if (((mouse_mode == MouseRange) || + (mouse_mode != MouseObject && _join_object_range_state == JOIN_OBJECT_RANGE_RANGE)) && + !selection->time.empty()) { + separate_regions_between (selection->time); + return; + } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_edit_point (); - framepos_t where = get_preferred_edit_position(); + framepos_t where = get_preferred_edit_position (); if (rs.empty()) { return; @@ -5579,7 +5199,7 @@ Editor::ensure_track_visible(TimeAxisView *track) double const track_max_y = track->y_position () + track->effective_height (); if (track_min_y >= current_view_min_y && - track_max_y <= current_view_max_y) { + track_max_y <= current_view_max_y) { return; } @@ -5642,7 +5262,7 @@ Editor::set_loop_from_region (bool play) framepos_t start = max_framepos; framepos_t end = 0; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5701,7 +5321,7 @@ Editor::set_punch_from_region () framepos_t start = max_framepos; framepos_t end = 0; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5720,9 +5340,9 @@ Editor::set_punch_from_region () } void -Editor::pitch_shift_regions () +Editor::pitch_shift_region () { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5732,15 +5352,11 @@ Editor::pitch_shift_regions () } void -Editor::use_region_as_bar () +Editor::set_tempo_from_region () { - if (!_session) { - return; - } - - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -5849,13 +5465,9 @@ Editor::split_region_at_transients () { AnalysisFeatureList positions; - if (!_session) { - return; - } + RegionSelection rs = get_regions_from_selection_and_entered (); - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -5883,11 +5495,13 @@ Editor::split_region_at_transients () } void -Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList& positions, bool can_ferret) +Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList& positions, bool can_ferret, bool select_new) { bool use_rhythmic_rodent = false; - + boost::shared_ptr pl = r->playlist(); + + list > new_regions; if (!pl) { return; @@ -5898,7 +5512,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList } - if (positions.size() > 20) { + if (positions.size() > 20 && can_ferret) { std::string 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, @@ -5936,7 +5550,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList AnalysisFeatureList::const_iterator x; - pl->clear_changes (); + pl->clear_changes (); x = positions.begin(); @@ -5952,7 +5566,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList while (x != positions.end()) { /* deal with positons that are out of scope of present region bounds */ - if (*x <= 0 || *x > r->length()){ + if (*x <= 0 || *x > r->length()) { ++x; continue; } @@ -5991,8 +5605,13 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList plist.add (ARDOUR::Properties::layer, 0); boost::shared_ptr nr = RegionFactory::create (r->sources(), plist, false); + pl->add_region (nr, r->position() + pos); + if (select_new) { + new_regions.push_front(nr); + } + pos += len; ++x; } @@ -6011,11 +5630,21 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList boost::shared_ptr nr = RegionFactory::create (r->sources(), plist, false); pl->add_region (nr, r->position() + pos); - + if (select_new) { + new_regions.push_front(nr); + } + pl->thaw (); _session->add_command (new StatefulDiffCommand (pl)); + + if (select_new) { + + for (list >::iterator i = new_regions.begin(); i != new_regions.end(); ++i){ + set_selected_regionview_from_region_list ((*i), Selection::Add); + } + } } void @@ -6025,7 +5654,7 @@ Editor::place_transient() return; } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_edit_point (); if (rs.empty()) { return; @@ -6050,92 +5679,102 @@ Editor::remove_transient(ArdourCanvas::Item* item) return; } - ArdourCanvas::SimpleLine* _line = reinterpret_cast (item); + ArdourCanvas::Line* _line = reinterpret_cast (item); assert (_line); AudioRegionView* _arv = reinterpret_cast (item->get_data ("regionview")); - _arv->remove_transient(_line->property_x1()); + _arv->remove_transient (*(float*) _line->get_data ("position")); } void -Editor::snap_regions_to_grid() +Editor::snap_regions_to_grid () { - if (!_session) { - return; - } - - RegionSelection rs = get_regions_for_action (); + list > used_playlists; + + RegionSelection rs = get_regions_from_selection_and_entered (); - if (rs.empty()) { + if (!_session || rs.empty()) { return; } _session->begin_reversible_command (_("snap regions to grid")); for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { + + boost::shared_ptr pl = (*r)->region()->playlist(); + + if (!pl->frozen()) { + /* we haven't seen this playlist before */ + + /* remember used playlists so we can thaw them later */ + used_playlists.push_back(pl); + pl->freeze(); + } + framepos_t start_frame = (*r)->region()->first_frame (); snap_to (start_frame); (*r)->region()->set_position (start_frame, this); } + while (used_playlists.size() > 0) { + list >::iterator i = used_playlists.begin(); + (*i)->thaw(); + used_playlists.pop_front(); + } + _session->commit_reversible_command (); } void -Editor::close_region_gaps() -{ - if (!_session) { - return; - } - - RegionSelection rs = get_regions_for_action (); +Editor::close_region_gaps () +{ + list > used_playlists; - if (rs.empty()) { + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (!_session || rs.empty()) { return; } - - Dialog dialog (rs.size() > 1 ? _("Conform regions") : _("Conform region")); - - HBox hbox_crossfade; - hbox_crossfade.set_spacing (10); - //hbox_crossfade.set_border_width (3); - hbox_crossfade.pack_start (*manage (new Label (_("Crossfade length:")))); + + Dialog dialog (_("Close Region Gaps")); + + Table table (2, 3); + table.set_spacings (12); + table.set_border_width (12); + Label* l = manage (new Label (_("Crossfade length"))); + l->set_alignment (0, 0.5); + table.attach (*l, 0, 1, 0, 1); SpinButton spin_crossfade (1, 0); spin_crossfade.set_range (0, 15); spin_crossfade.set_increments (1, 1); - spin_crossfade.set_value (3); - - hbox_crossfade.pack_start (spin_crossfade); - hbox_crossfade.pack_start (*manage (new Label (_("ms")))); - hbox_crossfade.show_all (); + spin_crossfade.set_value (5); + table.attach (spin_crossfade, 1, 2, 0, 1); - HBox hbox_pullback; - - hbox_pullback.set_spacing (10); - //hbox_pullback.set_border_width (3); - hbox_pullback.pack_start (*manage (new Label (_("Pull-back length:")))); + table.attach (*manage (new Label (_("ms"))), 2, 3, 0, 1); + + l = manage (new Label (_("Pull-back length"))); + l->set_alignment (0, 0.5); + table.attach (*l, 0, 1, 1, 2); SpinButton spin_pullback (1, 0); - spin_pullback.set_range (0, 15); + spin_pullback.set_range (0, 100); spin_pullback.set_increments (1, 1); - spin_pullback.set_value (5); - - hbox_pullback.pack_start (spin_pullback); - hbox_pullback.pack_start (*manage (new Label (_("ms")))); - hbox_pullback.show_all (); + spin_pullback.set_value(30); + table.attach (spin_pullback, 1, 2, 1, 2); + + table.attach (*manage (new Label (_("ms"))), 2, 3, 1, 2); - dialog.get_vbox()->set_spacing (6); - dialog.get_vbox()->pack_start (hbox_crossfade); - dialog.get_vbox()->pack_start (hbox_pullback); + dialog.get_vbox()->pack_start (table); dialog.add_button (Stock::CANCEL, RESPONSE_CANCEL); dialog.add_button (_("Ok"), RESPONSE_ACCEPT); + dialog.show_all (); if (dialog.run () == RESPONSE_CANCEL) { return; } - framepos_t crossfade_len = spin_crossfade.get_value(); + framepos_t crossfade_len = spin_crossfade.get_value(); framepos_t pull_back_frames = spin_pullback.get_value(); crossfade_len = lrintf (crossfade_len * _session->frame_rate()/1000); @@ -6144,13 +5783,23 @@ Editor::close_region_gaps() /* Iterate over the region list and make adjacent regions overlap by crossfade_len_ms */ _session->begin_reversible_command (_("close region gaps")); - + int idx = 0; boost::shared_ptr last_region; rs.sort_by_position_and_track(); for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { + + boost::shared_ptr pl = (*r)->region()->playlist(); + + if (!pl->frozen()) { + /* we haven't seen this playlist before */ + + /* remember used playlists so we can thaw them later */ + used_playlists.push_back(pl); + pl->freeze(); + } framepos_t position = (*r)->region()->position(); @@ -6168,6 +5817,12 @@ Editor::close_region_gaps() idx++; } + while (used_playlists.size() > 0) { + list >::iterator i = used_playlists.begin(); + (*i)->thaw(); + used_playlists.pop_front(); + } + _session->commit_reversible_command (); } @@ -6176,6 +5831,8 @@ Editor::tab_to_transient (bool forward) { AnalysisFeatureList positions; + RegionSelection rs = get_regions_from_selection_and_entered (); + if (!_session) { return; } @@ -6205,8 +5862,6 @@ Editor::tab_to_transient (bool forward) } else { - RegionSelection rs = get_regions_for_action (); - if (rs.empty()) { return; } @@ -6277,7 +5932,7 @@ Editor::set_track_height (Height h) TrackSelection& ts (selection->tracks); for (TrackSelection::iterator x = ts.begin(); x != ts.end(); ++x) { - (*x)->set_height (h); + (*x)->set_height_enum (h); } } @@ -6300,7 +5955,7 @@ Editor::toggle_tracks_active () target = !rtv->_route->active(); first = false; } - rtv->_route->set_active (target); + rtv->_route->set_active (target, this); } } } @@ -6321,7 +5976,7 @@ Editor::remove_tracks () const char* trackstr; const char* busstr; vector > routes; - bool special_bus = false; + bool special_bus = false; for (TrackSelection::iterator x = ts.begin(); x != ts.end(); ++x) { RouteTimeAxisView* rtv = dynamic_cast (*x); @@ -6334,31 +5989,31 @@ Editor::remove_tracks () } routes.push_back (rtv->_route); - if (rtv->route()->is_master() || rtv->route()->is_monitor()) { - special_bus = true; - } - } + if (rtv->route()->is_master() || rtv->route()->is_monitor()) { + special_bus = true; + } + } - if (special_bus && !Config->get_allow_special_bus_removal()) { - MessageDialog msg (_("That would be bad news ...."), - false, - Gtk::MESSAGE_INFO, - Gtk::BUTTONS_OK); - msg.set_secondary_text (string_compose (_( -"Removing the master or monitor bus is such a bad idea\n\ + if (special_bus && !Config->get_allow_special_bus_removal()) { + MessageDialog msg (_("That would be bad news ...."), + false, + Gtk::MESSAGE_INFO, + Gtk::BUTTONS_OK); + msg.set_secondary_text (string_compose (_( + "Removing the master or monitor bus is such a bad idea\n\ that %1 is not going to allow it.\n\ \n\ If you really want to do this sort of thing\n\ edit your ardour.rc file to set the\n\ \"allow-special-bus-removal\" option to be \"yes\""), PROGRAM_NAME)); - msg.present (); - msg.run (); - return; - } - + msg.present (); + msg.run (); + return; + } + if (ntracks + nbusses == 0) { - return; + return; } if (ntracks > 1) { @@ -6387,7 +6042,7 @@ edit your ardour.rc file to set the\n\ } } else if (nbusses) { prompt = string_compose (_("Do you really want to remove %1 %2?\n\n" - "This action cannot be undon, and the session file will be overwritten"), + "This action cannot be undon, and the session file will be overwritten"), nbusses, busstr); } @@ -6467,7 +6122,7 @@ Editor::insert_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt, if (pl) { pl->clear_changes (); - pl->clear_owned_changes (); + pl->clear_owned_changes (); if (opt == SplitIntersected) { pl->split (pos); @@ -6475,8 +6130,8 @@ Editor::insert_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt, pl->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue); - vector cmds; - pl->rdiff (cmds); + vector cmds; + pl->rdiff (cmds); _session->add_commands (cmds); _session->add_command (new StatefulDiffCommand (pl)); @@ -6541,7 +6196,31 @@ Editor::insert_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt, void Editor::fit_selected_tracks () { - fit_tracks (selection->tracks); + if (!selection->tracks.empty()) { + fit_tracks (selection->tracks); + } else { + TrackViewList tvl; + + /* no selected tracks - use tracks with selected regions */ + + if (!selection->regions.empty()) { + for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) { + tvl.push_back (&(*r)->get_time_axis_view ()); + } + + if (!tvl.empty()) { + fit_tracks (tvl); + } + } else if (internal_editing()) { + /* no selected tracks, or regions, but in internal edit mode, so follow the mouse and use + the entered track + */ + if (entered_track) { + tvl.push_back (entered_track); + fit_tracks (tvl); + } + } + } } void @@ -6552,6 +6231,7 @@ Editor::fit_tracks (TrackViewList & tracks) } uint32_t child_heights = 0; + int visible_tracks = 0; for (TrackSelection::iterator t = tracks.begin(); t != tracks.end(); ++t) { @@ -6560,9 +6240,10 @@ Editor::fit_tracks (TrackViewList & tracks) } child_heights += (*t)->effective_height() - (*t)->current_height(); + ++visible_tracks; } - uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / tracks.size()); + uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / visible_tracks); double first_y_pos = DBL_MAX; if (h < TimeAxisView::preset_height (HeightSmall)) { @@ -6603,12 +6284,14 @@ Editor::fit_tracks (TrackViewList & tracks) next_is_selected = false; } - if (is_selected) { - (*t)->set_height (h); - first_y_pos = std::min ((*t)->y_position (), first_y_pos); - } else { - if (prev_was_selected && next_is_selected) { - hide_track_in_display (*t); + if ((*t)->marked_for_display ()) { + if (is_selected) { + (*t)->set_height (h); + first_y_pos = std::min ((*t)->y_position (), first_y_pos); + } else { + if (prev_was_selected && next_is_selected) { + hide_track_in_display (*t); + } } } @@ -6691,3 +6374,33 @@ Editor::end_visual_state_op (uint32_t n) return false; // do not call again } +void +Editor::toggle_region_mute () +{ + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (rs.empty ()) { + return; + } + + if (rs.size() > 1) { + begin_reversible_command (_("mute regions")); + } else { + begin_reversible_command (_("mute region")); + } + + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + + (*i)->region()->playlist()->clear_changes (); + (*i)->region()->set_muted (!(*i)->region()->muted ()); + _session->add_command (new StatefulDiffCommand ((*i)->region()->playlist())); + + } + + commit_reversible_command (); +} +