Try to make new layering stuff play nicely with undo.
git-svn-id: svn://localhost/ardour2/branches/3.0@11097 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
86cb9348e8
commit
f440f91849
|
@ -1099,6 +1099,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
void toggle_solo_isolate ();
|
void toggle_solo_isolate ();
|
||||||
void toggle_mute ();
|
void toggle_mute ();
|
||||||
void toggle_region_lock_style ();
|
void toggle_region_lock_style ();
|
||||||
|
|
||||||
|
enum LayerOperation {
|
||||||
|
Raise,
|
||||||
|
RaiseToTop,
|
||||||
|
Lower,
|
||||||
|
LowerToBottom
|
||||||
|
};
|
||||||
|
|
||||||
|
void do_layer_operation (LayerOperation);
|
||||||
void raise_region ();
|
void raise_region ();
|
||||||
void raise_region_to_top ();
|
void raise_region_to_top ();
|
||||||
void change_region_layering_order (bool from_context_menu);
|
void change_region_layering_order (bool from_context_menu);
|
||||||
|
|
|
@ -2133,28 +2133,101 @@ Editor::loop_location (Location& location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Editor::do_layer_operation (LayerOperation op)
|
||||||
|
{
|
||||||
|
if (selection->regions.empty ()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool const multiple = selection->regions.size() > 1;
|
||||||
|
switch (op) {
|
||||||
|
case Raise:
|
||||||
|
if (multiple) {
|
||||||
|
begin_reversible_command (_("raise regions"));
|
||||||
|
} else {
|
||||||
|
begin_reversible_command (_("raise region"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RaiseToTop:
|
||||||
|
if (multiple) {
|
||||||
|
begin_reversible_command (_("raise regions to top"));
|
||||||
|
} else {
|
||||||
|
begin_reversible_command (_("raise region to top"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Lower:
|
||||||
|
if (multiple) {
|
||||||
|
begin_reversible_command (_("lower regions"));
|
||||||
|
} else {
|
||||||
|
begin_reversible_command (_("lower region"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LowerToBottom:
|
||||||
|
if (multiple) {
|
||||||
|
begin_reversible_command (_("lower regions to bottom"));
|
||||||
|
} else {
|
||||||
|
begin_reversible_command (_("lower region"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
set<boost::shared_ptr<Playlist> > playlists = selection->regions.playlists ();
|
||||||
|
for (set<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
|
||||||
|
(*i)->clear_owned_changes ();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
|
||||||
|
boost::shared_ptr<Region> r = (*i)->region ();
|
||||||
|
switch (op) {
|
||||||
|
case Raise:
|
||||||
|
r->raise ();
|
||||||
|
break;
|
||||||
|
case RaiseToTop:
|
||||||
|
r->raise_to_top ();
|
||||||
|
break;
|
||||||
|
case Lower:
|
||||||
|
r->lower ();
|
||||||
|
break;
|
||||||
|
case LowerToBottom:
|
||||||
|
r->lower_to_bottom ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (set<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
|
||||||
|
vector<Command*> cmds;
|
||||||
|
(*i)->rdiff (cmds);
|
||||||
|
_session->add_commands (cmds);
|
||||||
|
}
|
||||||
|
|
||||||
|
commit_reversible_command ();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::raise_region ()
|
Editor::raise_region ()
|
||||||
{
|
{
|
||||||
selection->foreach_region (&Region::raise);
|
do_layer_operation (Raise);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::raise_region_to_top ()
|
Editor::raise_region_to_top ()
|
||||||
{
|
{
|
||||||
selection->foreach_region (&Region::raise_to_top);
|
do_layer_operation (RaiseToTop);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::lower_region ()
|
Editor::lower_region ()
|
||||||
{
|
{
|
||||||
selection->foreach_region (&Region::lower);
|
do_layer_operation (Lower);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::lower_region_to_bottom ()
|
Editor::lower_region_to_bottom ()
|
||||||
{
|
{
|
||||||
selection->foreach_region (&Region::lower_to_bottom);
|
do_layer_operation (LowerToBottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Show the region editor for the selected regions */
|
/** Show the region editor for the selected regions */
|
||||||
|
|
|
@ -274,3 +274,15 @@ RegionSelection::end_frame () const
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return the playlists that the regions in the selection are on */
|
||||||
|
set<boost::shared_ptr<Playlist> >
|
||||||
|
RegionSelection::playlists () const
|
||||||
|
{
|
||||||
|
set<boost::shared_ptr<Playlist> > pl;
|
||||||
|
for (RegionSelection::const_iterator i = begin(); i != end(); ++i) {
|
||||||
|
pl.insert ((*i)->region()->playlist ());
|
||||||
|
}
|
||||||
|
|
||||||
|
return pl;
|
||||||
|
}
|
||||||
|
|
|
@ -25,6 +25,10 @@
|
||||||
#include "pbd/signals.h"
|
#include "pbd/signals.h"
|
||||||
#include "ardour/types.h"
|
#include "ardour/types.h"
|
||||||
|
|
||||||
|
namespace ARDOUR {
|
||||||
|
class Playlist;
|
||||||
|
}
|
||||||
|
|
||||||
class RegionView;
|
class RegionView;
|
||||||
class TimeAxisView;
|
class TimeAxisView;
|
||||||
|
|
||||||
|
@ -57,6 +61,8 @@ class RegionSelection : public std::list<RegionView*>
|
||||||
void by_position (std::list<RegionView*>&) const;
|
void by_position (std::list<RegionView*>&) const;
|
||||||
void by_track (std::list<RegionView*>&) const;
|
void by_track (std::list<RegionView*>&) const;
|
||||||
|
|
||||||
|
std::set<boost::shared_ptr<ARDOUR::Playlist> > playlists () const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void remove_it (RegionView*);
|
void remove_it (RegionView*);
|
||||||
|
|
||||||
|
|
|
@ -646,10 +646,14 @@ Playlist::flush_notifications (bool from_undo)
|
||||||
RegionsExtended (pending_region_extensions);
|
RegionsExtended (pending_region_extensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!regions_to_relayer.empty ()) {
|
if (!regions_to_relayer.empty () && !from_undo) {
|
||||||
relayer (regions_to_relayer);
|
relayer (regions_to_relayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pending_layering) {
|
||||||
|
LayeringChanged (); /* EMIT SIGNAL */
|
||||||
|
}
|
||||||
|
|
||||||
clear_pending ();
|
clear_pending ();
|
||||||
|
|
||||||
in_flush = false;
|
in_flush = false;
|
||||||
|
@ -1571,6 +1575,10 @@ Playlist::flush_notifications (bool from_undo)
|
||||||
notify_region_start_trimmed (region);
|
notify_region_start_trimmed (region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (what_changed.contains (Properties::layer)) {
|
||||||
|
notify_layering_changed ();
|
||||||
|
}
|
||||||
|
|
||||||
if (what_changed.contains (our_interests)) {
|
if (what_changed.contains (our_interests)) {
|
||||||
save = true;
|
save = true;
|
||||||
}
|
}
|
||||||
|
@ -2536,8 +2544,6 @@ Playlist::commit_temporary_layers (TemporaryLayers const & temporary_layers)
|
||||||
|
|
||||||
DEBUG_TRACE (DEBUG::Layering, string_compose ("\t%1 temporary %2 committed %3\n", (*i)->name(), temporary_layers.get (*i), (*i)->layer()));
|
DEBUG_TRACE (DEBUG::Layering, string_compose ("\t%1 temporary %2 committed %3\n", (*i)->name(), temporary_layers.get (*i), (*i)->layer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
notify_layering_changed ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Relayer a list of regions.
|
/** Relayer a list of regions.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user