X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_ops.cc;h=55382bbacaed10f2821ad28e01364dbb72248ad4;hb=162c48b84381335ff90fe64b5324467693dee736;hp=a90ffb0801ebfa65cee906a10f063b4cffb39e03;hpb=804da5653127aaedda057d3c683be5817f335fef;p=ardour.git diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index a90ffb0801..55382bbaca 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -55,6 +55,7 @@ #include "ardour/dB.h" #include "ardour/quantize.h" #include "ardour/strip_silence.h" +#include "ardour/route_group.h" #include "ardour_ui.h" #include "editor.h" @@ -76,6 +77,8 @@ #include "utils.h" #include "editor_drag.h" #include "strip_silence_dialog.h" +#include "editor_routes.h" +#include "editor_regions.h" #include "i18n.h" @@ -109,17 +112,11 @@ Editor::redo (uint32_t n) void Editor::split_region () -{ - split_region_at (get_preferred_edit_position()); -} - -void -Editor::split_region_at (nframes64_t where) { RegionSelection rs; - get_regions_for_action (rs); - split_regions_at (where, selection->regions); + get_regions_for_action (rs, true); + split_regions_at (get_preferred_edit_position (), selection->regions); } void @@ -201,7 +198,7 @@ Editor::split_regions_at (nframes64_t where, RegionSelection& regions) } boost::shared_ptr -Editor::select_region_for_operation (int dir, TimeAxisView **tv) +Editor::select_region_for_operation (int /*dir*/, TimeAxisView **tv) { RegionView* rv; boost::shared_ptr region; @@ -1748,8 +1745,8 @@ Editor::temporal_zoom_region (bool both_axes) } /* hide irrelevant tracks */ - - no_route_list_redisplay = true; + + _routes->suspend_redisplay (); for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) { @@ -1757,8 +1754,7 @@ Editor::temporal_zoom_region (bool both_axes) } } - no_route_list_redisplay = false; - redisplay_route_list (); + _routes->resume_redisplay (); vertical_adjustment.set_value (0.0); no_save_visual = false; @@ -1804,7 +1800,7 @@ Editor::temporal_zoom_session () } void -Editor::temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & op) +Editor::temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & /*op*/) { if (!session) return; @@ -2319,29 +2315,17 @@ Editor::insert_region_list_selection (float times) if ((playlist = tv->playlist()) == 0) { return; } - - Glib::RefPtr selected = region_list_display.get_selection(); - - if (selected->count_selected_rows() != 1) { + + boost::shared_ptr region = _regions->get_single_selection (); + if (region == 0) { return; } - - TreeView::Selection::ListHandle_Path rows = selected->get_selected_rows (); - - /* only one row selected, so rows.begin() is it */ - - TreeIter iter; - - if ((iter = region_list_model->get_iter (*rows.begin()))) { - - boost::shared_ptr region = (*iter)[region_list_columns.region]; - begin_reversible_command (_("insert region")); - XMLNode &before = playlist->get_state(); - playlist->add_region ((RegionFactory::create (region)), get_preferred_edit_position(), times); - session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); - commit_reversible_command (); - } + begin_reversible_command (_("insert region")); + XMLNode &before = playlist->get_state(); + playlist->add_region ((RegionFactory::create (region)), get_preferred_edit_position(), times); + session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + commit_reversible_command (); } /* BUILT-IN EFFECTS */ @@ -2595,7 +2579,7 @@ Editor::rename_region() strip_whitespace_edges (str); if (!str.empty()) { rs.front()->region()->set_name (str); - redisplay_regions (); + _regions->redisplay (); } } } @@ -2709,9 +2693,11 @@ Editor::region_from_selection () nframes64_t start = selection->time[clicked_selection].start; nframes64_t end = selection->time[clicked_selection].end; + TrackSelection tracks = get_tracks_for_range_action (); + nframes64_t selection_cnt = end - start + 1; - for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { + for (TrackSelection::iterator i = tracks.begin(); i != tracks.end(); ++i) { boost::shared_ptr current; boost::shared_ptr pl; nframes64_t internal_start; @@ -2802,41 +2788,52 @@ add_if_covered (RegionView* rv, const AudioRange* ar, RegionSelection* rs) } } -void -Editor::separate_regions_between (const TimeSelection& ts) +/** Return either: + * - selected tracks, or if there are none... + * - tracks containing selected regions, or if there are none... + * - all tracks + * @return tracks. + */ +TrackSelection +Editor::get_tracks_for_range_action () const { - bool in_command = false; - boost::shared_ptr playlist; - RegionSelection new_selection; - TrackSelection tmptracks; - + TrackSelection t; + if (selection->tracks.empty()) { /* use tracks with selected regions */ - RegionSelection rs; - - get_regions_for_action (rs); + RegionSelection rs = selection->regions; 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()) { - tmptracks.push_back (tv); + if (!t.contains (tv)) { + t.push_back (tv); } } - if (tmptracks.empty()) { - /* no regions selected: do nothing */ - return; + if (t.empty()) { + /* no regions and no tracks: use all tracks */ + t = track_views; } } else { - tmptracks = selection->tracks; - + t = selection->tracks; } + return t; +} + +void +Editor::separate_regions_between (const TimeSelection& ts) +{ + bool in_command = false; + boost::shared_ptr playlist; + RegionSelection new_selection; + + TrackSelection tmptracks = get_tracks_for_range_action (); sort_track_selection (&tmptracks); for (TrackSelection::iterator i = tmptracks.begin(); i != tmptracks.end(); ++i) { @@ -2911,6 +2908,10 @@ Editor::separate_regions_between (const TimeSelection& ts) } } +/** Take tracks from get_tracks_for_range_action and cut any regions + * on those tracks so that the tracks are empty over the time + * selection. + */ void Editor::separate_region_from_selection () { @@ -3119,16 +3120,11 @@ Editor::region_fill_selection () return; } - - Glib::RefPtr selected = region_list_display.get_selection(); - - if (selected->count_selected_rows() != 1) { + boost::shared_ptr region = _regions->get_single_selection (); + if (region == 0) { return; } - TreeModel::iterator i = region_list_display.get_selection()->get_selected(); - boost::shared_ptr region = (*i)[region_list_columns.region]; - nframes64_t start = selection->time[clicked_selection].start; nframes64_t end = selection->time[clicked_selection].end; @@ -3705,7 +3701,7 @@ Editor::freeze_thread () } gint -Editor::freeze_progress_timeout (void *arg) +Editor::freeze_progress_timeout (void */*arg*/) { interthread_progress_bar.set_fraction (current_interthread_info->progress); return !(current_interthread_info->done || current_interthread_info->cancel); @@ -4575,17 +4571,35 @@ Editor::remove_last_capture () void Editor::normalize_region () { - RegionSelection rs; - - get_regions_for_action (rs); - if (!session) { return; } + RegionSelection rs; + get_regions_for_action (rs); + if (rs.empty()) { return; } + + Dialog dialog (rs.size() > 1 ? _("Normalize regions") : _("Normalize region")); + HBox hbox; + hbox.pack_start (*manage (new Label (_("Normalize to:")))); + SpinButton spin (0.2, 2); + spin.set_range (-112, 0); + spin.set_increments (0.1, 1); + spin.set_value (0); + hbox.pack_start (spin); + spin.set_value (_last_normalization_value); + hbox.pack_start (*manage (new Label (_("dbFS")))); + hbox.show_all (); + dialog.get_vbox()->pack_start (hbox); + dialog.add_button (Stock::CANCEL, RESPONSE_CANCEL); + dialog.add_button (_("Normalize"), RESPONSE_ACCEPT); + + if (dialog.run () == RESPONSE_CANCEL) { + return; + } begin_reversible_command (_("normalize")); @@ -4597,12 +4611,14 @@ Editor::normalize_region () if (!arv) continue; XMLNode &before = arv->region()->get_state(); - arv->audio_region()->normalize_to (0.0f); + arv->audio_region()->normalize_to (spin.get_value()); session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); } commit_reversible_command (); track_canvas->get_window()->set_cursor (*current_canvas_cursor); + + _last_normalization_value = spin.get_value (); } @@ -4873,9 +4889,7 @@ Editor::brush (nframes64_t pos) void Editor::reset_region_gain_envelopes () { - RegionSelection rs; - - get_regions_for_action (rs); + RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit); if (!session || rs.empty()) { return; @@ -4900,80 +4914,134 @@ Editor::reset_region_gain_envelopes () void Editor::toggle_gain_envelope_visibility () { - RegionSelection rs; + RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit); - get_regions_for_action (rs); + if (!session || rs.empty()) { + return; + } + + session->begin_reversible_command (_("region gain envelope visible")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { AudioRegionView* const arv = dynamic_cast(*i); if (arv) { + XMLNode &before = arv->region()->get_state (); arv->set_envelope_visible (!arv->envelope_visible()); + XMLNode &after = arv->region()->get_state (); + session->add_command (new MementoCommand (*(arv->region().get()), &before, &after)); } } + + session->commit_reversible_command (); } void Editor::toggle_gain_envelope_active () { - RegionSelection rs; + RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit); - get_regions_for_action (rs); + if (!session || rs.empty()) { + return; + } + + session->begin_reversible_command (_("region gain envelope active")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { AudioRegionView* const arv = dynamic_cast(*i); if (arv) { + XMLNode &before = arv->region()->get_state (); arv->audio_region()->set_envelope_active (!arv->audio_region()->envelope_active()); + XMLNode &after = arv->region()->get_state (); + session->add_command (new MementoCommand (*(arv->region().get()), &before, &after)); } } + + session->commit_reversible_command (); } void Editor::toggle_region_lock () { - RegionSelection rs; + RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit); - get_regions_for_action (rs); + if (!session || rs.empty()) { + return; + } + + session->begin_reversible_command (_("region lock")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + XMLNode &before = (*i)->region()->get_state (); (*i)->region()->set_locked (!(*i)->region()->locked()); + XMLNode &after = (*i)->region()->get_state (); + session->add_command (new MementoCommand (*((*i)->region().get()), &before, &after)); } + + session->commit_reversible_command (); } void Editor::set_region_lock_style (Region::PositionLockStyle ps) { - RegionSelection rs; + RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit); - get_regions_for_action (rs); + if (!session || rs.empty()) { + return; + } + + session->begin_reversible_command (_("region lock style")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + XMLNode &before = (*i)->region()->get_state (); (*i)->region()->set_position_lock_style (ps); + XMLNode &after = (*i)->region()->get_state (); + session->add_command (new MementoCommand (*((*i)->region().get()), &before, &after)); } + + session->commit_reversible_command (); } void Editor::toggle_region_mute () { - RegionSelection rs; + RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit); - get_regions_for_action (rs); + if (!session || rs.empty()) { + return; + } + + session->begin_reversible_command (_("region mute")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + XMLNode &before = (*i)->region()->get_state (); (*i)->region()->set_muted (!(*i)->region()->muted()); + XMLNode &after = (*i)->region()->get_state (); + session->add_command (new MementoCommand (*((*i)->region().get()), &before, &after)); } + + session->commit_reversible_command (); } void Editor::toggle_region_opaque () { - RegionSelection rs; + RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit); - get_regions_for_action (rs); + if (!session || rs.empty()) { + return; + } + + session->begin_reversible_command (_("region opacity")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + XMLNode &before = (*i)->region()->get_state (); (*i)->region()->set_opaque (!(*i)->region()->opaque()); + XMLNode &after = (*i)->region()->get_state (); + session->add_command (new MementoCommand (*((*i)->region().get()), &before, &after)); } + + session->commit_reversible_command (); } void @@ -5003,20 +5071,16 @@ Editor::set_fade_length (bool in) { RegionSelection rs; - get_regions_for_action (rs); - - /* we need a region to measure the offset from the start */ - - RegionView* rv; + get_regions_for_action (rs, true); - if (!rs.empty()) { - rv = rs.front(); - } else if (entered_regionview) { - rv = entered_regionview; - } else { + if (rs.empty()) { return; } + /* we need a region to measure the offset from the start */ + + RegionView* rv = rs.front (); + nframes64_t pos = get_preferred_edit_position(); nframes64_t len; char* cmd; @@ -5392,7 +5456,7 @@ Editor::split () { RegionSelection rs; - get_regions_for_action (rs); + get_regions_for_action (rs, true); nframes64_t where = get_preferred_edit_position(); @@ -6046,10 +6110,6 @@ Editor::set_track_height (uint32_t h) { TrackSelection& ts (selection->tracks); - if (ts.empty()) { - return; - } - for (TrackSelection::iterator x = ts.begin(); x != ts.end(); ++x) { (*x)->set_height (h); } @@ -6312,15 +6372,21 @@ Editor::insert_time (nframes64_t pos, nframes64_t frames, InsertTimeOption opt, } void -Editor::fit_tracks () +Editor::fit_selected_tracks () { - if (selection->tracks.empty()) { + fit_tracks (selection->tracks); +} + +void +Editor::fit_tracks (TrackSelection & tracks) +{ + if (tracks.empty()) { return; } uint32_t child_heights = 0; - for (TrackSelection::iterator t = selection->tracks.begin(); t != selection->tracks.end(); ++t) { + for (TrackSelection::iterator t = tracks.begin(); t != tracks.end(); ++t) { if (!(*t)->marked_for_display()) { continue; @@ -6329,11 +6395,11 @@ Editor::fit_tracks () child_heights += (*t)->effective_height() - (*t)->current_height(); } - uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize)/selection->tracks.size()); + uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / tracks.size()); double first_y_pos = DBL_MAX; if (h < TimeAxisView::hSmall) { - MessageDialog msg (*this, _("There are too many selected tracks to fit in the current window")); + MessageDialog msg (*this, _("There are too many tracks to fit in the current window")); /* too small to be displayed */ return; } @@ -6343,7 +6409,7 @@ Editor::fit_tracks () /* operate on all tracks, hide unselected ones that are in the middle of selected ones */ bool prev_was_selected = false; - bool is_selected = selection->selected (track_views.front()); + bool is_selected = tracks.contains (track_views.front()); bool next_is_selected; for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) { @@ -6354,7 +6420,7 @@ Editor::fit_tracks () ++next; if (next != track_views.end()) { - next_is_selected = selection->selected (*next); + next_is_selected = tracks.contains (*next); } else { next_is_selected = false; }