11namespace tracktion {
inline namespace engine
14EditItem::EditItem (EditItemID
id, Edit& ed)
15 : edit (ed), itemID (id)
20EditItemID EditItemID::fromVar (
const juce::var& v)
22 return fromRawID ((uint64_t)
static_cast<juce::int64> (v));
32 return EditItemID::fromVar (v.getProperty (IDs::id));
37 v.setProperty (IDs::id, *
this, um);
40EditItemID EditItemID::fromRawID (uint64_t raw)
53 auto i =
id.getRawID();
66 jassert (isSorted (existingIDs));
68 for (
auto existing : existingIDs)
70 auto i = existing.getRawID();
78 return fromRawID (rawID);
83 return fromVar (v.getProperty (prop));
86EditItemID EditItemID::fromXML (
const juce::XmlElement& xml,
const char* attributeName)
98 v.setProperty (prop, toVar(), um);
106void EditItemID::setXML (
juce::XmlElement& xml,
const char* attributeName)
const
118 return toVar().toString();
121EditItemID EditItemID::readOrCreateNewID (Edit& edit,
const juce::ValueTree& v)
128 i = edit.createNewItemID();
130 i.writeID (localTree,
nullptr);
140 for (
auto& s : items)
141 trackIDs.add (fromVar (s));
151 if (items.
size() == 1)
157 for (
auto& i : items)
158 ids.add (i.toString());
168 return att == IDs::id || att == IDs::groupID;
173 for (
auto p : { IDs::currentAutoParamPluginID, IDs::currentAutoParamTag,
174 IDs::targetID, IDs::sourceTrack, IDs::src, IDs::dst,
175 IDs::pluginID, IDs::rackType, IDs::paramID })
179 if (att == IDs::source && ! Clip::isClipState (parentType))
182 if (att == IDs::track && parentType == IDs::COMPSECTION)
190 return isIDDeclaration (att) || isIDReference (xml.
getTagName(), att);
195 return isIDDeclaration (att) || isIDReference (v.getType(), att);
200 return att == IDs::hiddenClips || att == IDs::lockedClips
201 || att == IDs::ghostTracks || att == IDs::renderTracks;
204 template <
typename Visitor>
205 static void visitAllIDDecls (
const juce::XmlElement& xml, Visitor&& visitor)
212 visitAllIDDecls (*e, visitor);
215 template <
typename Visitor>
216 static void visitAllIDDecls (
const juce::ValueTree& v, Visitor&& visitor)
218 for (
int i = 0; i < v.getNumProperties(); ++i)
220 auto propName = v.getPropertyName (i);
222 if (isIDDeclaration (propName))
223 visitor (v.getProperty (propName));
226 for (
const auto& child : v)
227 visitAllIDDecls (child, visitor);
238 if (oldID.isNotEmpty())
240 auto newID = newIDsToApply.
find (oldID);
242 if (newID != newIDsToApply.
end())
243 newItemIDs.
add (newID->second);
247 return EditItemID::listToString (newItemIDs);
256 if (isIDRefOrDecl (xml, attName))
260 if (oldID.isNotEmpty())
262 auto newID = newIDsToApply.
find (oldID);
264 if (newID != newIDsToApply.
end())
268 else if (isIDList (attName))
273 if (EditItemID::applyNewIDsToExternalXML !=
nullptr)
274 EditItemID::applyNewIDsToExternalXML (xml, attName, newIDsToApply);
278 applyNewIDs (*e, newIDsToApply);
283 for (
int i = 0; i < v.getNumProperties(); ++i)
285 auto propName = v.getPropertyName (i);
287 if (isIDRefOrDecl (v, propName))
289 auto oldID = v.getProperty (propName).
toString();
291 if (oldID.isNotEmpty())
293 auto newID = newIDsToApply.
find (oldID);
295 if (newID != newIDsToApply.
end())
297 v.setProperty (propName, newID->second, um);
301 DBG (
"Dangling ID found: " << oldID);
305 else if (isIDList (propName))
307 v.setProperty (propName, remapIDList (v.getProperty (propName), newIDsToApply), um);
310 if (EditItemID::applyNewIDsToExternalValueTree)
311 EditItemID::applyNewIDsToExternalValueTree (v, propName, newIDsToApply, um);
315 applyNewIDs (child, newIDsToApply, um);
320 if (result !=
nullptr)
322 for (
auto& i : newIDs)
324 auto itemID = EditItemID::fromString (i.first);
326 if (itemID.isValid())
327 (*result)[itemID] = i.second;
341 IDRemapping::visitAllIDDecls (xml, [&] (
const juce::String& oldID)
343 auto i = EditItemID::fromString (oldID);
356 IDRemapping::visitAllIDDecls (v, [&] (
const juce::var& oldID)
358 auto i = EditItemID::fromVar (oldID);
369 IDRemapping::StringToIDMap newIDs;
371 IDRemapping::visitAllIDDecls (xml, [&] (
const juce::String& oldID)
375 auto& remapped = newIDs[oldID];
377 if (remapped.isInvalid())
379 remapped = createNewID();
385 IDRemapping::applyNewIDs (xml, newIDs);
386 IDRemapping::addItemsToReturnedMap (newIDs, remappedIDs);
392 IDRemapping::StringToIDMap newIDs;
394 IDRemapping::visitAllIDDecls (v, [&] (
const juce::var& oldID)
396 auto oldIDString = oldID.toString();
398 if (oldIDString.isNotEmpty())
400 auto& remapped = newIDs[oldIDString];
402 if (remapped.isInvalid() && remappedIDs != nullptr && remappedIDs->contains (EditItemID::fromString (oldIDString)))
404 remapped = remappedIDs->at (EditItemID::fromString (oldIDString));
408 if (remapped.isInvalid())
410 remapped = createNewID();
416 IDRemapping::applyNewIDs (v, newIDs, um);
417 IDRemapping::addItemsToReturnedMap (newIDs, remappedIDs);
424 if (remappedIDs !=
nullptr)
426 alreadyUsed.reserve (alreadyUsed.size() + remappedIDs->
size());
428 for (
auto& i : *remappedIDs)
429 alreadyUsed.push_back (i.second);
435 auto newID = edit.createNewItemID (alreadyUsed);
436 alreadyUsed.push_back (newID);
447 remapIDs (xml, idCreator, remappedIDs);
453 remapIDs (v, um, idCreator, remappedIDs);
bool isEmpty() const noexcept
void ensureStorageAllocated(int minNumElements)
int size() const noexcept
ElementType getFirst() const noexcept
void add(const ElementType &newElement)
const String & toString() const noexcept
String joinIntoString(StringRef separatorString, int startIndex=0, int numberOfElements=-1) const
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
void ensureStorageAllocated(int minNumElements)
int64 getLargeIntValue() const noexcept
bool isNotEmpty() const noexcept
const String & getAttributeValue(int attributeIndex) const noexcept
const String & getAttributeName(int attributeIndex) const noexcept
Iterator< GetNextElement > getChildIterator() const
const String & getTagName() const noexcept
int getNumAttributes() const noexcept
const String & getStringAttribute(StringRef attributeName) const noexcept
void setAttribute(const Identifier &attributeName, const String &newValue)
The Tracktion Edit class!
ID for objects of type EditElement - e.g.