diff --git a/gtk2_ardour/actions.cc b/gtk2_ardour/actions.cc index ae0cd993ad..f226a50a82 100644 --- a/gtk2_ardour/actions.cc +++ b/gtk2_ardour/actions.cc @@ -55,7 +55,6 @@ vector > ActionManager::point_selection_sensitive_actions; vector > ActionManager::time_selection_sensitive_actions; vector > ActionManager::line_selection_sensitive_actions; vector > ActionManager::playlist_selection_sensitive_actions; -vector > ActionManager::mouse_edit_point_requires_canvas_actions; vector > ActionManager::range_sensitive_actions; vector > ActionManager::jack_sensitive_actions; diff --git a/gtk2_ardour/actions.h b/gtk2_ardour/actions.h index 9b393c0aee..ba288dcfb1 100644 --- a/gtk2_ardour/actions.h +++ b/gtk2_ardour/actions.h @@ -52,7 +52,6 @@ class ActionManager static std::vector > time_selection_sensitive_actions; static std::vector > line_selection_sensitive_actions; static std::vector > playlist_selection_sensitive_actions; - static std::vector > mouse_edit_point_requires_canvas_actions; static std::vector > range_sensitive_actions; static std::vector > transport_sensitive_actions; diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index a1c3a58539..f1f26c6386 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2374,13 +2374,10 @@ Editor::set_edit_point_preference (EditPoint ep, bool force) } nframes64_t foo; - bool in_track_canvas; + bool ignored; + within_track_canvas = mouse_frame (foo, ignored); - if (!mouse_frame (foo, in_track_canvas)) { - in_track_canvas = false; - } - - reset_canvas_action_sensitivity (in_track_canvas); + reset_canvas_action_sensitivity (); instant_save (); } @@ -3658,6 +3655,8 @@ Editor::edit_point_selection_done () if (ract) { ract->set_active (true); } + + reset_canvas_action_sensitivity(); } void diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index bd21b24748..9f9957e972 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -2164,7 +2164,7 @@ public: bool _new_regionviews_show_envelope; - void reset_canvas_action_sensitivity (bool); + void reset_canvas_action_sensitivity (); void toggle_gain_envelope_visibility (); void toggle_gain_envelope_active (); void reset_region_gain_envelopes (); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index c11cbe06a2..e6b2397188 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -538,16 +538,14 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "editor-separate", _("Separate"), mem_fun(*this, &Editor::separate_region_from_selection)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act); + ActionManager::time_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "separate-from-punch", _("Separate Using Punch Range"), mem_fun(*this, &Editor::separate_region_from_punch)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act); act = ActionManager::register_action (editor_actions, "separate-from-loop", _("Separate Using Loop Range"), mem_fun(*this, &Editor::separate_region_from_loop)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act); act = ActionManager::register_action (editor_actions, "editor-crop", _("Crop"), mem_fun(*this, &Editor::crop_region_to_selection)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act); + ActionManager::time_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "editor-cut", _("Cut"), mem_fun(*this, &Editor::cut)); ActionManager::session_sensitive_actions.push_back (act); /* Note: for now, editor-delete does the exact same thing as editor-cut */ @@ -579,6 +577,7 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "crop", _("Crop"), mem_fun(*this, &Editor::crop_region_to_selection)); ActionManager::session_sensitive_actions.push_back (act); + ActionManager::time_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "insert-chunk", _("Insert Chunk"), bind (mem_fun(*this, &Editor::paste_named_selection), 1.0f)); ActionManager::session_sensitive_actions.push_back (act); @@ -1787,15 +1786,27 @@ Editor::reset_focus () } void -Editor::reset_canvas_action_sensitivity (bool onoff) +Editor::reset_canvas_action_sensitivity () { - if (_edit_point != EditAtMouse) { - onoff = true; - } + //some actions depend on a track selection existing + ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, !selection->tracks.empty()); + + //some actions depend on a track selection existing + ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, !selection->tracks.empty()); - for (vector >::iterator x = ActionManager::mouse_edit_point_requires_canvas_actions.begin(); - x != ActionManager::mouse_edit_point_requires_canvas_actions.end(); ++x) { - (*x)->set_sensitive (onoff); + //some actions depend on a valid range existing + bool range_exists = false; + if ( !selection->time.empty() ) { //explicit range selected + range_exists = true; + } else if ( selection->tracks.empty() && selection->regions.empty() ) { //nothing selected, bail out here + range_exists = false; + } else if (_edit_point == EditAtMouse && !selection->markers.empty() && within_track_canvas) { //for mouse mode, need mouse & marker + range_exists = true; + } else if (_edit_point == EditAtSelectedMarker && !selection->markers.empty() && within_track_canvas) { //for marker mode, need marker & mouse + range_exists = true; + } else if (_edit_point == EditAtPlayhead && !selection->markers.empty()) { //for playhead mode, need playhead & marker + range_exists = true; } + ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, range_exists); } diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 989f7cc4b9..2a4a820c0f 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -796,18 +796,18 @@ Editor::stop_canvas_autoscroll () bool Editor::left_track_canvas (GdkEventCrossing *ev) { - within_track_canvas = false; + within_track_canvas = false; set_entered_track (0); set_entered_regionview (0); - reset_canvas_action_sensitivity (false); + reset_canvas_action_sensitivity (); return false; } bool Editor::entered_track_canvas (GdkEventCrossing *ev) { - within_track_canvas = true; - reset_canvas_action_sensitivity (true); + within_track_canvas = true; + reset_canvas_action_sensitivity (); return FALSE; } diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 02e2ebdd7a..9fc77dd111 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2882,28 +2882,16 @@ Editor::separate_regions_between (const TimeSelection& ts) void Editor::separate_region_from_selection () { - /* preferentially use *all* ranges in the time selection if we're in range mode - to allow discontiguous operation, since get_edit_op_range() currently - returns a single range. - */ - - if (mouse_mode == MouseRange && !selection->time.empty()) { - - separate_regions_between (selection->time); - - } else { - - nframes64_t start; - nframes64_t end; + nframes64_t start; + nframes64_t end; + + if (get_edit_op_range (start, end)) { - if (get_edit_op_range (start, end)) { - - AudioRange ar (start, end, 1); - TimeSelection ts; - ts.push_back (ar); + AudioRange ar (start, end, 1); + TimeSelection ts; + ts.push_back (ar); - separate_regions_between (ts); - } + separate_regions_between (ts); } } @@ -2943,20 +2931,11 @@ Editor::separate_regions_using_location (Location& loc) void Editor::crop_region_to_selection () { - if (!selection->time.empty()) { - - crop_region_to (selection->time.start(), selection->time.end_frame()); - - } else { - - nframes64_t start; - nframes64_t end; - - if (get_edit_op_range (start, end)) { - crop_region_to (start, end); - } + nframes64_t start; + nframes64_t end; + if (get_edit_op_range (start, end)) { + crop_region_to (start, end); } - } void @@ -2967,7 +2946,7 @@ Editor::crop_region_to (nframes64_t start, nframes64_t end) TrackSelection* ts; if (selection->tracks.empty()) { - ts = &track_views; + return; } else { sort_track_selection (); ts = &selection->tracks; diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index fd8e5d17ab..1c0469c286 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -832,7 +832,7 @@ Editor::track_selection_changed () (*i)->show_selected (*selection); } - ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, !selection->tracks.empty()); + reset_canvas_action_sensitivity(); } void @@ -856,12 +856,7 @@ Editor::time_selection_changed () } } - if (selection->time.empty()) { - ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false); - } else { - ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true); - } - + reset_canvas_action_sensitivity(); } void