Various adjustments to make more operations respect the Edit property on route groups.

git-svn-id: svn://localhost/ardour2/branches/3.0@5273 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-06-25 20:58:32 +00:00
parent 8e7a5d7741
commit 498afeb63e
11 changed files with 128 additions and 153 deletions

View File

@ -4485,7 +4485,7 @@ Editor::restore_editing_space ()
/**
* Make new playlists for a given track and also any others that belong
* to the same active edit group.
* to the same active route group with the `edit' property.
* @param v Track.
*/
@ -4495,13 +4495,13 @@ Editor::new_playlists (TimeAxisView* v)
begin_reversible_command (_("new playlists"));
vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
session->get_playlists(playlists);
mapover_tracks ( bind(mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v );
mapover_tracks (bind (mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v, RouteGroup::Edit);
commit_reversible_command ();
}
/**
* Use a copy of the current playlist for a given track and also any others that belong
* to the same active edit group.
* to the same active route group with the `edit' property.
* @param v Track.
*/
@ -4511,13 +4511,12 @@ Editor::copy_playlists (TimeAxisView* v)
begin_reversible_command (_("copy playlists"));
vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
session->get_playlists(playlists);
mapover_tracks ( bind(mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v );
mapover_tracks (bind (mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v, RouteGroup::Edit);
commit_reversible_command ();
}
/**
* Clear the current playlist for a given track and also any others that belong
* to the same active edit group.
/** Clear the current playlist for a given track and also any others that belong
* to the same active route group with the `edit' property.
* @param v Track.
*/
@ -4527,7 +4526,7 @@ Editor::clear_playlists (TimeAxisView* v)
begin_reversible_command (_("clear playlists"));
vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
session->get_playlists(playlists);
mapover_tracks ( mem_fun (*this, &Editor::mapped_clear_playlist), v );
mapover_tracks (mem_fun (*this, &Editor::mapped_clear_playlist), v, RouteGroup::Edit);
commit_reversible_command ();
}
@ -5065,42 +5064,25 @@ Editor::get_regions_after (RegionSelection& rs, nframes64_t where, const TrackSe
void
Editor::get_regions_for_action (RegionSelection& rs, bool allow_entered)
{
if (selection->regions.empty()) {
rs = selection->regions;
/* no regions selected; get all regions at the edit point across:
- tracks in the region's route's edit group, if it has the edit property
- selected tracks
*/
if (allow_entered && entered_regionview) {
rs.add (entered_regionview);
}
if (entered_regionview) {
rs.add (entered_regionview);
TrackSelection tracks = selection->tracks;
TrackSelection tracks = selection->tracks;
RegionSelection to_map = rs;
RouteGroup* g = entered_regionview->get_time_axis_view().route_group ();
if (g && g->active_property (RouteGroup::Edit)) {
tracks.add (axis_views_from_routes (g->route_list()));
}
for (RegionSelection::iterator i = to_map.begin (); i != to_map.end(); ++i) {
nframes64_t const where = get_preferred_edit_position ();
get_regions_at (rs, where, tracks);
}
} else {
/* use the selected regions */
rs = selection->regions;
/* if the entered regionview wasn't selected and we allow this sort of thing,
then add it.
*/
if (allow_entered && entered_regionview && !selection->selected (entered_regionview)) {
rs.add (entered_regionview);
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()));
}
nframes64_t const where = get_preferred_edit_position ();
get_regions_at (rs, where, tracks);
}
}

View File

@ -53,6 +53,7 @@
#include "ardour/audioregion.h"
#include "ardour/track.h"
#include "ardour/types.h"
#include "ardour/route_group.h"
#include "audio_clock.h"
#include "gtk-custom-ruler.h"
@ -533,13 +534,15 @@ class Editor : public PublicEditor
void sort_track_selection (TrackSelection* sel = 0);
void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const;
void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*) const;
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;
/* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, std::vector<RegionView*>*) const;
void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView *, std::vector<RegionView*>*) const;
void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
@ -1145,7 +1148,6 @@ class Editor : public PublicEditor
void lower_region ();
void lower_region_to_bottom ();
void split_region ();
void split_region_at (nframes64_t);
void split_regions_at (nframes64_t, RegionSelection&);
void split_region_at_transients ();
void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret);

View File

@ -145,8 +145,6 @@ Drag::end_grab (GdkEvent* event)
_editor->hide_verbose_canvas_cursor();
update_selection ();
_ending = false;
return _had_movement;
@ -253,14 +251,6 @@ RegionDrag::region_going_away (RegionView* v)
_views.remove (v);
}
void
RegionDrag::update_selection ()
{
list<Selectable*> s;
copy (_views.begin(), _views.end(), back_inserter (s));
_editor->selection->set (s);
}
RegionMotionDrag::RegionMotionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v, bool b)
: RegionDrag (e, i, p, v),
_dest_trackview (0),

View File

@ -114,9 +114,6 @@ public:
return true;
}
/** Called when a subclass should update the editor's selection following a drag */
virtual void update_selection () {}
protected:
nframes64_t adjusted_current_frame (GdkEvent *) const;
@ -155,8 +152,6 @@ public:
RegionDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &);
virtual ~RegionDrag () {}
void update_selection ();
protected:
RegionView* _primary; ///< the view that was clicked on (or whatever) to start the drag

View File

@ -820,16 +820,22 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
switch (item_type) {
case FadeInHandleItem:
{
assert (_drag == 0);
_drag = new FadeInDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), selection->regions);
RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit);
_drag = new FadeInDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), s);
_drag->start_grab (event);
return true;
}
case FadeOutHandleItem:
{
assert (_drag == 0);
_drag = new FadeOutDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), selection->regions);
RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit);
_drag = new FadeOutDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), s);
_drag->start_grab (event);
return true;
}
case RegionItem:
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
@ -842,19 +848,25 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
break;
case RegionViewNameHighlight:
{
assert (_drag == 0);
_drag = new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer());
RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit);
_drag = new TrimDrag (this, item, clicked_regionview, s.by_layer());
_drag->start_grab (event);
return true;
break;
}
case RegionViewName:
{
/* rename happens on edit clicks */
assert (_drag == 0);
_drag = new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, selection->regions.by_layer());
RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit);
_drag = new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, s.by_layer());
_drag->start_grab (event);
return true;
break;
}
case ControlPointItem:
assert (_drag == 0);
@ -2542,7 +2554,8 @@ Editor::start_region_grab (ArdourCanvas::Item* item, GdkEvent* event, RegionView
if (Config->get_edit_mode() == Splice) {
_drag = new RegionSpliceDrag (this, item, region_view, selection->regions.by_layer());
} else {
_drag = new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), false, false);
RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit);
_drag = new RegionMoveDrag (this, item, region_view, s.by_layer(), false, false);
}
_drag->start_grab (event);
@ -2560,7 +2573,9 @@ Editor::start_region_copy_grab (ArdourCanvas::Item* item, GdkEvent* event, Regio
assert (_drag == 0);
_region_motion_group->raise_to_top ();
_drag = new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), false, true);
RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit);
_drag = new RegionMoveDrag (this, item, region_view, s.by_layer(), false, true);
_drag->start_grab(event);
}
@ -2574,7 +2589,8 @@ Editor::start_region_brush_grab (ArdourCanvas::Item* item, GdkEvent* event, Regi
return;
}
_drag = new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), true, false);
RegionSelection s = get_equivalent_regions (selection->regions, RouteGroup::Edit);
_drag = new RegionMoveDrag (this, item, region_view, s.by_layer(), true, false);
_drag->start_grab (event);
begin_reversible_command (_("Drag region brush"));

View File

@ -110,17 +110,11 @@ Editor::redo (uint32_t n)
void
Editor::split_region ()
{
split_region_at (get_preferred_edit_position());
}
void
Editor::split_region_at (nframes64_t where)
{
RegionSelection rs;
get_regions_for_action (rs);
split_regions_at (where, selection->regions);
get_regions_for_action (rs, true);
split_regions_at (get_preferred_edit_position (), selection->regions);
}
void
@ -5413,7 +5407,7 @@ Editor::split ()
{
RegionSelection rs;
get_regions_for_action (rs);
get_regions_for_action (rs, true);
nframes64_t where = get_preferred_edit_position();

View File

@ -261,76 +261,66 @@ 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_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
Editor::get_equivalent_tracks (RouteTimeAxisView* basis, set<RouteTimeAxisView*> & equivs, RouteGroup::Property prop) const
{
/* step one: get all selected tracks and all tracks in the relevant edit groups */
equivs.insert (basis);
for (TrackSelection::iterator ti = selection->tracks.begin(); ti != selection->tracks.end(); ++ti) {
RouteGroup* group = basis->route()->route_group();
if (group && group->active_property (prop)) {
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(*ti);
if (!rtv) {
continue;
}
RouteGroup* group = rtv->route()->route_group();
if (group && group->is_active()) {
/* active group for this track, loop over all tracks and get every member of the group */
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
RouteTimeAxisView* trtv;
if ((trtv = dynamic_cast<RouteTimeAxisView*> (*i)) != 0) {
if (trtv->route()->route_group() == group) {
relevant_tracks.insert (trtv);
}
}
/* 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);
}
} else {
relevant_tracks.insert (rtv);
}
}
}
/**
* Call a slot for a given `basis' track and also for any track that is in the same
* active route group with the `select' property.
* @param sl Slot to call.
* @param basis Basis track.
/** 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::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisView* basis) const
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.
*
* @param sl Slot to call.
* @param basis Basis track.
* @param prop Properties that active edit groups must share to be included in the map.
*/
void
Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisView* basis, RouteGroup::Property prop) const
{
RouteTimeAxisView* route_basis = dynamic_cast<RouteTimeAxisView*> (basis);
if (route_basis == 0) {
return;
}
/* work out the tracks that we will call the slot for; use
a set here as it will disallow possible duplicates of the
basis track */
set<RouteTimeAxisView*> tracks;
/* always call for the basis */
tracks.insert (route_basis);
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()->route_group() == group) {
tracks.insert (v);
}
}
}
get_equivalent_tracks (route_basis, tracks, prop);
/* call the slots */
uint32_t const sz = tracks.size ();
@ -340,7 +330,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) const
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;
@ -369,15 +359,40 @@ Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored,
}
void
Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions) const
Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions, RouteGroup::Property prop) const
{
mapover_tracks (bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_trackview());
mapover_tracks (bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_trackview(), prop);
/* add clicked regionview since we skipped all other regions in the same track as the one it was in */
equivalent_regions.push_back (basis);
}
RegionSelection
Editor::get_equivalent_regions (RegionSelection & basis, RouteGroup::Property prop) const
{
RegionSelection equivalent;
for (RegionSelection::const_iterator i = basis.begin(); i != basis.end(); ++i) {
vector<RegionView*> eq;
mapover_tracks (
bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), *i, &eq),
&(*i)->get_trackview(), prop
);
for (vector<RegionView*>::iterator j = eq.begin(); j != eq.end(); ++j) {
equivalent.add (*j);
}
equivalent.add (*i);
}
return equivalent;
}
int
Editor::get_regionview_count_from_region_list (boost::shared_ptr<Region> region)
{
@ -467,7 +482,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
if (press) {
if (selection->selected (clicked_routeview)) {
get_equivalent_regions (clicked_regionview, all_equivalent_regions);
get_equivalent_regions (clicked_regionview, all_equivalent_regions, RouteGroup::Select);
} else {
all_equivalent_regions.push_back (clicked_regionview);
}
@ -487,7 +502,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
case Selection::Set:
if (!selection->selected (clicked_regionview)) {
get_equivalent_regions (clicked_regionview, all_equivalent_regions);
get_equivalent_regions (clicked_regionview, all_equivalent_regions, RouteGroup::Select);
selection->set (all_equivalent_regions);
commit = true;
} else {

View File

@ -30,6 +30,8 @@
#include <jack/types.h>
#include <sigc++/signal.h>
#include "ardour/route_group.h"
#include "pbd/statefuldestructible.h"
#include "editing.h"
@ -273,7 +275,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
virtual RouteTimeAxisView* get_route_view_by_id (PBD::ID& id) = 0;
virtual void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const = 0;
virtual void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&, ARDOUR::RouteGroup::Property) const = 0;
sigc::signal<void> ZoomFocusChanged;
sigc::signal<void> ZoomChanged;

View File

@ -333,7 +333,6 @@ Selection::add (const RegionSelection& rs)
}
if (changed) {
select_edit_group_regions ();
RegionsChanged ();
}
}
@ -742,24 +741,6 @@ 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);
}
}
void
Selection::set (Marker* m)
{

View File

@ -165,8 +165,6 @@ 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;

View File

@ -73,7 +73,7 @@ public:
void set_hidden (bool yn, void *src);
bool property (Property p) const {
return ((_properties & p) != 0);
return ((_properties & p) == p);
}
bool active_property (Property p) const {