13
0

extend/adjust Location API to handle cue markers

This commit is contained in:
Paul Davis 2022-01-05 10:24:39 -07:00
parent 93b30976e5
commit acdc1cd707
2 changed files with 26 additions and 11 deletions

View File

@ -66,7 +66,7 @@ public:
};
Location (Session &);
Location (Session &, Temporal::timepos_t const &, Temporal::timepos_t const &, const std::string &, Flags bits = Flags(0));
Location (Session &, Temporal::timepos_t const &, Temporal::timepos_t const &, const std::string &, Flags bits = Flags(0), int32_t cue_id = 0);
Location (const Location& other);
Location (Session &, const XMLNode&);
Location* operator= (const Location& other);
@ -124,6 +124,9 @@ public:
boost::shared_ptr<SceneChange> scene_change() const { return _scene_change; }
void set_scene_change (boost::shared_ptr<SceneChange>);
int32_t cue_id() const { assert (is_cue_marker()); return _cue; }
void set_cue_id (int32_t);
/* these are static signals for objects that want to listen to all
* locations at once.
*/
@ -173,6 +176,7 @@ private:
bool _locked;
boost::shared_ptr<SceneChange> _scene_change;
int64_t _timestamp;
int32_t _cue;
void set_mark (bool yn);
bool set_flag_internal (bool yn, Flags flag);

View File

@ -69,11 +69,12 @@ Location::Location (Session& s)
, _flags (Flags (0))
, _locked (false)
, _timestamp (time (0))
, _cue (0)
{
}
/** Construct a new Location, giving it the position lock style determined by glue-new-markers-to-bars-and-beats */
Location::Location (Session& s, timepos_t const & start, timepos_t const & end, const std::string &name, Flags bits)
Location::Location (Session& s, timepos_t const & start, timepos_t const & end, const std::string &name, Flags bits, int32_t cue_id)
: SessionHandleRef (s)
, _name (name)
, _start (start)
@ -81,6 +82,7 @@ Location::Location (Session& s, timepos_t const & start, timepos_t const & end,
, _flags (bits)
, _locked (false)
, _timestamp (time (0))
, _cue (cue_id)
{
/* it would be nice if the caller could ensure that the start and end
@ -108,6 +110,7 @@ Location::Location (const Location& other)
, _end (other._end)
, _flags (other._flags)
, _timestamp (time (0))
, _cue (other._cue)
{
/* copy is not locked even if original was */
@ -219,6 +222,10 @@ Location::set_start (Temporal::timepos_t const & s, bool force)
assert (s.is_zero() || s.is_positive());
if (is_cue_marker()) {
cue_change (this);
}
return 0;
} else if (!force) {
/* range locations must exceed a minimum duration */
@ -241,10 +248,6 @@ Location::set_start (Temporal::timepos_t const & s, bool force)
}
}
if (is_cue_marker()) {
cue_change (this);
}
assert (_start.is_positive() || _start.is_zero());
return 0;
@ -431,11 +434,14 @@ Location::set_cd (bool yn, void*)
}
void
Location::set_cue (bool yn, void*)
Location::set_cue_id (int32_t cue_id)
{
if (set_flag_internal (yn, IsCueMarker)) {
flags_changed (this); /* EMIT SIGNAL */
FlagsChanged ();
if (!is_cue_marker()) {
return;
}
if (_cue != cue_id) {
_cue = cue_id;
cue_change (this);
}
}
@ -534,7 +540,6 @@ Location::set_mark (bool yn)
set_flag_internal (yn, IsMark);
}
XMLNode&
Location::cd_info_node(const string & name, const string & value)
{
@ -565,6 +570,7 @@ Location::get_state ()
node->set_property ("flags", _flags);
node->set_property ("locked", _locked);
node->set_property ("timestamp", _timestamp);
node->set_property ("cue", _cue);
if (_scene_change) {
node->add_child_nocopy (_scene_change->get_state());
}
@ -614,6 +620,7 @@ Location::set_state (const XMLNode& node, int version)
}
node.get_property ("timestamp", _timestamp);
node.get_property ("cue", _cue);
Flags old_flags (_flags);
@ -1074,6 +1081,10 @@ Locations::remove (Location *loc)
removed (loc); /* EMIT SIGNAL */
if (loc->is_cue_marker()) {
Location::cue_change (loc);
}
if (was_current) {
current_changed (0); /* EMIT SIGNAL */
}