make solo-in-front controllable. a few tweaks left to do.
[ardour.git] / gtk2_ardour / editor_selection.cc
index b4532668df25df380621ab3ae0ac0712890c4124..bb9a392c9cffddce38987ad06b1fd998d548cafc 100644 (file)
 #include <algorithm>
 #include <cstdlib>
 
-#include <pbd/stacktrace.h>
+#include "pbd/stacktrace.h"
 
-#include <ardour/diskstream.h>
-#include <ardour/playlist.h>
-#include <ardour/route_group.h>
-#include <ardour/profile.h>
+#include "ardour/diskstream.h"
+#include "ardour/playlist.h"
+#include "ardour/route_group.h"
+#include "ardour/profile.h"
 
 #include "editor.h"
 #include "actions.h"
@@ -49,7 +49,7 @@ using namespace Editing;
 struct TrackViewByPositionSorter
 {
     bool operator() (const TimeAxisView* a, const TimeAxisView *b) {
-           return a->y_position < b->y_position;
+           return a->y_position() < b->y_position();
     }
 };
 
@@ -251,6 +251,16 @@ Editor::set_selected_control_point_from_click (Selection::Operation op, bool no_
        return select_all_within (x1, x2, y1, y2, selection->tracks, op);
 }
 
+void
+Editor::get_onscreen_tracks (TrackViewList& tvl)
+{
+       for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+               if ((*i)->y_position() < _canvas_height) {
+                       tvl.push_back (*i);
+               }
+       }
+}
+
 void
 Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
 {
@@ -264,7 +274,7 @@ Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
                        continue;
                }
 
-               RouteGroup* group = rtv->route()->edit_group();
+               RouteGroup* group = rtv->route()->route_group();
 
                if (group && group->is_active()) {
                        
@@ -276,7 +286,7 @@ Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
                                
                                if ((trtv = dynamic_cast<RouteTimeAxisView*> (*i)) != 0) {
                                        
-                                       if (trtv->route()->edit_group() == group) {
+                                       if (trtv->route()->route_group() == group) {
                                                relevant_tracks.insert (trtv);
                                        }
                                }
@@ -289,7 +299,7 @@ Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
 
 /**
  *  Call a slot for a given `basis' track and also for any track that is in the same
- *  active edit group.
+ *  active route group with the `select' property.
  *  @param sl Slot to call.
  *  @param basis Basis track.
  */
@@ -310,13 +320,13 @@ Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisVie
        /* always call for the basis */
        tracks.insert (route_basis);
 
-       RouteGroup* group = route_basis->route()->edit_group();
-       if (group && group->is_active()) {
+       RouteGroup* group = route_basis->route()->route_group();
+       if (group && group->active_property (RouteGroup::Select)) {
 
                /* the basis is a member of an active edit group; find other members */
                for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) {
                        RouteTimeAxisView* v = dynamic_cast<RouteTimeAxisView*> (*i);
-                       if (v && v->route()->edit_group() == group) {
+                       if (v && v->route()->route_group() == group) {
                                tracks.insert (v);
                        }
                }
@@ -477,7 +487,8 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
                        
                case Selection::Set:
                        if (!selection->selected (clicked_regionview)) {
-                               selection->set (clicked_regionview);
+                               get_equivalent_regions (clicked_regionview, all_equivalent_regions);
+                               selection->set (all_equivalent_regions);
                                commit = true;
                        } else {
                                /* no commit necessary: clicked on an already selected region */
@@ -852,13 +863,24 @@ Editor::sensitize_the_right_region_actions (bool have_selected_regions)
 void
 Editor::region_selection_changed ()
 {
+       region_list_change_connection.block(true);
+       editor_regions_selection_changed_connection.block(true);
+       
+       region_list_display.get_selection()->unselect_all();
+       
        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+               
                (*i)->set_selected_regionviews (selection->regions);
+               set_selected_in_region_list(selection->regions);
+       
        }
        
        sensitize_the_right_region_actions (!selection->regions.empty());
 
        zoomed_to_region = false;
+
+       region_list_change_connection.block(false);
+       editor_regions_selection_changed_connection.block(false);
 }
 
 void
@@ -1164,7 +1186,7 @@ Editor::select_all_selectables_using_loop()
 }
 
 void
-Editor::select_all_selectables_using_cursor (Cursor *cursor, bool after)
+Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after)
 {
         nframes64_t start;
        nframes64_t end;