X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplaylist.cc;h=649d549b8658d9ec13a7f31949ecfc09a47396f1;hb=8f59346592b8232e910ce0bbdc247cf8cecde4dd;hp=5cf062744805add24434e98ea1421ec7f7acc223;hpb=b6b68881b2c59c216d2195b1cea5e667187d83ed;p=ardour.git diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 5cf0627448..649d549b86 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -25,6 +25,8 @@ #include #include +#include + #include "pbd/failed_constructor.h" #include "pbd/stateful_diff_command.h" #include "pbd/xml++.h" @@ -129,16 +131,18 @@ RegionListProperty::copy_for_history () const } void -RegionListProperty::diff (PropertyList& before, PropertyList& after) const +RegionListProperty::diff (PropertyList& undo, PropertyList& redo) const { - if (_have_old) { + if (changed()) { + /* list of the removed/added regions since clear_history() was last called */ RegionListProperty* a = copy_for_history (); - RegionListProperty* b = copy_for_history (); + /* the same list, but with removed/added lists swapped (for undo purposes) */ + RegionListProperty* b = copy_for_history (); b->invert_changes (); - before.add (b); - after.add (a); + undo.add (b); + redo.add (a); } } @@ -150,6 +154,7 @@ Playlist::Playlist (Session& sess, string nom, DataType type, bool hide) init (hide); first_set_state = false; _name = nom; + _set_sort_id (); } @@ -164,6 +169,7 @@ Playlist::Playlist (Session& sess, const XMLNode& node, DataType type, bool hide init (hide); _name = "unnamed"; /* reset by set_state */ + _set_sort_id (); /* set state called by derived class */ } @@ -172,7 +178,7 @@ Playlist::Playlist (boost::shared_ptr other, string namestr, boo : SessionObject(other->_session, namestr) , regions (*this) , _type(other->_type) - , _orig_diskstream_id(other->_orig_diskstream_id) + , _orig_diskstream_id (other->_orig_diskstream_id) { init (hide); @@ -207,7 +213,7 @@ Playlist::Playlist (boost::shared_ptr other, framepos_t start, f : SessionObject(other->_session, str) , regions (*this) , _type(other->_type) - , _orig_diskstream_id(other->_orig_diskstream_id) + , _orig_diskstream_id (other->_orig_diskstream_id) { RegionLock rlock2 (const_cast (other.get())); @@ -260,7 +266,7 @@ Playlist::Playlist (boost::shared_ptr other, framepos_t start, f break; } - _session.region_name (new_name, region->name(), false); + RegionFactory::region_name (new_name, region->name(), false); PropertyList plist; @@ -359,6 +365,32 @@ Playlist::~Playlist () /* GoingAway must be emitted by derived classes */ } +void +Playlist::_set_sort_id () +{ + /* + Playlists are given names like . + or .. where id + is an integer. We extract the id and sort by that. + */ + + size_t dot_position = _name.val().find_last_of("."); + + if (dot_position == string::npos) { + _sort_id = 0; + } else { + string t = _name.val().substr(dot_position + 1); + + try { + _sort_id = boost::lexical_cast(t); + } + + catch (boost::bad_lexical_cast e) { + _sort_id = 0; + } + } +} + bool Playlist::set_name (const string& str) { @@ -370,9 +402,13 @@ Playlist::set_name (const string& str) if (_refcnt > 2) { return false; - } else { - return SessionObject::set_name(str); - } + } + + bool ret = SessionObject::set_name(str); + if (ret) { + _set_sort_id (); + } + return ret; } /*********************************************************************** @@ -659,7 +695,7 @@ Playlist::add_region (boost::shared_ptr region, framepos_t position, flo if (floor (times) != times) { length = (framecnt_t) floor (region->length() * (times - floor (times))); string name; - _session.region_name (name, region->name(), false); + RegionFactory::region_name (name, region->name(), false); { PropertyList plist; @@ -929,7 +965,7 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re if (!cutting) { /* "middle" ++++++ */ - _session.region_name (new_name, current->name(), false); + RegionFactory::region_name (new_name, current->name(), false); PropertyList plist; @@ -948,7 +984,7 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re /* "end" ====== */ - _session.region_name (new_name, current->name(), false); + RegionFactory::region_name (new_name, current->name(), false); PropertyList plist; @@ -968,7 +1004,7 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re current->suspend_property_changes (); thawlist.push_back (current); - current->trim_end (pos2, this); + current->cut_end (pos2 - 1, this); } else if (overlap == OverlapEnd) { @@ -986,7 +1022,7 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re /* end +++++ */ - _session.region_name (new_name, current->name(), false); + RegionFactory::region_name (new_name, current->name(), false); PropertyList plist; @@ -1007,7 +1043,7 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re current->suspend_property_changes (); thawlist.push_back (current); - current->trim_end (pos2, this); + current->cut_end (pos2 - 1, this); } else if (overlap == OverlapStart) { @@ -1029,7 +1065,7 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re if (!cutting) { /* front **** */ - _session.region_name (new_name, current->name(), false); + RegionFactory::region_name (new_name, current->name(), false); PropertyList plist; @@ -1233,7 +1269,7 @@ Playlist::duplicate (boost::shared_ptr region, framepos_t position, floa if (floor (times) != times) { framecnt_t length = (framecnt_t) floor (region->length() * (times - floor (times))); string name; - _session.region_name (name, region->name(), false); + RegionFactory::region_name (name, region->name(), false); { PropertyList plist; @@ -1334,7 +1370,7 @@ Playlist::_split_region (boost::shared_ptr region, framepos_t playlist_p before = playlist_position - region->position(); after = region->length() - before; - _session.region_name (before_name, region->name(), false); + RegionFactory::region_name (before_name, region->name(), false); { PropertyList plist; @@ -1347,7 +1383,7 @@ Playlist::_split_region (boost::shared_ptr region, framepos_t playlist_p left = RegionFactory::create (region, plist); } - _session.region_name (after_name, region->name(), false); + RegionFactory::region_name (after_name, region->name(), false); { PropertyList plist; @@ -2121,6 +2157,7 @@ Playlist::set_state (const XMLNode& node, int version) if (prop->name() == X_("name")) { _name = prop->value(); + _set_sort_id (); } else if (prop->name() == X_("id")) { _id = prop->value(); } else if (prop->name() == X_("orig_diskstream_id")) { @@ -2304,7 +2341,7 @@ Playlist::set_edit_mode (EditMode mode) void Playlist::relayer () { - /* never compute layers when changing state for undo/redo or setting from XML*/ + /* never compute layers when changing state for undo/redo or setting from XML */ if (in_update || in_set_state) { return; @@ -2453,22 +2490,48 @@ void Playlist::raise_region_to_top (boost::shared_ptr region) { /* does nothing useful if layering mode is later=higher */ - if ((_session.config.get_layer_model() == MoveAddHigher) || - (_session.config.get_layer_model() == AddHigher)) { - timestamp_layer_op (region); - relayer (); + switch (_session.config.get_layer_model()) { + case LaterHigher: + return; + default: + break; } + + layer_t top = regions.size() - 1; + + if (region->layer() >= top) { + /* already on the top */ + return; + } + + move_region_to_layer (top, region, 1); + /* mark the region's last_layer_op as now, so that it remains on top when + doing future relayers (until something else takes over) + */ + timestamp_layer_op (region); } void Playlist::lower_region_to_bottom (boost::shared_ptr region) { /* does nothing useful if layering mode is later=higher */ - if ((_session.config.get_layer_model() == MoveAddHigher) || - (_session.config.get_layer_model() == AddHigher)) { - region->set_last_layer_op (0); - relayer (); + switch (_session.config.get_layer_model()) { + case LaterHigher: + return; + default: + break; } + + if (region->layer() == 0) { + /* already on the bottom */ + return; + } + + move_region_to_layer (0, region, -1); + /* force region's last layer op to zero so that it stays at the bottom + when doing future relayers + */ + region->set_last_layer_op (0); } int @@ -2651,8 +2714,6 @@ Playlist::set_frozen (bool yn) void Playlist::timestamp_layer_op (boost::shared_ptr region) { -// struct timeval tv; -// gettimeofday (&tv, 0); region->set_last_layer_op (++layer_op_counter); }