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));
/* UNDO/REDO */
-Editor::State::State ()
+Editor::State::State (PublicEditor const * e)
{
- selection = new Selection;
+ selection = new Selection (e);
}
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);
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);
struct State {
Selection* selection;
- double frames_per_unit;
+ double frames_per_unit;
- State();
- ~State();
+ State (PublicEditor const * e);
+ ~State ();
};
void store_state (State&) const;
*/
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) {
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);
}
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;
}
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());
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 */
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) {
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;
#include "selection_templates.h"
#include "time_axis_view.h"
#include "automation_time_axis.h"
+#include "public_editor.h"
#include "i18n.h"
{
if (find (regions.begin(), regions.end(), r) == regions.end()) {
regions.add (r);
+ select_edit_group_regions ();
add (&r->get_trackview());
RegionsChanged ();
}
}
if (changed) {
+ select_edit_group_regions ();
RegionsChanged ();
}
}
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);
+ }
+}
class TimeAxisView;
class RegionView;
class Selectable;
+class PublicEditor;
namespace ARDOUR {
class Region;
PlaylistSelection playlists;
PointSelection points;
- Selection() {
- next_time_id = 0;
+ Selection (PublicEditor const * e) : editor (e), next_time_id (0) {
clear();
}
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*>&);