From b091ed8592803428b2ebf40eef1f86910662f510 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 28 Feb 2023 17:01:46 -0800 Subject: [PATCH] project: remove constant root node --- app/core.cpp | 4 +- app/node/project.cpp | 45 ++++++++++--------- app/node/project.h | 15 ++----- .../project/serializer/serializer210528.cpp | 1 + .../project/serializer/serializer210907.cpp | 1 + .../project/serializer/serializer211228.cpp | 1 + .../project/serializer/serializer220403.cpp | 1 + app/task/project/loadotio/loadotio.cpp | 1 + 8 files changed, 36 insertions(+), 33 deletions(-) diff --git a/app/core.cpp b/app/core.cpp index 72a5a7894..f956d5ce1 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -293,7 +293,9 @@ void Core::CreateNewProject() { // If we already have an empty/new project, switch to it if (CloseProject(false)) { - AddOpenProject(new Project()); + Project *p = new Project(); + p->Initialize(); + AddOpenProject(p); } } diff --git a/app/node/project.cpp b/app/node/project.cpp index 7e948e5fc..9e24aacd0 100644 --- a/app/node/project.cpp +++ b/app/node/project.cpp @@ -42,22 +42,19 @@ const QString Project::kCachePathKey = QStringLiteral("customcachepath"); const QString Project::kColorConfigFilename = QStringLiteral("colorconfigfilename"); const QString Project::kDefaultInputColorSpaceKey = QStringLiteral("defaultinputcolorspace"); const QString Project::kColorReferenceSpace = QStringLiteral("colorreferencespace"); +const QString Project::kRootKey = QStringLiteral("root"); const QString Project::kItemMimeType = QStringLiteral("application/x-oliveprojectitemdata"); Project::Project() : + root_(nullptr), is_modified_(false), autorecovery_saved_(true) { // Generate UUID for this project RegenerateUuid(); - // Folder root for project - root_ = new Folder(); - root_->setParent(this); - root_->SetLabel(tr("Root")); - AddDefaultNode(root_); - + // Initialize color manager color_manager_ = new ColorManager(this); color_manager_->Init(); } @@ -67,6 +64,16 @@ Project::~Project() Clear(); } +void Project::Initialize() +{ + if (!root_) { + root_ = new Folder(); + root_->setParent(this); + root_->SetLabel(tr("Root")); + settings_.insert(kRootKey, QString::number(reinterpret_cast(root_))); + } +} + void Project::Clear() { // By deleting the last nodes first, we assume that nodes that are most important are deleted last @@ -93,15 +100,12 @@ SerializedData Project::Load(QXmlStreamReader *reader) while (XMLReadNextStartElement(reader)) { if (reader->name() == QStringLiteral("node")) { - bool is_root = false; QString id; { XMLAttributeLoop(reader, attr) { if (attr.name() == QStringLiteral("id")) { id = attr.value().toString(); - } else if (attr.name() == QStringLiteral("root") && attr.value() == QStringLiteral("1")) { - is_root = true; } } } @@ -110,13 +114,7 @@ SerializedData Project::Load(QXmlStreamReader *reader) qWarning() << "Failed to load node with empty ID"; reader->skipCurrentElement(); } else { - Node* node; - - if (is_root) { - node = this->root(); - } else { - node = NodeFactory::CreateFromID(id); - } + Node* node = NodeFactory::CreateFromID(id); if (!node) { qWarning() << "Failed to find node with ID" << id; @@ -149,6 +147,17 @@ SerializedData Project::Load(QXmlStreamReader *reader) } } + // Resolve root if applicable + QString root = GetSetting(kRootKey); + if (!root.isEmpty()) { + quintptr r = root.toULongLong(); + if (Node *n = data.node_ptrs.value(r)) { + Q_ASSERT(!root_); + root_ = dynamic_cast(n); + SetSetting(kRootKey, QString::number(reinterpret_cast(root_))); + } + } + return data; } @@ -164,10 +173,6 @@ void Project::Save(QXmlStreamWriter *writer) const foreach (Node* node, this->nodes()) { writer->writeStartElement(QStringLiteral("node")); - if (node == this->root()) { - writer->writeAttribute(QStringLiteral("root"), QStringLiteral("1")); - } - node->Save(writer); writer->writeEndElement(); // node diff --git a/app/node/project.h b/app/node/project.h index 2e562943d..c2ef72f1f 100644 --- a/app/node/project.h +++ b/app/node/project.h @@ -70,10 +70,7 @@ public: return node_children_; } - const QVector& default_nodes() const - { - return default_nodes_; - } + void Initialize(); SerializedData Load(QXmlStreamReader *reader); void Save(QXmlStreamWriter *writer) const; @@ -86,7 +83,7 @@ public: QString pretty_filename() const; void set_filename(const QString& s); - Folder* root() const { return root_; } + Folder *root() const { return root_; } ColorManager *color_manager() const { return color_manager_; } bool is_modified() const { return is_modified_; } @@ -144,6 +141,7 @@ public: static const QString kColorConfigFilename; static const QString kColorReferenceSpace; static const QString kDefaultInputColorSpaceKey; + static const QString kRootKey; QString GetSetting(const QString &key) const { return settings_.value(key); } void SetSetting(const QString &key, const QString &value); @@ -195,11 +193,6 @@ signals: void SettingChanged(const QString &key, const QString &value); protected: - void AddDefaultNode(Node* n) - { - default_nodes_.append(n); - } - virtual void childEvent(QChildEvent* event) override; private: @@ -219,8 +212,6 @@ private: QVector node_children_; - QVector default_nodes_; - QMap settings_; }; diff --git a/app/node/project/serializer/serializer210528.cpp b/app/node/project/serializer/serializer210528.cpp index 03d155f44..a4a385450 100644 --- a/app/node/project/serializer/serializer210528.cpp +++ b/app/node/project/serializer/serializer210528.cpp @@ -66,6 +66,7 @@ ProjectSerializer210528::LoadData ProjectSerializer210528::Load(Project *project bool handled_elsewhere = false; if (is_root) { + project->Initialize(); node = project->root(); } else if (is_cm) { LoadColorManager(reader, project); diff --git a/app/node/project/serializer/serializer210907.cpp b/app/node/project/serializer/serializer210907.cpp index 776007b29..197f97b76 100644 --- a/app/node/project/serializer/serializer210907.cpp +++ b/app/node/project/serializer/serializer210907.cpp @@ -66,6 +66,7 @@ ProjectSerializer210907::LoadData ProjectSerializer210907::Load(Project *project bool handled_elsewhere = false; if (is_root) { + project->Initialize(); node = project->root(); } else if (is_cm) { LoadColorManager(reader, project); diff --git a/app/node/project/serializer/serializer211228.cpp b/app/node/project/serializer/serializer211228.cpp index b5de4e896..a9ccf3d0a 100644 --- a/app/node/project/serializer/serializer211228.cpp +++ b/app/node/project/serializer/serializer211228.cpp @@ -68,6 +68,7 @@ ProjectSerializer211228::LoadData ProjectSerializer211228::Load(Project *project bool handled_elsewhere = false; if (is_root) { + project->Initialize(); node = project->root(); } else if (is_cm) { LoadColorManager(reader, project); diff --git a/app/node/project/serializer/serializer220403.cpp b/app/node/project/serializer/serializer220403.cpp index db71168ed..32698bb09 100644 --- a/app/node/project/serializer/serializer220403.cpp +++ b/app/node/project/serializer/serializer220403.cpp @@ -87,6 +87,7 @@ ProjectSerializer220403::LoadData ProjectSerializer220403::Load(Project *project bool handled_elsewhere = false; if (is_root) { + project->Initialize(); node = project->root(); } else if (is_cm) { LoadColorManager(reader, project); diff --git a/app/task/project/loadotio/loadotio.cpp b/app/task/project/loadotio/loadotio.cpp index eeabdc092..6904575c0 100644 --- a/app/task/project/loadotio/loadotio.cpp +++ b/app/task/project/loadotio/loadotio.cpp @@ -67,6 +67,7 @@ bool LoadOTIOTask::Run() } project_ = new Project(); + project_->Initialize(); project_->set_modified(true); std::vector timelines;