Re-work edit group selection in line with suggestions from Paul.
authorCarl Hetherington <carl@carlh.net>
Sun, 7 Oct 2007 15:51:14 +0000 (15:51 +0000)
committerCarl Hetherington <carl@carlh.net>
Sun, 7 Oct 2007 15:51:14 +0000 (15:51 +0000)
git-svn-id: svn://localhost/ardour2/trunk@2529 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_selection.cc
gtk2_ardour/public_editor.h
gtk2_ardour/selection.cc
gtk2_ardour/selection.h

index 3b10d655e646fe228079d9c9dfc3dba1d4c1bcca..031262c41e32e226d25d6cfc1940a714460ee40a 100644 (file)
@@ -233,8 +233,8 @@ Editor::Editor ()
 
        session = 0;
 
-       selection = new Selection;
-       cut_buffer = new Selection;
+       selection = new Selection (this);
+       cut_buffer = new Selection (this);
 
        selection->TimeChanged.connect (mem_fun(*this, &Editor::time_selection_changed));
        selection->TracksChanged.connect (mem_fun(*this, &Editor::track_selection_changed));
@@ -2766,9 +2766,9 @@ Editor::map_transport_state ()
 
 /* UNDO/REDO */
 
-Editor::State::State ()
+Editor::State::State (PublicEditor const * e)
 {
-       selection = new Selection;
+       selection = new Selection (e);
 }
 
 Editor::State::~State ()
@@ -2779,7 +2779,7 @@ Editor::State::~State ()
 UndoAction
 Editor::get_memento () const
 {
-       State *state = new State;
+       State *state = new State (this);
 
        store_state (*state);
        return bind (mem_fun (*(const_cast<Editor*>(this)), &Editor::restore_state), state);
index 2367f5a3256d660627856949df1cc84fa22741ae..976ad68188ced51ad6bbe091e39f5d5edb1d9c05 100644 (file)
@@ -437,12 +437,12 @@ class Editor : public PublicEditor
        void sort_track_selection ();
 
        void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
-       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&);
-       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*);
+       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const;
+       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*) const;
 
        /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
 
-       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*);
+       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*) const;
        void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t);
        void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t);
        void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
@@ -1681,10 +1681,10 @@ class Editor : public PublicEditor
 
        struct State {
            Selection* selection;
-           double     frames_per_unit;
+           double frames_per_unit;
 
-           State();
-           ~State();
+           State (PublicEditor const * e);
+           ~State ();
        };
 
        void store_state (State&) const;
index 304c2aae82354d7ddd1985923256de55fa1f0acc..910534690efaa4b9f17fd6ead961d406093b7291 100644 (file)
@@ -293,7 +293,7 @@ Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
  */
 
 void
-Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisView* basis)
+Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisView* basis) const
 {
        RouteTimeAxisView* route_basis = dynamic_cast<RouteTimeAxisView*> (basis);
        if (route_basis == 0) {
@@ -312,7 +312,7 @@ Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisVie
        if (group && group->is_active()) {
 
                /* the basis is a member of an active edit group; find other members */
-               for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+               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) {
                                tracks.insert (v);
@@ -328,7 +328,7 @@ Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisVie
 }
 
 void
-Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored, RegionView* basis, vector<RegionView*>* all_equivs)
+Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored, RegionView* basis, vector<RegionView*>* all_equivs) const
 {
        boost::shared_ptr<Playlist> pl;
        vector<boost::shared_ptr<Region> > results;
@@ -357,7 +357,7 @@ Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored,
 }
 
 void
-Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions)
+Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions) const
 {
        mapover_tracks (bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_trackview());
        
@@ -437,9 +437,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
                        
                case Selection::Set:
                        if (!clicked_regionview->get_selected()) {
-
-                               get_equivalent_regions (clicked_regionview, all_equivalent_regions);
-                               selection->set (all_equivalent_regions);
+                               selection->set (clicked_regionview);
                                commit = true;
                        } else {
                                /* no commit necessary: clicked on an already selected region */
@@ -782,26 +780,6 @@ Editor::select_all_within (nframes_t start, nframes_t end, double top, double bo
                return false;
        }
 
-       /* `touched' may contain some regions; if so, we need to add equivalent
-          regions from any edit groups */
-
-       list<Selectable*> to_add;
-
-       for (list<Selectable*>::iterator i = touched.begin(); i != touched.end(); ++i) {
-               RegionView* r = dynamic_cast<RegionView*> (*i);
-               if (r) {
-                       vector<RegionView*> e;
-                       get_equivalent_regions (r, e);
-                       for (vector<RegionView*>::iterator j = e.begin(); j != e.end(); ++j) {
-                               to_add.push_back (*j);
-                       }
-               }
-       }
-
-       for (list<Selectable*>::iterator i = to_add.begin(); i != to_add.end(); ++i) {
-               touched.push_back (*i);
-       }
-
        if (!touched_tracks.empty()) {
 
                switch (op) {
index a47f5b88d8f0bc0f91568f2bf4da6b31fb7788bb..871ec0fb9c19ee18b1fa614e393a0df46be06e5f 100644 (file)
@@ -262,6 +262,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
        virtual TimeAxisView* get_named_time_axis(const std::string & name)  = 0;
 #endif
 
+       virtual void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const = 0;
+
        sigc::signal<void> ZoomFocusChanged;
        sigc::signal<void> ZoomChanged;
        sigc::signal<void> Resized;
index b9c44bea1393d6d6047ccdb85feb079ad4411d92..f0037588a0f4aec936e2c0ca596527c1f751515a 100644 (file)
@@ -29,6 +29,7 @@
 #include "selection_templates.h"
 #include "time_axis_view.h"
 #include "automation_time_axis.h"
+#include "public_editor.h"
 
 #include "i18n.h"
 
@@ -290,6 +291,7 @@ Selection::add (RegionView* r)
 {
        if (find (regions.begin(), regions.end(), r) == regions.end()) {
                regions.add (r);
+               select_edit_group_regions ();
                add (&r->get_trackview());
                RegionsChanged ();
        }
@@ -310,6 +312,7 @@ Selection::add (vector<RegionView*>& v)
        }
 
        if (changed) {
+               select_edit_group_regions ();
                RegionsChanged ();
        }
 }
@@ -679,3 +682,21 @@ Selection::add (vector<AutomationSelectable*>& autos)
 
        PointsChanged ();
 }
+
+void
+Selection::select_edit_group_regions ()
+{
+       std::set<RegionView*> regions_to_add;
+       
+       for (RegionSelection::iterator i = regions.begin(); i != regions.end(); ++i) {
+               vector<RegionView*> e;
+               editor->get_equivalent_regions (*i, e);
+               for (vector<RegionView*>::iterator j = e.begin(); j != e.end(); ++j) {
+                       regions_to_add.insert(*j);
+               }
+       }
+
+       for (std::set<RegionView*>::iterator i = regions_to_add.begin(); i != regions_to_add.end(); ++i) {
+               add (*i);
+       }
+}
index a8f298434a54a6e982f9645c00954d97c3e50b61..5e9bc047596c013d1a9f0bd42fc3d5482c3913db 100644 (file)
@@ -36,6 +36,7 @@
 class TimeAxisView;
 class RegionView;
 class Selectable;
+class PublicEditor;
 
 namespace ARDOUR {
        class Region;
@@ -71,8 +72,7 @@ class Selection : public sigc::trackable
        PlaylistSelection    playlists;
        PointSelection       points;
 
-       Selection() {
-               next_time_id = 0;
+       Selection (PublicEditor const * e) : editor (e), next_time_id (0) {
                clear();
        }
 
@@ -149,7 +149,10 @@ class Selection : public sigc::trackable
        void foreach_regionview (void (RegionView::*method)(void));
        template<class A> void foreach_region (void (ARDOUR::Region::*method)(A), A arg);
 
+       void select_edit_group_regions ();
+
   private:
+       PublicEditor const * editor;
        uint32_t next_time_id;
 
        void add (std::vector<AutomationSelectable*>&);