11namespace tracktion {
inline namespace engine
17 state.addListener (
this);
20MarkerManager::~MarkerManager()
22 state.removeListener (
this);
30 if (
auto mt = edit.getMarkerTrack())
31 for (
auto clip : mt->getClips())
32 if (auto mc = dynamic_cast<MarkerClip*> (clip))
35 TrackItem::sortByTime (results);
39int MarkerManager::getNextUniqueID (
int start)
43 for (
auto m : getMarkers())
44 uniqueIDs.add (m->getMarkerID());
52void MarkerManager::checkForDuplicates (MarkerClip& clip,
bool changeOthers)
54 for (
auto m : getMarkers())
56 if (&clip != m && clip.getMarkerID() == m->getMarkerID())
59 m->setMarkerID (getNextUniqueID (clip.getMarkerID()));
61 clip.setMarkerID (getNextUniqueID (clip.getMarkerID()));
66MarkerClip* MarkerManager::getMarkerByID (
int id)
68 for (
auto m : getMarkers())
69 if (m->getMarkerID() == id)
75MarkerClip* MarkerManager::getNextMarker (TimePosition nowTime)
77 MarkerClip*
next =
nullptr;
79 for (
auto m : getMarkers())
81 auto diff = m->getPosition().getStart() - nowTime;
82 auto nextDiff =
next ?
next->getPosition().getStart() - nowTime : TimeDuration();
84 if (diff > TimeDuration::fromSeconds (0.001) && ((next ==
nullptr) || (diff < nextDiff)))
91MarkerClip* MarkerManager::getPrevMarker (TimePosition nowTime)
93 MarkerClip*
prev =
nullptr;
95 for (
auto m : getMarkers())
97 auto diff = m->getPosition().getStart() - nowTime;
98 auto prevDiff =
prev ?
prev->getPosition().getStart() - nowTime : TimeDuration();
100 if (diff < TimeDuration::fromSeconds (-0.001) && ((prev ==
nullptr) || (diff > prevDiff)))
107MarkerClip::Ptr MarkerManager::createMarker (
int number, TimePosition pos, TimeDuration length,
108 Clip::SyncType type, SelectionManager* sm)
110 if (length == TimeDuration())
112 auto& tempo = edit.tempoSequence.getTempoAt (pos);
113 length = TimeDuration::fromSeconds (tempo.getMatchingTimeSig().numerator.get() * tempo.getApproxBeatLength().inSeconds());
116 if (
auto track = edit.getMarkerTrack())
118 if (
auto clip =
dynamic_cast<MarkerClip*
> (track->insertNewClip (TrackItem::Type::marker,
119 { pos, pos + length }, sm)))
121 clip->setSyncType (type);
122 clip->setStart (pos,
true,
true);
124 if (length > TimeDuration())
125 clip->setLength (length,
true);
128 clip->setMarkerID (number);
138Clip::SyncType MarkerManager::getNewMarkerMode()
const
140 const int newMarkerMode = edit.engine.getPropertyStorage().getProperty (SettingID::newMarker);
142 if (newMarkerMode == 0 || (newMarkerMode == 2 && edit.getTimecodeFormat().isBarsBeats()))
143 return Clip::syncBarsBeats;
145 return Clip::syncAbsolute;
150 return createMarker (number, pos, length, getNewMarkerMode(), sm);
155 if (v.hasType (IDs::MARKERTRACK) || v.getParent().hasType (IDs::MARKERTRACK))
162void MarkerManager::valueTreeParentChanged (
juce::ValueTree& v) { valueTreeChanged (v); }
bool contains(const ElementType &elementToLookFor) const noexcept
Manages a list of items that are currently selected.
Represents a duration in real-life time.
Represents a position in real-life time.
#define CRASH_TRACER
This macro adds the current location to a stack which gets logged if a crash happens.