diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index d484709ef6..4687f0b55c 100644 --- a/libs/ardour/ardour/source.h +++ b/libs/ardour/ardour/source.h @@ -113,10 +113,10 @@ public: void set_captured_xruns (XrunPositions const& xruns) { _xruns = xruns; } CueMarkers const & cue_markers() const { return _cue_markers; } - void add_cue_marker (CueMarker const &); - void move_cue_marker (CueMarker const &, samplepos_t source_relative_position); + bool add_cue_marker (CueMarker const &); + bool move_cue_marker (CueMarker const &, samplepos_t source_relative_position); bool remove_cue_marker (CueMarker const &); - void rename_cue_marker (CueMarker&, std::string const &); + bool rename_cue_marker (CueMarker&, std::string const &); bool clear_cue_markers (); PBD::Signal0 CueMarkersChanged; diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index f4518a379f..ce52c20a14 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -215,6 +215,8 @@ Source::set_state (const XMLNode& node, int version) } else if ((*niter)->name() == X_("Cues")) { + CueMarkers old (_cue_markers); + _cue_markers.clear (); const XMLNode& cues (*(*niter)); @@ -230,6 +232,9 @@ Source::set_state (const XMLNode& node, int version) _cue_markers.insert (CueMarker (text, position)); } + + cues_changed = (old == _cue_markers); + cerr << "reset state, cues changed " << cues_changed << endl; } } @@ -257,6 +262,16 @@ Source::set_state (const XMLNode& node, int version) _flags = Flag (_flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy|CanRename)); } + /* support to make undo/redo actually function. Very few things about + * Sources are ever part of undo/redo history, but this can + * be. Undo/Redo uses a MementoCommand<> pattern, which will not in + * itself notify anyone when the operation changes the cue markers. + */ + + if (cues_changed) { + CueMarkersChanged (); /* EMIT SIGNAL */ + } + return 0; } @@ -413,34 +428,42 @@ Source::writable () const return (_flags & Writable) && _session.writable(); } -void +bool Source::add_cue_marker (CueMarker const & cm) { - _cue_markers.insert (cm); - CueMarkersChanged(); /* EMIT SIGNAL */ + if (_cue_markers.insert (cm).second) { + CueMarkersChanged(); /* EMIT SIGNAL */ + return true; + } + + return false; } -void +bool Source::move_cue_marker (CueMarker const & cm, samplepos_t source_relative_position) { if (source_relative_position > length (0)) { - return; + return false; } if (remove_cue_marker (cm)) { - add_cue_marker (CueMarker (cm.text(), source_relative_position)); + return add_cue_marker (CueMarker (cm.text(), source_relative_position)); } + + return false; } -void +bool Source::rename_cue_marker (CueMarker& cm, std::string const & str) { CueMarkers::iterator m = _cue_markers.find (cm); if (m != _cue_markers.end()) { _cue_markers.erase (m); - add_cue_marker (CueMarker (str, cm.position())); + return add_cue_marker (CueMarker (str, cm.position())); } + + return false; } bool