Fix glitching on "events" (like loop markers) due to taking the processing offset...
[ardour.git] / gtk2_ardour / editor_selection.cc
index f1248fb13a2258ebafbbe156c760a9d4d8c9ace5..8a1220cdcdd10bd38578cde25ee6703c92adde7e 100644 (file)
 */
 
 #include <algorithm>
-#include <stdlib.h>
+#include <cstdlib>
 
 #include <pbd/stacktrace.h>
 
 #include <ardour/diskstream.h>
 #include <ardour/playlist.h>
 #include <ardour/route_group.h>
+#include <ardour/profile.h>
 
 #include "editor.h"
 #include "actions.h"
@@ -170,6 +171,7 @@ Editor::set_selected_track_as_side_effect (bool force)
        }
 
        if (!selection->tracks.empty()) {
+
                if (!selection->selected (clicked_trackview)) {
                        selection->add (clicked_trackview);
                }
@@ -182,7 +184,6 @@ Editor::set_selected_track_as_side_effect (bool force)
 void
 Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove)
 {
-
        switch (op) {
        case Selection::Toggle:
                if (selection->selected (&view)) {
@@ -201,21 +202,7 @@ Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no
                break;
 
        case Selection::Set:
-               if (selection->selected (&view) && selection->tracks.size() > 1) {
-
-                       /* reset track selection if there is only 1 other track
-                          selected OR if no_remove is not set (its there to 
-                          prevent deselecting a multi-track selection
-                          when clicking on an already selected track
-                          for some reason.
-                       */
-
-                       if (selection->tracks.empty()) {
-                               selection->set (&view);
-                       } else if (selection->tracks.size() == 1 || !no_remove) {
-                               selection->set (&view);
-                       }
-               }
+               selection->set (&view);
                break;
                
        case Selection::Extend:
@@ -248,7 +235,7 @@ Editor::set_selected_control_point_from_click (Selection::Operation op, bool no_
        /* select this point and any others that it represents */
 
        double y1, y2;
-       nframes_t x1, x2;
+       nframes64_t x1, x2;
 
        x1 = pixel_to_frame (clicked_control_point->get_x() - 10);
        x2 = pixel_to_frame (clicked_control_point->get_x() + 10);
@@ -465,8 +452,8 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
        } else if (op == Selection::Extend) {
 
                list<Selectable*> results;
-               nframes_t last_frame;
-               nframes_t first_frame;
+               nframes64_t last_frame;
+               nframes64_t first_frame;
                bool same_track = false;
 
                /* 1. find the last selected regionview in the track that was clicked in */
@@ -764,11 +751,17 @@ Editor::track_selection_changed ()
                        (*i)->set_selected (false);
                }
        }
+
+       ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, !selection->tracks.empty());
 }
 
 void
 Editor::time_selection_changed ()
 {
+       if (Profile->get_sae()) {
+               return;
+       }
+
        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                (*i)->hide_selection ();
        }
@@ -791,6 +784,30 @@ Editor::time_selection_changed ()
 
 }
 
+void
+Editor::sensitize_the_right_region_actions (bool have_selected_regions)
+{
+       for (vector<Glib::RefPtr<Action> >::iterator x = ActionManager::region_selection_sensitive_actions.begin();
+            x != ActionManager::region_selection_sensitive_actions.end(); ++x) {
+
+               string accel_path = (*x)->get_accel_path ();
+               AccelKey key;
+
+               /* if there is an accelerator, it should always be sensitive
+                  to allow for keyboard ops on entered regions.
+               */
+
+               bool known = ActionManager::lookup_entry (accel_path, key);
+
+               if (known && ((key.get_key() != GDK_VoidSymbol) && (key.get_key() != 0))) {
+                       (*x)->set_sensitive (true);
+               } else {
+                       (*x)->set_sensitive (have_selected_regions);
+               }
+       }
+}
+
+
 void
 Editor::region_selection_changed ()
 {
@@ -798,6 +815,8 @@ Editor::region_selection_changed ()
                (*i)->set_selected_regionviews (selection->regions);
        }
        
+       sensitize_the_right_region_actions (!selection->regions.empty());
+
        zoomed_to_region = false;
 }
 
@@ -894,7 +913,7 @@ Editor::invert_selection ()
 }
 
 bool
-Editor::select_all_within (nframes_t start, nframes_t end, double top, double bot, const TrackViewList& tracklist, Selection::Operation op)
+Editor::select_all_within (nframes64_t start, nframes64_t end, double top, double bot, const TrackViewList& tracklist, Selection::Operation op)
 {
        list<Selectable*> touched;
        list<Selectable*>::size_type n = 0;
@@ -964,14 +983,10 @@ Editor::set_selection_from_audio_region ()
                return;
        }
 
-       RegionView* rv = *(selection->regions.begin());
-       boost::shared_ptr<Region> region = rv->region();
-       
-       begin_reversible_command (_("set selection from region"));
-       selection->set (0, region->position(), region->last_frame());
-       commit_reversible_command ();
-
-       set_mouse_mode (Editing::MouseRange, false);
+       selection->set (0, selection->regions.start(), selection->regions.end_frame());
+       if (!Profile->get_sae()) {
+               set_mouse_mode (Editing::MouseRange, false);
+       }
 }
 
 void
@@ -1004,7 +1019,9 @@ Editor::set_selection_from_range (Location& loc)
        selection->set (0, loc.start(), loc.end());
        commit_reversible_command ();
 
-       set_mouse_mode (Editing::MouseRange, false);
+       if (!Profile->get_sae()) {
+               set_mouse_mode (Editing::MouseRange, false);
+       }
 }
 
 void
@@ -1016,8 +1033,8 @@ Editor::select_all_selectables_using_time_selection ()
                return;
        }
 
-       nframes_t start = selection->time[clicked_selection].start;
-       nframes_t end = selection->time[clicked_selection].end;
+       nframes64_t start = selection->time[clicked_selection].start;
+       nframes64_t end = selection->time[clicked_selection].end;
 
        if (end - start < 1)  {
                return;
@@ -1109,8 +1126,8 @@ Editor::select_all_selectables_using_loop()
 void
 Editor::select_all_selectables_using_cursor (Cursor *cursor, bool after)
 {
-        nframes_t start;
-       nframes_t end;
+        nframes64_t start;
+       nframes64_t end;
        list<Selectable *> touched;
 
        if (after) {
@@ -1149,8 +1166,8 @@ Editor::select_all_selectables_using_cursor (Cursor *cursor, bool after)
 void
 Editor::select_all_selectables_using_edit (bool after)
 {
-        nframes_t start;
-       nframes_t end;
+        nframes64_t start;
+       nframes64_t end;
        list<Selectable *> touched;
 
        if (after) {
@@ -1317,6 +1334,12 @@ Editor::get_edit_op_range (nframes64_t& start, nframes64_t& end) const
                swap (start, end);
        }
 
+       /* turn range into one delimited by start...end,
+          not start...end-1
+       */
+
+       end++;
+
        return true;
 }
 
@@ -1325,3 +1348,5 @@ Editor::deselect_all ()
 {
        selection->clear ();
 }
+
+