diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-01-30 22:53:22 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-01-30 22:53:22 +0000 |
commit | 7629120cda89dd4ec1b03ba4ddcc6f5dd1b0ca5a (patch) | |
tree | 8021cafa93fb6bec082a7362261f9040947f5329 | |
parent | 664cec21359ba055243c3feaf47c6eb16fccbb3b (diff) |
many changes, large and small, related to smart mode editing, range/region selection, and behaviour of playhead when always-play-range is enabled. could be buggy, but probably in subtle (or even very subtle) ways rather than obvious
git-svn-id: svn://localhost/ardour2/branches/3.0@11394 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 8 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui2.cc | 16 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_ed.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_options.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 17 | ||||
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 46 | ||||
-rw-r--r-- | gtk2_ardour/editor_drag.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 66 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 19 | ||||
-rw-r--r-- | gtk2_ardour/editor_selection.cc | 36 | ||||
-rw-r--r-- | gtk2_ardour/selection.cc | 16 | ||||
-rw-r--r-- | libs/ardour/ardour/rc_configuration_vars.h | 1 |
13 files changed, 152 insertions, 84 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 7845918870..a11b3800fa 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1728,12 +1728,12 @@ ARDOUR_UI::transport_roll () if (!Config->get_seamless_loop()) { _session->request_play_loop (false, true); } - } else if (_session->get_play_range () && !join_play_range_button.active_state()) { + } else if (_session->get_play_range () && !Config->get_always_play_range()) { /* stop playing a range if we currently are */ _session->request_play_range (0, true); } - if (join_play_range_button.active_state()) { + if (Config->get_always_play_range()) { _session->request_play_range (&editor->get_selection().time, true); } @@ -1792,7 +1792,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (rolling) { _session->request_stop (with_abort, true); } else { - if (join_play_range_button.active_state()) { + if (Config->get_always_play_range ()) { _session->request_play_range (&editor->get_selection().time, true); } @@ -1957,7 +1957,7 @@ ARDOUR_UI::map_transport_state () auto_loop_button.unset_active_state (); } - if (join_play_range_button.active_state()) { + if (Config->get_always_play_range()) { /* light up both roll and play-selection if they are joined */ roll_button.set_active_state (Gtkmm2ext::Active); play_selection_button.set_active_state (Gtkmm2ext::Active); diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 9f0af76285..e209b2c23f 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -418,7 +418,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr boost::shared_ptr<TransportControllable> play_selection_controllable; boost::shared_ptr<TransportControllable> rec_controllable; - void join_play_range_clicked (); + void toggle_always_play_range (); void set_transport_controllable_state (const XMLNode&); XMLNode& get_transport_controllable_state (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 69228c4161..1858011164 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -294,8 +294,8 @@ ARDOUR_UI::setup_transport () midi_panic_button.set_related_action (act); act = ActionManager::get_action (X_("Transport"), X_("ToggleExternalSync")); sync_button.set_related_action (act); - - join_play_range_button.signal_clicked.connect (sigc::mem_fun (*this, &ARDOUR_UI::join_play_range_clicked)); + act = ActionManager::get_action (X_("Transport"), X_("AlwaysPlayRange")); + join_play_range_button.set_related_action (act); /* clocks, etc. */ @@ -624,7 +624,15 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev) } void -ARDOUR_UI::join_play_range_clicked () +ARDOUR_UI::toggle_always_play_range () { - join_play_range_button.set_active (!join_play_range_button.get_active()); + RefPtr<Action> act = ActionManager::get_action (X_("Transport"), X_("AlwaysPlayRange")); + assert (act); + + RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act); + assert (tact); + + Config->set_always_play_range (tact->get_active ()); } + + diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 9f6b181b4d..b7505e00a9 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -288,6 +288,10 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_toggle_action (transport_actions, X_("AlwaysPlayRange"), _("Always Play Range"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_always_play_range)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 27750eeb43..dcb95a0e69 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -318,6 +318,10 @@ ARDOUR_UI::parameter_changed (std::string p) ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (false); } + } else if (p == "always-play-range") { + + ActionManager::map_some_state ("Transport", "AlwaysPlayRange", &RCConfiguration::get_always_play_range); + } else if (p == "send-mtc") { ActionManager::map_some_state ("options", "SendMTC", &RCConfiguration::get_send_mtc); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index d9f3669730..7c681cfaf3 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -281,6 +281,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void invert_selection_in_track (); void invert_selection (); void deselect_all (); + long select_range (framepos_t, framepos_t); void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set); @@ -652,15 +653,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false); void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false); - void set_selected_track_as_side_effect (Selection::Operation op, bool force = false); - bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false); + void set_selected_track_as_side_effect (Selection::Operation op); + bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set); bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr<ARDOUR::Region>); void collect_new_region_view (RegionView *); void collect_and_select_new_region_view (RegionView *); - long select_range_around_region (RegionView *); - Gtk::Menu track_context_menu; Gtk::Menu track_region_context_menu; Gtk::Menu track_selection_context_menu; @@ -2082,6 +2081,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD int time_fx (ARDOUR::RegionList&, float val, bool pitching); + bool doing_range_stuff() const { + return (mouse_mode == Editing::MouseRange && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) || + _join_object_range_state == JOIN_OBJECT_RANGE_RANGE; + } + + bool doing_object_stuff() const { + return (mouse_mode == Editing::MouseObject && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) || + _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT; + } + friend class Drag; friend class RegionDrag; friend class RegionMoveDrag; diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 380482b703..692ca864b5 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -897,6 +897,10 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred) ); } + + if (_editor->session() && Config->get_always_play_range()) { + _editor->session()->request_locate (_editor->get_selection().regions.start()); + } } void @@ -3364,6 +3368,7 @@ SelectionDrag::SelectionDrag (Editor* e, ArdourCanvas::Item* i, Operation o) , _copy (false) , _original_pointer_time_axis (-1) , _last_pointer_time_axis (-1) + , _time_selection_at_start (!_editor->get_selection().time.empty()) { DEBUG_TRACE (DEBUG::Drags, "New SelectionDrag\n"); } @@ -3595,16 +3600,42 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred) } /* XXX what if its a music time selection? */ - if (s && (s->config.get_auto_play() || (s->get_play_range() && s->transport_rolling()))) { - s->request_play_range (&_editor->selection->time, true); + if (s) { + if ((s->config.get_auto_play() || (s->get_play_range() && s->transport_rolling()))) { + s->request_play_range (&_editor->selection->time, true); + } else { + if (Config->get_always_play_range()) { + if (_editor->doing_range_stuff()) { + s->request_locate (_editor->get_selection().time.start()); + } + } + } } - } else { - /* just a click, no pointer movement.*/ + /* just a click, no pointer movement. + */ if (Keyboard::no_modifier_keys_pressed (&event->button)) { - _editor->selection->clear_time(); + if (!_time_selection_at_start) { + if (_editor->clicked_regionview) { + if (_editor->get_selection().selected (_editor->clicked_regionview)) { + /* range select the entire current + region selection + */ + _editor->select_range (_editor->get_selection().regions.start(), + _editor->get_selection().regions.end_frame()); + } else { + /* range select this (unselected) + * region + */ + _editor->select_range (_editor->clicked_regionview->region()->position(), + _editor->clicked_regionview->region()->last_frame()); + } + } + } else { + _editor->selection->clear_time(); + } } if (_editor->clicked_axisview && !_editor->selection->selected (_editor->clicked_axisview)) { @@ -3615,6 +3646,11 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred) s->request_stop (false, false); } + if (Config->get_always_play_range()) { + if (_editor->doing_range_stuff()) { + s->request_locate (_editor->get_selection().time.start()); + } + } } _editor->stop_canvas_autoscroll (); diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index c6679af065..525fc8227a 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -892,6 +892,7 @@ private: int _original_pointer_time_axis; int _last_pointer_time_axis; std::list<TimeAxisView*> _added_time_axes; + bool _time_selection_at_start; }; /** Range marker drag */ diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 1ceb5a20ee..6f336f8036 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -596,14 +596,21 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp switch (item_type) { case RegionItem: - if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { - set_selected_regionview_from_click (press, op, true); - } else if (press) { - selection->clear_tracks (); - set_selected_track_as_side_effect (op, true); + if (!doing_range_stuff()) { + set_selected_regionview_from_click (press, op); } - if (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT && !selection->regions.empty()) { - clicked_selection = select_range_around_region (selection->regions.front()); + + if (press) { + if (doing_range_stuff()) { + /* don't change the selection unless the + clicked track is not currently selected. if + so, "collapse" the selection to just this + track + */ + if (!selection->selected (clicked_axisview)) { + set_selected_track_as_side_effect (Selection::Set); + } + } } break; @@ -611,8 +618,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case RegionViewName: case LeftFrameHandle: case RightFrameHandle: - if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { - set_selected_regionview_from_click (press, op, true); + if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { + set_selected_regionview_from_click (press, op); } else if (event->type == GDK_BUTTON_PRESS) { set_selected_track_as_side_effect (op); } @@ -623,16 +630,16 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case FadeInItem: case FadeOutHandleItem: case FadeOutItem: - if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { - set_selected_regionview_from_click (press, op, true); + if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { + set_selected_regionview_from_click (press, op); } else if (event->type == GDK_BUTTON_PRESS) { set_selected_track_as_side_effect (op); } break; case ControlPointItem: - set_selected_track_as_side_effect (op, true); - if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { + set_selected_track_as_side_effect (op); + if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { set_selected_control_point_from_click (op, false); } break; @@ -641,12 +648,12 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp /* for context click, select track */ if (event->button.button == 3) { selection->clear_tracks (); - set_selected_track_as_side_effect (op, true); + set_selected_track_as_side_effect (op); } break; case AutomationTrackItem: - set_selected_track_as_side_effect (op, true); + set_selected_track_as_side_effect (op); break; default: @@ -846,7 +853,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case LeftFrameHandle: case RightFrameHandle: - if (!internal_editing() && !clicked_regionview->region()->locked()) { + if (!internal_editing() && doing_object_stuff() && !clicked_regionview->region()->locked()) { RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id); _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event); return true; @@ -938,7 +945,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT add_region_drag (item, event, clicked_regionview); } - if (!internal_editing() && (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT && !selection->regions.empty())) { + + if (!internal_editing() && (_join_object_range_state == JOIN_OBJECT_RANGE_RANGE && !selection->regions.empty())) { _drags->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove)); } @@ -1026,7 +1034,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT boost::shared_ptr<Region> r = pl->top_region_at (event_frame (event)); if (r) { RegionView* rv = rtv->view()->find_view (r); - clicked_selection = select_range_around_region (rv); + clicked_selection = select_range (rv->region()->position(), + rv->region()->last_frame()+1); _drags->add (new SelectionDrag (this, item, SelectionDrag::SelectionMove)); list<RegionView*> rvs; rvs.push_back (rv); @@ -1619,7 +1628,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } return true; break; - default: break; } @@ -1770,10 +1778,9 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case AutomationLineItem: if (mouse_mode == MouseGain || mouse_mode == MouseObject) { - { - ArdourCanvas::Line *line = dynamic_cast<ArdourCanvas::Line *> (item); - if (line) - line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_EnteredAutomationLine.get(); + ArdourCanvas::Line *line = dynamic_cast<ArdourCanvas::Line *> (item); + if (line) { + line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_EnteredAutomationLine.get(); } if (is_drawable()) { set_canvas_cursor (_cursors->fader); @@ -1782,7 +1789,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ break; case RegionViewNameHighlight: - if (is_drawable() && mouse_mode == MouseObject && entered_regionview) { + if (is_drawable() && doing_object_stuff() && entered_regionview) { set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview); _over_region_trim_target = true; } @@ -1790,7 +1797,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case LeftFrameHandle: case RightFrameHandle: - if (is_drawable() && mouse_mode == MouseObject && !internal_editing() && entered_regionview) { + if (is_drawable() && doing_object_stuff() && !internal_editing() && entered_regionview) { set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview); } break; @@ -2720,8 +2727,11 @@ Editor::set_internal_edit (bool yn) void Editor::update_join_object_range_location (double /*x*/, double y) { - /* XXX: actually, this decides based on whether the mouse is in the top or bottom half of a RouteTimeAxisView; - entered_{track,regionview} is not always setup (e.g. if the mouse is over a TimeSelection), and to get a Region + /* XXX: actually, this decides based on whether the mouse is in the top + or bottom half of a the waveform part RouteTimeAxisView; + + Note that entered_{track,regionview} is not always setup (e.g. if + the mouse is over a TimeSelection), and to get a Region that we're over requires searching the playlist. */ @@ -2748,7 +2758,7 @@ Editor::update_join_object_range_location (double /*x*/, double y) double cy = y; rtv->canvas_display()->w2i (cx, cy); - double const c = cy / rtv->view()->child_height(); + double const c = cy / (rtv->view()->child_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE); double d; double const f = modf (c, &d); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 1dd5256d2a..2109b54ad2 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3594,8 +3594,7 @@ Editor::cut_copy (CutCopyOp op) /* we only want to cut regions if some are selected */ - switch (current_mouse_mode()) { - case MouseObject: + if (doing_object_stuff()) { rs = get_regions_from_selection (); if (!rs.empty() || !selection->points.empty()) { @@ -3617,15 +3616,15 @@ Editor::cut_copy (CutCopyOp op) } } commit_reversible_command (); - break; // terminate case statement here + goto out; } - if (!selection->time.empty()) { + if (!selection->time.empty() && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) { /* don't cause suprises */ - break; + goto out; } - // fall thru if there was nothing selected + } - case MouseRange: + if (doing_range_stuff()) { if (selection->time.empty()) { framepos_t start, end; if (!get_edit_op_range (start, end)) { @@ -3641,14 +3640,10 @@ Editor::cut_copy (CutCopyOp op) if (op == Cut || op == Delete) { selection->clear_time (); } - - break; - - default: - break; } } + out: if (op == Delete || op == Cut || op == Clear) { _drags->abort (); } diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index b7b0019b89..010984c26e 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -177,13 +177,12 @@ Editor::select_all_tracks () * tracks, in which case nothing will happen unless `force' is true. */ void -Editor::set_selected_track_as_side_effect (Selection::Operation op, bool /*force*/) +Editor::set_selected_track_as_side_effect (Selection::Operation op) { if (!clicked_axisview) { return; } -#if 1 if (!clicked_routeview) { return; } @@ -265,18 +264,6 @@ Editor::set_selected_track_as_side_effect (Selection::Operation op, bool /*force cerr << ("Editor::set_selected_track_as_side_effect case Selection::Add not yet implemented\n"); break; } - -#else // the older version - - if (!selection->tracks.empty()) { - if (!selection->selected (clicked_axisview)) { - selection->add (clicked_axisview); - } - - } else if (force) { - selection->set (clicked_axisview); - } -#endif } void @@ -560,7 +547,7 @@ Editor::get_regionview_count_from_region_list (boost::shared_ptr<Region> region) bool -Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, bool /*no_track_remove*/) +Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) { vector<RegionView*> all_equivalent_regions; bool commit = false; @@ -575,7 +562,6 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, if (op == Selection::Toggle || op == Selection::Set) { - switch (op) { case Selection::Toggle: if (selection->selected (clicked_regionview)) { @@ -982,6 +968,10 @@ Editor::time_selection_changed () } else { ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true); } + + if (_session && Config->get_always_play_range() && !_session->transport_rolling() && !selection->time.empty()) { + _session->request_locate (selection->time.start()); + } } /** Set all region actions to have a given sensitivity */ @@ -1266,6 +1256,10 @@ Editor::region_selection_changed () */ sensitize_all_region_actions (true); } + + if (_session && Config->get_always_play_range() && !_session->transport_rolling() && !selection->regions.empty()) { + _session->request_locate (selection->regions.start()); + } } void @@ -1851,13 +1845,9 @@ Editor::deselect_all () } long -Editor::select_range_around_region (RegionView* rv) +Editor::select_range (framepos_t s, framepos_t e) { - assert (rv); - - selection->set (&rv->get_time_axis_view()); - + selection->add (clicked_axisview); selection->time.clear (); - boost::shared_ptr<Region> r = rv->region (); - return selection->set (r->position(), r->position() + r->length()); + return selection->set (s, e); } diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index ea74a6b919..caf8df2ae0 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -748,11 +748,21 @@ Selection::set (RegionView* r, bool also_clear_tracks) void Selection::set (vector<RegionView*>& v) { + bool had_regions = !regions.empty(); + clear_regions (); + if (Config->get_link_region_and_track_selection()) { - clear_tracks (); - // make sure to deselect any automation selections - clear_points(); + if (had_regions) { + /* there were regions before, so we're changing the + * region selection (likely), thus link region/track + * selection. relevant tracks will get selected + * as we ::add() below. + */ + clear_tracks (); + // make sure to deselect any automation selections + clear_points(); + } } add (v); } diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 840a23601f..39a080faae 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -129,6 +129,7 @@ CONFIG_VARIABLE (bool, secondary_clock_delta_edit_cursor, "secondary-clock-delta CONFIG_VARIABLE (bool, show_track_meters, "show-track-meters", true) CONFIG_VARIABLE (bool, locate_while_waiting_for_sync, "locate-while-waiting-for-sync", false) CONFIG_VARIABLE (bool, disable_disarm_during_roll, "disable-disarm-during-roll", false) +CONFIG_VARIABLE (bool, always_play_range, "always-play-range", false) /* metering */ |