Apply Select property of route groups at the Selection object level. Accordingly
simplify code related to selecting tracks. Add a TrackViewList object rather than "abusing" TrackSelection in lots of places. git-svn-id: svn://localhost/ardour2/branches/3.0@6358 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
8687895abb
commit
034db5fb1c
|
@ -3572,43 +3572,6 @@ Editor::mouse_select_button_release (GdkEventButton* ev)
|
|||
return true;
|
||||
}
|
||||
|
||||
Editor::TrackViewList *
|
||||
Editor::get_valid_views (TimeAxisView* track, RouteGroup* group)
|
||||
{
|
||||
TrackViewList::iterator i;
|
||||
|
||||
TrackViewList* v = new TrackViewList;
|
||||
|
||||
if (track == 0 && group == 0) {
|
||||
|
||||
/* all views */
|
||||
|
||||
for (i = track_views.begin(); i != track_views.end (); ++i) {
|
||||
v->push_back (*i);
|
||||
}
|
||||
|
||||
} else if ((track != 0 && group == 0) || (track != 0 && group != 0 && !group->active_property (RouteGroup::Select))) {
|
||||
|
||||
/* just the view for this track
|
||||
*/
|
||||
|
||||
v->push_back (track);
|
||||
|
||||
} else {
|
||||
|
||||
/* views for all tracks in the route group */
|
||||
|
||||
for (i = track_views.begin(); i != track_views.end (); ++i) {
|
||||
|
||||
if (group == 0 || ((*i)->route_group() == group && group->active_property (RouteGroup::Select))) {
|
||||
v->push_back (*i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
void
|
||||
Editor::set_zoom_focus (ZoomFocus f)
|
||||
{
|
||||
|
@ -4268,7 +4231,7 @@ Editor::post_zoom ()
|
|||
|
||||
if (mouse_mode == MouseRange && selection->time.start () != selection->time.end_frame ()) {
|
||||
if (!selection->tracks.empty()) {
|
||||
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
|
||||
for (TrackViewList::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
|
||||
(*i)->reshow_selection (selection->time);
|
||||
}
|
||||
} else {
|
||||
|
@ -4412,7 +4375,7 @@ struct EditorOrderTimeAxisSorter {
|
|||
};
|
||||
|
||||
void
|
||||
Editor::sort_track_selection (TrackSelection* sel)
|
||||
Editor::sort_track_selection (TrackViewList* sel)
|
||||
{
|
||||
EditorOrderTimeAxisSorter cmp;
|
||||
|
||||
|
@ -4532,9 +4495,9 @@ Editor::set_punch_range (nframes64_t start, nframes64_t end, string cmd)
|
|||
* @param ts Tracks to look on; if this is empty, all tracks are examined.
|
||||
*/
|
||||
void
|
||||
Editor::get_regions_at (RegionSelection& rs, nframes64_t where, const TrackSelection& ts) const
|
||||
Editor::get_regions_at (RegionSelection& rs, nframes64_t where, const TrackViewList& ts) const
|
||||
{
|
||||
const TrackSelection* tracks;
|
||||
const TrackViewList* tracks;
|
||||
|
||||
if (ts.empty()) {
|
||||
tracks = &track_views;
|
||||
|
@ -4542,7 +4505,7 @@ Editor::get_regions_at (RegionSelection& rs, nframes64_t where, const TrackSelec
|
|||
tracks = &ts;
|
||||
}
|
||||
|
||||
for (TrackSelection::const_iterator t = tracks->begin(); t != tracks->end(); ++t) {
|
||||
for (TrackViewList::const_iterator t = tracks->begin(); t != tracks->end(); ++t) {
|
||||
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(*t);
|
||||
if (rtv) {
|
||||
boost::shared_ptr<Diskstream> ds;
|
||||
|
@ -4567,9 +4530,9 @@ Editor::get_regions_at (RegionSelection& rs, nframes64_t where, const TrackSelec
|
|||
}
|
||||
|
||||
void
|
||||
Editor::get_regions_after (RegionSelection& rs, nframes64_t where, const TrackSelection& ts) const
|
||||
Editor::get_regions_after (RegionSelection& rs, nframes64_t where, const TrackViewList& ts) const
|
||||
{
|
||||
const TrackSelection* tracks;
|
||||
const TrackViewList* tracks;
|
||||
|
||||
if (ts.empty()) {
|
||||
tracks = &track_views;
|
||||
|
@ -4577,7 +4540,7 @@ Editor::get_regions_after (RegionSelection& rs, nframes64_t where, const TrackSe
|
|||
tracks = &ts;
|
||||
}
|
||||
|
||||
for (TrackSelection::const_iterator t = tracks->begin(); t != tracks->end(); ++t) {
|
||||
for (TrackViewList::const_iterator t = tracks->begin(); t != tracks->end(); ++t) {
|
||||
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(*t);
|
||||
if (rtv) {
|
||||
boost::shared_ptr<Diskstream> ds;
|
||||
|
@ -4624,22 +4587,25 @@ Editor::get_regions_for_action (RegionSelection& rs, bool allow_entered, bool al
|
|||
|
||||
if (allow_edit_position) {
|
||||
|
||||
TrackSelection tracks = selection->tracks;
|
||||
TrackViewList tracks = selection->tracks;
|
||||
|
||||
/* tracks is currently the set of selected tracks; add any other tracks that
|
||||
* have regions that are in the same edit-activated route group as one of
|
||||
* our regions */
|
||||
for (RegionSelection::iterator i = rs.begin (); i != rs.end(); ++i) {
|
||||
|
||||
RouteGroup* g = (*i)->get_time_axis_view().route_group ();
|
||||
if (g && g->active_property (RouteGroup::Edit)) {
|
||||
tracks.add (axis_views_from_routes (g->route_list()));
|
||||
}
|
||||
RouteGroup* g = (*i)->get_time_axis_view().route_group ();
|
||||
if (g && g->active_property (RouteGroup::Edit)) {
|
||||
tracks.add (axis_views_from_routes (g->route_list()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* now find regions that are at the edit position on those tracks */
|
||||
nframes64_t const where = get_preferred_edit_position ();
|
||||
get_regions_at (rs, where, tracks);
|
||||
if (!tracks.empty()) {
|
||||
/* now find regions that are at the edit position on those tracks */
|
||||
nframes64_t const where = get_preferred_edit_position ();
|
||||
get_regions_at (rs, where, tracks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4750,7 +4716,7 @@ Editor::add_to_idle_resize (TimeAxisView* view, int32_t h)
|
|||
min_resulting = min (min_resulting, int32_t (_pending_resize_view->current_height()) + _pending_resize_amount);
|
||||
|
||||
if (selection->tracks.contains (_pending_resize_view)) {
|
||||
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
|
||||
for (TrackViewList::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
|
||||
min_resulting = min (min_resulting, int32_t ((*i)->current_height()) + _pending_resize_amount);
|
||||
}
|
||||
}
|
||||
|
@ -4774,7 +4740,7 @@ Editor::idle_resize ()
|
|||
if (dynamic_cast<AutomationTimeAxisView*> (_pending_resize_view) == 0 &&
|
||||
selection->tracks.contains (_pending_resize_view)) {
|
||||
|
||||
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
|
||||
for (TrackViewList::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
|
||||
if (*i != _pending_resize_view) {
|
||||
(*i)->idle_resize ((*i)->current_height() + _pending_resize_amount);
|
||||
}
|
||||
|
@ -4824,10 +4790,10 @@ Editor::axis_view_from_route (boost::shared_ptr<Route> r) const
|
|||
}
|
||||
|
||||
|
||||
TrackSelection
|
||||
TrackViewList
|
||||
Editor::axis_views_from_routes (boost::shared_ptr<RouteList> r) const
|
||||
{
|
||||
TrackSelection t;
|
||||
TrackViewList t;
|
||||
|
||||
for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
|
||||
TimeAxisView* tv = axis_view_from_route (*i);
|
||||
|
@ -4949,7 +4915,7 @@ Editor::hide_track_in_display (TimeAxisView& tv, bool /*temponly*/)
|
|||
bool
|
||||
Editor::sync_track_view_list_and_routes ()
|
||||
{
|
||||
track_views = TrackSelection (_routes->views ());
|
||||
track_views = TrackViewList (_routes->views ());
|
||||
|
||||
_summary->set_dirty ();
|
||||
_group_tabs->set_dirty ();
|
||||
|
@ -4984,7 +4950,7 @@ Editor::get_route_view_by_id (PBD::ID& id)
|
|||
void
|
||||
Editor::fit_route_group (RouteGroup *g)
|
||||
{
|
||||
TrackSelection ts = axis_views_from_routes (g->route_list ());
|
||||
TrackViewList ts = axis_views_from_routes (g->route_list ());
|
||||
fit_tracks (ts);
|
||||
}
|
||||
|
||||
|
|
|
@ -121,7 +121,6 @@ class TempoLines;
|
|||
class TimeAxisView;
|
||||
class TimeFXDialog;
|
||||
class TimeSelection;
|
||||
class TrackSelection;
|
||||
class EditorGroupTabs;
|
||||
class EditorRoutes;
|
||||
class EditorRouteGroups;
|
||||
|
@ -330,7 +329,6 @@ class Editor : public PublicEditor
|
|||
void copy_playlists (TimeAxisView* v);
|
||||
void clear_playlists (TimeAxisView* v);
|
||||
|
||||
TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
|
||||
void get_onscreen_tracks (TrackViewList&);
|
||||
|
||||
Width editor_mixer_strip_width;
|
||||
|
@ -433,6 +431,8 @@ class Editor : public PublicEditor
|
|||
|
||||
void center_screen (nframes64_t);
|
||||
|
||||
TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const;
|
||||
|
||||
protected:
|
||||
void map_transport_state ();
|
||||
void map_position_change (nframes64_t);
|
||||
|
@ -560,10 +560,8 @@ class Editor : public PublicEditor
|
|||
CrossfadeView* clicked_crossfadeview;
|
||||
ControlPoint* clicked_control_point;
|
||||
|
||||
void sort_track_selection (TrackSelection* sel = 0);
|
||||
void sort_track_selection (TrackViewList* sel = 0);
|
||||
|
||||
void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks) const;
|
||||
void get_equivalent_tracks (RouteTimeAxisView*, std::set<RouteTimeAxisView*> &, ARDOUR::RouteGroup::Property) const;
|
||||
void get_equivalent_regions (RegionView* rv, std::vector<RegionView*> &, ARDOUR::RouteGroup::Property) const;
|
||||
RegionSelection get_equivalent_regions (RegionSelection &, ARDOUR::RouteGroup::Property) const;
|
||||
void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, ARDOUR::RouteGroup::Property) const;
|
||||
|
@ -951,9 +949,8 @@ class Editor : public PublicEditor
|
|||
TrackViewList track_views;
|
||||
std::pair<TimeAxisView*, ARDOUR::layer_t> trackview_by_y_position (double);
|
||||
TimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
|
||||
TrackSelection axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const;
|
||||
|
||||
TrackSelection get_tracks_for_range_action () const;
|
||||
TrackViewList get_tracks_for_range_action () const;
|
||||
|
||||
static Gdk::Cursor* cross_hair_cursor;
|
||||
static Gdk::Cursor* trimmer_cursor;
|
||||
|
@ -1953,8 +1950,8 @@ public:
|
|||
|
||||
bool get_edit_op_range (nframes64_t& start, nframes64_t& end) const;
|
||||
|
||||
void get_regions_at (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
|
||||
void get_regions_after (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
|
||||
void get_regions_at (RegionSelection&, nframes64_t where, const TrackViewList& ts) const;
|
||||
void get_regions_after (RegionSelection&, nframes64_t where, const TrackViewList& ts) const;
|
||||
|
||||
void get_regions_for_action (RegionSelection&, bool allow_entered = false, bool allow_edit_position = true);
|
||||
|
||||
|
@ -1974,7 +1971,7 @@ public:
|
|||
BundleManager* _bundle_manager;
|
||||
GlobalPortMatrixWindow* _global_port_matrix[ARDOUR::DataType::num_types];
|
||||
|
||||
void fit_tracks (TrackSelection &);
|
||||
void fit_tracks (TrackViewList &);
|
||||
void fit_selected_tracks ();
|
||||
void set_track_height (uint32_t h);
|
||||
|
||||
|
|
|
@ -274,7 +274,7 @@ RegionMotionDrag::get_time_axis_view_summary ()
|
|||
|
||||
/* get a bitmask representing the visible tracks */
|
||||
|
||||
for (Editor::TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
for (TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
|
||||
TimeAxisView::Children children_list;
|
||||
|
||||
|
@ -1516,7 +1516,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
|
|||
bool obey_snap = !Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier());
|
||||
|
||||
/* snap modifier works differently here..
|
||||
its' current state has to be passed to the
|
||||
its current state has to be passed to the
|
||||
various trim functions in order to work properly
|
||||
*/
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ EditorGroupTabs::compute_tabs () const
|
|||
tab.group = 0;
|
||||
|
||||
int32_t y = 0;
|
||||
for (Editor::TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
for (TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
|
||||
if ((*i)->marked_for_display() == false) {
|
||||
continue;
|
||||
|
@ -118,7 +118,7 @@ EditorGroupTabs::routes_for_tab (Tab const * t) const
|
|||
RouteList routes;
|
||||
int32_t y = 0;
|
||||
|
||||
for (Editor::TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
for (TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
|
||||
if ((*i)->marked_for_display() == false) {
|
||||
continue;
|
||||
|
|
|
@ -2661,7 +2661,7 @@ Editor::region_from_selection ()
|
|||
nframes64_t start = selection->time[clicked_selection].start;
|
||||
nframes64_t end = selection->time[clicked_selection].end;
|
||||
|
||||
TrackSelection tracks = get_tracks_for_range_action ();
|
||||
TrackViewList tracks = get_tracks_for_range_action ();
|
||||
|
||||
nframes64_t selection_cnt = end - start + 1;
|
||||
|
||||
|
@ -2762,10 +2762,10 @@ add_if_covered (RegionView* rv, const AudioRange* ar, RegionSelection* rs)
|
|||
* - all tracks
|
||||
* @return tracks.
|
||||
*/
|
||||
TrackSelection
|
||||
TrackViewList
|
||||
Editor::get_tracks_for_range_action () const
|
||||
{
|
||||
TrackSelection t;
|
||||
TrackViewList t;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
|
||||
|
@ -2801,7 +2801,7 @@ Editor::separate_regions_between (const TimeSelection& ts)
|
|||
boost::shared_ptr<Playlist> playlist;
|
||||
RegionSelection new_selection;
|
||||
|
||||
TrackSelection tmptracks = get_tracks_for_range_action ();
|
||||
TrackViewList tmptracks = get_tracks_for_range_action ();
|
||||
sort_track_selection (&tmptracks);
|
||||
|
||||
for (TrackSelection::iterator i = tmptracks.begin(); i != tmptracks.end(); ++i) {
|
||||
|
@ -2965,7 +2965,7 @@ Editor::crop_region_to (nframes64_t start, nframes64_t end)
|
|||
{
|
||||
vector<boost::shared_ptr<Playlist> > playlists;
|
||||
boost::shared_ptr<Playlist> playlist;
|
||||
TrackSelection* ts;
|
||||
TrackViewList* ts;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
ts = &track_views;
|
||||
|
@ -4230,8 +4230,8 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs)
|
|||
void
|
||||
Editor::cut_copy_ranges (CutCopyOp op)
|
||||
{
|
||||
TrackSelection* ts;
|
||||
TrackSelection entered;
|
||||
TrackViewList* ts;
|
||||
TrackViewList entered;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
if (!entered_track) {
|
||||
|
@ -4289,8 +4289,8 @@ Editor::paste_internal (nframes64_t position, float times)
|
|||
|
||||
begin_reversible_command (_("paste"));
|
||||
|
||||
TrackSelection ts;
|
||||
TrackSelection::iterator i;
|
||||
TrackViewList ts;
|
||||
TrackViewList::iterator i;
|
||||
size_t nth;
|
||||
|
||||
/* get everything in the correct order */
|
||||
|
@ -6380,7 +6380,7 @@ Editor::fit_selected_tracks ()
|
|||
}
|
||||
|
||||
void
|
||||
Editor::fit_tracks (TrackSelection & tracks)
|
||||
Editor::fit_tracks (TrackViewList & tracks)
|
||||
{
|
||||
if (tracks.empty()) {
|
||||
return;
|
||||
|
|
|
@ -306,7 +306,7 @@ EditorRouteGroups::new_from_rec_enabled ()
|
|||
{
|
||||
RouteList rl;
|
||||
|
||||
for (Editor::TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
|
||||
for (TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
|
||||
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
|
||||
if (rtv && rtv->route()->record_enabled()) {
|
||||
rl.push_back (rtv->route());
|
||||
|
@ -325,7 +325,7 @@ EditorRouteGroups::new_from_soloed ()
|
|||
{
|
||||
RouteList rl;
|
||||
|
||||
for (Editor::TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
|
||||
for (TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
|
||||
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
|
||||
if (rtv && !rtv->route()->is_master() && rtv->route()->soloed()) {
|
||||
rl.push_back (rtv->route());
|
||||
|
@ -520,13 +520,13 @@ EditorRouteGroups::row_change (const Gtk::TreeModel::Path&, const Gtk::TreeModel
|
|||
}
|
||||
|
||||
if ((*iter)[_columns.is_visible]) {
|
||||
for (Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
|
||||
for (TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
|
||||
if ((*j)->route_group() == group) {
|
||||
_editor->_routes->show_track_in_display (**j);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
|
||||
for (TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
|
||||
if ((*j)->route_group() == group) {
|
||||
_editor->hide_track_in_display (**j);
|
||||
}
|
||||
|
@ -688,7 +688,7 @@ EditorRouteGroups::collect (RouteGroup* g)
|
|||
int const N = routes->size ();
|
||||
|
||||
RouteList::iterator i = routes->begin ();
|
||||
Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin();
|
||||
TrackViewList::const_iterator j = _editor->get_track_views().begin();
|
||||
|
||||
int diff = 0;
|
||||
int coll = -1;
|
||||
|
|
|
@ -262,48 +262,6 @@ Editor::get_onscreen_tracks (TrackViewList& tvl)
|
|||
}
|
||||
}
|
||||
|
||||
/** Given a track, find any other tracks that are in the same active route group with a given property.
|
||||
* @param basis Base track.
|
||||
* @param equivs Filled with the base track and the found tracks.
|
||||
* @param prop Property to look for in route groups.
|
||||
*/
|
||||
|
||||
void
|
||||
Editor::get_equivalent_tracks (RouteTimeAxisView* basis, set<RouteTimeAxisView*> & equivs, RouteGroup::Property prop) const
|
||||
{
|
||||
equivs.insert (basis);
|
||||
|
||||
RouteGroup* group = basis->route()->route_group();
|
||||
if (group && group->active_property (prop)) {
|
||||
|
||||
/* the basis is a member of an active route group, with the appropriate
|
||||
properties; 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()->route_group() == group) {
|
||||
equivs.insert (v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Find tracks that are selected, and also those that are in the same `selection'-enabled route
|
||||
* group as one that is selected.
|
||||
* @param relevant_tracks set to add tracks to.
|
||||
*/
|
||||
|
||||
void
|
||||
Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks) const
|
||||
{
|
||||
for (TrackSelection::iterator ti = selection->tracks.begin(); ti != selection->tracks.end(); ++ti) {
|
||||
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*ti);
|
||||
if (rtv) {
|
||||
get_equivalent_tracks (rtv, relevant_tracks, RouteGroup::Select);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Call a slot for a given `basis' track and also for any track that is in the same
|
||||
* active route group with a particular set of properties.
|
||||
*
|
||||
|
@ -321,7 +279,21 @@ Editor::mapover_tracks (sigc::slot<void, RouteTimeAxisView&, uint32_t> sl, TimeA
|
|||
}
|
||||
|
||||
set<RouteTimeAxisView*> tracks;
|
||||
get_equivalent_tracks (route_basis, tracks, prop);
|
||||
tracks.insert (route_basis);
|
||||
|
||||
RouteGroup* group = route_basis->route()->route_group();
|
||||
if (group && group->active_property (prop)) {
|
||||
|
||||
/* the basis is a member of an active route group, with the appropriate
|
||||
properties; 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()->route_group() == group) {
|
||||
tracks.insert (v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* call the slots */
|
||||
uint32_t const sz = tracks.size ();
|
||||
|
@ -490,8 +462,6 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
|
|||
|
||||
/* add all the equivalent regions, but only on button press */
|
||||
|
||||
|
||||
|
||||
if (!all_equivalent_regions.empty()) {
|
||||
commit = true;
|
||||
}
|
||||
|
@ -611,16 +581,23 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
|
|||
/* 2. find all the tracks we should select in */
|
||||
|
||||
set<RouteTimeAxisView*> relevant_tracks;
|
||||
set<RouteTimeAxisView*> already_in_selection;
|
||||
|
||||
get_relevant_tracks (relevant_tracks);
|
||||
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
|
||||
RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
|
||||
if (r) {
|
||||
relevant_tracks.insert (r);
|
||||
}
|
||||
}
|
||||
|
||||
set<RouteTimeAxisView*> already_in_selection;
|
||||
|
||||
if (relevant_tracks.empty()) {
|
||||
|
||||
/* no relevant tracks -> no tracks selected .. thus .. if
|
||||
the regionview we're in isn't selected (i.e. we're
|
||||
about to extend to it), then find all tracks between
|
||||
the this one and any selected ones.
|
||||
/* no tracks selected .. thus .. if the
|
||||
regionview we're in isn't selected
|
||||
(i.e. we're about to extend to it), then
|
||||
find all tracks between the this one and
|
||||
any selected ones.
|
||||
*/
|
||||
|
||||
if (!selection->selected (entered_regionview)) {
|
||||
|
@ -654,7 +631,6 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
|
|||
if (result.second) {
|
||||
/* newly added to already_in_selection */
|
||||
|
||||
|
||||
int d = artv->route()->order_key ("editor");
|
||||
|
||||
d -= key;
|
||||
|
@ -709,8 +685,6 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
|
|||
one that was clicked.
|
||||
*/
|
||||
|
||||
get_relevant_tracks (relevant_tracks);
|
||||
|
||||
for (set<RouteTimeAxisView*>::iterator t = relevant_tracks.begin(); t != relevant_tracks.end(); ++t) {
|
||||
(*t)->get_selectables (first_frame, last_frame, -1.0, -1.0, results);
|
||||
}
|
||||
|
@ -1116,7 +1090,7 @@ Editor::select_all_selectables_using_time_selection ()
|
|||
return;
|
||||
}
|
||||
|
||||
TrackSelection* ts;
|
||||
TrackViewList* ts;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
ts = &track_views;
|
||||
|
@ -1148,7 +1122,7 @@ Editor::select_all_selectables_using_punch()
|
|||
}
|
||||
|
||||
|
||||
TrackSelection* ts;
|
||||
TrackViewList* ts;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
ts = &track_views;
|
||||
|
@ -1179,7 +1153,7 @@ Editor::select_all_selectables_using_loop()
|
|||
}
|
||||
|
||||
|
||||
TrackSelection* ts;
|
||||
TrackViewList* ts;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
ts = &track_views;
|
||||
|
@ -1221,7 +1195,7 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after)
|
|||
}
|
||||
|
||||
|
||||
TrackSelection* ts;
|
||||
TrackViewList* ts;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
ts = &track_views;
|
||||
|
@ -1261,7 +1235,7 @@ Editor::select_all_selectables_using_edit (bool after)
|
|||
}
|
||||
|
||||
|
||||
TrackSelection* ts;
|
||||
TrackViewList* ts;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
ts = &track_views;
|
||||
|
@ -1290,7 +1264,7 @@ Editor::select_all_selectables_between (bool /*within*/)
|
|||
return;
|
||||
}
|
||||
|
||||
TrackSelection* ts;
|
||||
TrackViewList* ts;
|
||||
|
||||
if (selection->tracks.empty()) {
|
||||
ts = &track_views;
|
||||
|
|
|
@ -143,7 +143,7 @@ EditorSummary::render (cairo_t* cr)
|
|||
|
||||
int h = 0;
|
||||
int max_height = 0;
|
||||
for (PublicEditor::TrackViewList::const_iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
for (TrackViewList::const_iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
int const t = (*i)->effective_height ();
|
||||
h += t;
|
||||
max_height = max (max_height, t);
|
||||
|
@ -163,7 +163,7 @@ EditorSummary::render (cairo_t* cr)
|
|||
/* render regions */
|
||||
|
||||
double y = 0;
|
||||
for (PublicEditor::TrackViewList::const_iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
for (TrackViewList::const_iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
|
||||
StreamView* s = (*i)->view ();
|
||||
|
||||
if (s) {
|
||||
|
|
|
@ -88,8 +88,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
|
|||
PublicEditor ();
|
||||
virtual ~PublicEditor ();
|
||||
|
||||
typedef TrackSelection TrackViewList;
|
||||
|
||||
/** @return Singleton PublicEditor instance */
|
||||
static PublicEditor& instance () { return *_instance; }
|
||||
|
||||
|
@ -244,7 +242,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
|
|||
virtual double get_physical_screen_width() const = 0;
|
||||
virtual void ensure_float (Gtk::Window&) = 0;
|
||||
virtual void show_window () = 0;
|
||||
virtual TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0) = 0;
|
||||
virtual nframes64_t leftmost_position() const = 0;
|
||||
virtual nframes64_t current_page_frames() const = 0;
|
||||
virtual void temporal_zoom_step (bool coarser) = 0;
|
||||
|
@ -353,6 +350,9 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
|
|||
|
||||
virtual void center_screen (nframes64_t) = 0;
|
||||
|
||||
virtual TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const = 0;
|
||||
virtual TrackViewList const & get_track_views () = 0;
|
||||
|
||||
/// Singleton instance, set up by Editor::Editor()
|
||||
|
||||
static PublicEditor* _instance;
|
||||
|
|
|
@ -1176,33 +1176,23 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev)
|
|||
return;
|
||||
}
|
||||
|
||||
PublicEditor::TrackViewList* tracks = _editor.get_valid_views (this, _route->route_group());
|
||||
|
||||
switch (ArdourKeyboard::selection_type (ev->state)) {
|
||||
case Selection::Toggle:
|
||||
_editor.get_selection().toggle (*tracks);
|
||||
_editor.get_selection().toggle (this);
|
||||
break;
|
||||
|
||||
case Selection::Set:
|
||||
_editor.get_selection().set (*tracks);
|
||||
_editor.get_selection().set (this);
|
||||
break;
|
||||
|
||||
case Selection::Extend:
|
||||
if (tracks->size() > 1) {
|
||||
/* add each one, do not "extend" */
|
||||
_editor.get_selection().add (*tracks);
|
||||
} else {
|
||||
/* extend to the single track */
|
||||
_editor.extend_selection_to_track (*tracks->front());
|
||||
}
|
||||
_editor.extend_selection_to_track (*this);
|
||||
break;
|
||||
|
||||
case Selection::Add:
|
||||
_editor.get_selection().add (*tracks);
|
||||
_editor.get_selection().add (this);
|
||||
break;
|
||||
}
|
||||
|
||||
delete tracks;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -197,9 +197,9 @@ Selection::toggle (boost::shared_ptr<Playlist> pl)
|
|||
}
|
||||
|
||||
void
|
||||
Selection::toggle (const list<TimeAxisView*>& track_list)
|
||||
Selection::toggle (const TrackViewList& track_list)
|
||||
{
|
||||
for (list<TimeAxisView*>::const_iterator i = track_list.begin(); i != track_list.end(); ++i) {
|
||||
for (TrackViewList::const_iterator i = track_list.begin(); i != track_list.end(); ++i) {
|
||||
toggle ((*i));
|
||||
}
|
||||
}
|
||||
|
@ -334,9 +334,9 @@ Selection::add (const list<boost::shared_ptr<Playlist> >& pllist)
|
|||
}
|
||||
|
||||
void
|
||||
Selection::add (const list<TimeAxisView*>& track_list)
|
||||
Selection::add (const TrackViewList& track_list)
|
||||
{
|
||||
list<TimeAxisView*> added = tracks.add (track_list);
|
||||
TrackViewList added = tracks.add (track_list);
|
||||
|
||||
for (list<TimeAxisView*>::const_iterator i = added.begin(); i != added.end(); ++i) {
|
||||
void (Selection::*pmf)(TimeAxisView*) = &Selection::remove;
|
||||
|
@ -351,12 +351,9 @@ Selection::add (const list<TimeAxisView*>& track_list)
|
|||
void
|
||||
Selection::add (TimeAxisView* track)
|
||||
{
|
||||
if (find (tracks.begin(), tracks.end(), track) == tracks.end()) {
|
||||
void (Selection::*pmf)(TimeAxisView*) = &Selection::remove;
|
||||
track->GoingAway.connect (sigc::bind (sigc::mem_fun (*this, pmf), track));
|
||||
tracks.push_back (track);
|
||||
TracksChanged();
|
||||
}
|
||||
TrackViewList tr;
|
||||
tr.push_back (track);
|
||||
add (tr);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -516,15 +513,14 @@ Selection::remove (TimeAxisView* track)
|
|||
}
|
||||
|
||||
void
|
||||
Selection::remove (const list<TimeAxisView*>& track_list)
|
||||
Selection::remove (const TrackViewList& track_list)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
for (list<TimeAxisView*>::const_iterator i = track_list.begin(); i != track_list.end(); ++i) {
|
||||
for (TrackViewList::const_iterator i = track_list.begin(); i != track_list.end(); ++i) {
|
||||
|
||||
list<TimeAxisView*>::iterator x;
|
||||
|
||||
if ((x = find (tracks.begin(), tracks.end(), (*i))) != tracks.end()) {
|
||||
TrackViewList::iterator x = find (tracks.begin(), tracks.end(), *i);
|
||||
if (x != tracks.end()) {
|
||||
tracks.erase (x);
|
||||
changed = true;
|
||||
}
|
||||
|
@ -669,7 +665,7 @@ Selection::set (TimeAxisView* track)
|
|||
}
|
||||
|
||||
void
|
||||
Selection::set (const list<TimeAxisView*>& track_list)
|
||||
Selection::set (const TrackViewList& track_list)
|
||||
{
|
||||
clear_tracks ();
|
||||
add (track_list);
|
||||
|
|
|
@ -82,7 +82,7 @@ class Selection : public sigc::trackable
|
|||
MidiRegionSelection midi_regions;
|
||||
MidiNoteSelection midi_notes;
|
||||
|
||||
Selection (PublicEditor const * e) : editor (e), next_time_id (0) {
|
||||
Selection (PublicEditor const * e) : tracks (e), editor (e), next_time_id (0) {
|
||||
clear();
|
||||
}
|
||||
|
||||
|
@ -112,7 +112,7 @@ class Selection : public sigc::trackable
|
|||
void toggle (std::list<Selectable*>&);
|
||||
|
||||
void set (TimeAxisView*);
|
||||
void set (const std::list<TimeAxisView*>&);
|
||||
void set (const TrackViewList&);
|
||||
void set (const MidiNoteSelection&);
|
||||
void set (RegionView*, bool also_clear_tracks = true);
|
||||
void set (MidiRegionView*);
|
||||
|
@ -126,7 +126,7 @@ class Selection : public sigc::trackable
|
|||
void set (const RegionSelection&);
|
||||
|
||||
void toggle (TimeAxisView*);
|
||||
void toggle (const std::list<TimeAxisView*>&);
|
||||
void toggle (const TrackViewList&);
|
||||
void toggle (const MidiNoteSelection&);
|
||||
void toggle (RegionView*);
|
||||
void toggle (MidiRegionView*);
|
||||
|
@ -140,7 +140,7 @@ class Selection : public sigc::trackable
|
|||
void toggle (Marker*);
|
||||
|
||||
void add (TimeAxisView*);
|
||||
void add (const std::list<TimeAxisView*>&);
|
||||
void add (const TrackViewList&);
|
||||
void add (const MidiNoteSelection&);
|
||||
void add (RegionView*);
|
||||
void add (MidiRegionView*);
|
||||
|
@ -154,7 +154,7 @@ class Selection : public sigc::trackable
|
|||
void add (const std::list<Marker*>&);
|
||||
void add (const RegionSelection&);
|
||||
void remove (TimeAxisView*);
|
||||
void remove (const std::list<TimeAxisView*>&);
|
||||
void remove (const TrackViewList&);
|
||||
void remove (const MidiNoteSelection&);
|
||||
void remove (RegionView*);
|
||||
void remove (MidiRegionView*);
|
||||
|
|
|
@ -424,8 +424,7 @@ TimeAxisView::set_height(uint32_t h)
|
|||
bool
|
||||
TimeAxisView::name_entry_key_release (GdkEventKey* ev)
|
||||
{
|
||||
PublicEditor::TrackViewList *allviews = 0;
|
||||
PublicEditor::TrackViewList::iterator i;
|
||||
TrackViewList::iterator i;
|
||||
|
||||
switch (ev->keyval) {
|
||||
case GDK_Escape:
|
||||
|
@ -440,38 +439,40 @@ TimeAxisView::name_entry_key_release (GdkEventKey* ev)
|
|||
*/
|
||||
case GDK_ISO_Left_Tab:
|
||||
case GDK_Tab:
|
||||
{
|
||||
name_entry_changed ();
|
||||
allviews = _editor.get_valid_views (0);
|
||||
if (allviews != 0) {
|
||||
i = find (allviews->begin(), allviews->end(), this);
|
||||
if (ev->keyval == GDK_Tab) {
|
||||
if (i != allviews->end()) {
|
||||
do {
|
||||
if (++i == allviews->end()) { return true; }
|
||||
} while((*i)->hidden());
|
||||
}
|
||||
} else {
|
||||
if (i != allviews->begin()) {
|
||||
do {
|
||||
if (i == allviews->begin()) {
|
||||
return true;
|
||||
}
|
||||
--i;
|
||||
} while ((*i)->hidden());
|
||||
}
|
||||
TrackViewList const & allviews = _editor.get_track_views ();
|
||||
TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(), this);
|
||||
if (ev->keyval == GDK_Tab) {
|
||||
if (i != allviews.end()) {
|
||||
do {
|
||||
if (++i == allviews.end()) {
|
||||
return true;
|
||||
}
|
||||
} while((*i)->hidden());
|
||||
}
|
||||
|
||||
|
||||
/* resize to show editable name display */
|
||||
|
||||
if ((*i)->current_height() <= hSmaller) {
|
||||
(*i)->set_height (hSmaller);
|
||||
} else {
|
||||
if (i != allviews.begin()) {
|
||||
do {
|
||||
if (i == allviews.begin()) {
|
||||
return true;
|
||||
}
|
||||
--i;
|
||||
} while ((*i)->hidden());
|
||||
}
|
||||
|
||||
(*i)->name_entry.grab_focus();
|
||||
}
|
||||
return true;
|
||||
|
||||
|
||||
|
||||
/* resize to show editable name display */
|
||||
|
||||
if ((*i)->current_height() <= hSmaller) {
|
||||
(*i)->set_height (hSmaller);
|
||||
}
|
||||
|
||||
(*i)->name_entry.grab_focus();
|
||||
}
|
||||
return true;
|
||||
|
||||
case GDK_Up:
|
||||
case GDK_Down:
|
||||
name_entry_changed ();
|
||||
|
|
|
@ -1,31 +1,57 @@
|
|||
/*
|
||||
Copyright (C) 2000-2009 Paul Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include "ardour/route_group.h"
|
||||
#include "track_selection.h"
|
||||
#include "time_axis_view.h"
|
||||
#include "public_editor.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
TrackSelection::TrackSelection (list<TimeAxisView*> const &t)
|
||||
: list<TimeAxisView*> (t)
|
||||
TrackSelection::TrackSelection (PublicEditor const * e, TrackViewList const &t)
|
||||
: TrackViewList (t)
|
||||
, _editor (e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
list<TimeAxisView*>
|
||||
TrackSelection::add (list<TimeAxisView*> const & t)
|
||||
TrackViewList
|
||||
TrackSelection::add (TrackViewList const & t)
|
||||
{
|
||||
list<TimeAxisView*> added;
|
||||
TrackViewList added = TrackViewList::add (t);
|
||||
|
||||
for (TrackSelection::const_iterator i = t.begin(); i != t.end(); ++i) {
|
||||
if (!contains (*i)) {
|
||||
added.push_back (*i);
|
||||
push_back (*i);
|
||||
|
||||
/* select anything in the same select-enabled route group */
|
||||
ARDOUR::RouteGroup* rg = (*i)->route_group ();
|
||||
if (rg && rg->property (ARDOUR::RouteGroup::Select)) {
|
||||
TrackViewList tr = _editor->axis_views_from_routes (rg->route_list ());
|
||||
for (TrackViewList::iterator j = tr.begin(); j != tr.end(); ++j) {
|
||||
if (!contains (*j)) {
|
||||
added.push_back (*j);
|
||||
push_back (*j);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return added;
|
||||
}
|
||||
|
||||
bool
|
||||
TrackSelection::contains (TimeAxisView const * t) const
|
||||
{
|
||||
return find (begin(), end(), t) != end();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2000-2007 Paul Davis
|
||||
Copyright (C) 2000-2009 Paul Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -20,18 +20,20 @@
|
|||
#ifndef __ardour_gtk_track_selection_h__
|
||||
#define __ardour_gtk_track_selection_h__
|
||||
|
||||
#include <list>
|
||||
#include "track_view_list.h"
|
||||
|
||||
class TimeAxisView;
|
||||
class PublicEditor;
|
||||
|
||||
class TrackSelection : public std::list<TimeAxisView*>
|
||||
class TrackSelection : public TrackViewList
|
||||
{
|
||||
public:
|
||||
TrackSelection () {}
|
||||
TrackSelection (PublicEditor const * e) : _editor (e) {}
|
||||
TrackSelection (PublicEditor const *, TrackViewList const &);
|
||||
|
||||
TrackViewList add (TrackViewList const &);
|
||||
|
||||
TrackSelection (std::list<TimeAxisView*> const &);
|
||||
std::list<TimeAxisView*> add (std::list<TimeAxisView*> const &);
|
||||
bool contains (TimeAxisView const *) const;
|
||||
private:
|
||||
PublicEditor const * _editor;
|
||||
};
|
||||
|
||||
#endif /* __ardour_gtk_track_selection_h__ */
|
||||
|
|
|
@ -192,6 +192,7 @@ gtk2_ardour_sources = [
|
|||
'time_fx_dialog.cc',
|
||||
'time_selection.cc',
|
||||
'track_selection.cc',
|
||||
'track_view_list.cc',
|
||||
'ui_config.cc',
|
||||
'utils.cc',
|
||||
'version.cc',
|
||||
|
|
|
@ -125,7 +125,6 @@ public:
|
|||
void destroy_subgroup ();
|
||||
|
||||
boost::shared_ptr<RouteList> route_list() { return routes; }
|
||||
boost::shared_ptr<RouteList> route_list (Property forProperty);
|
||||
|
||||
sigc::signal<void> changed;
|
||||
sigc::signal<void,void*> FlagsChanged;
|
||||
|
|
Loading…
Reference in New Issue