diff --git a/app/core.cpp b/app/core.cpp index 07684d63c..72d84f5f5 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -824,7 +824,8 @@ void Core::SaveProjectInternal(Project* project, const QString& override_filenam return; #endif } else { - psm = new ProjectSaveTask(project); + bool use_compression = !project->filename().endsWith(QStringLiteral(".ovexml"), Qt::CaseInsensitive); + psm = new ProjectSaveTask(project, use_compression); if (!override_filename.isEmpty()) { // Set override filename if provided @@ -1170,24 +1171,35 @@ bool Core::CloseAllExceptActiveProject() QString Core::GetProjectFilter(bool include_any_filter) { - QString filters; + static const QVector< QPair > FILTERS = { + // Standard compressed Olive project + {tr("Olive Project"), QStringLiteral("ove")}, + // Uncompressed XML Olive project + {tr("Olive Project (Uncompressed XML)"), QStringLiteral("ovexml")}, + + // OpenTimelineIO project, if available #ifdef USE_OTIO + {tr("OpenTimelineIO"), QStringLiteral("otio")} +#endif + }; + + QStringList filters; + filters.reserve(FILTERS.size() + 1); + if (include_any_filter) { - filters.append(QStringLiteral("All Supported Projects (*.ove *.otio);;")); + QStringList combined; + for (auto it=FILTERS.cbegin(); it!=FILTERS.cend(); it++) { + combined.append(QStringLiteral("*.%1").arg(it->second)); + } + filters.append(QStringLiteral("%1 (%2)").arg(tr("All Supported Projects"), combined.join(' '))); } -#else - Q_UNUSED(include_any_filter) -#endif - // Append standard filter - filters.append(QStringLiteral("%1 (*.ove)").arg(tr("Olive Project"))); + for (auto it=FILTERS.cbegin(); it!=FILTERS.cend(); it++) { + filters.append(QStringLiteral("%1 (*.%2)").arg(it->first, it->second)); + } -#ifdef USE_OTIO - filters.append(QStringLiteral(";;%2 (*.otio)").arg(tr("OpenTimelineIO"))); -#endif - - return filters; + return filters.join(QStringLiteral(";;")); } QString Core::GetRecentProjectsFilePath() diff --git a/app/node/project/serializer/serializer.cpp b/app/node/project/serializer/serializer.cpp index f5b9d23f7..aa4de715b 100644 --- a/app/node/project/serializer/serializer.cpp +++ b/app/node/project/serializer/serializer.cpp @@ -159,7 +159,7 @@ ProjectSerializer::Result ProjectSerializer::Paste(const QString &type) return res; } -ProjectSerializer::Result ProjectSerializer::Save(const SaveData &data, const QString &type) +ProjectSerializer::Result ProjectSerializer::Save(const SaveData &data, const QString &type, bool compress) { QString temp_save = FileFunctions::GetSafeTemporaryFilename(data.GetFilename()); @@ -176,8 +176,12 @@ ProjectSerializer::Result ProjectSerializer::Save(const SaveData &data, const QS return r; } - project_file.write("OVEC"); - project_file.write(qCompress(b)); + if (compress) { + project_file.write("OVEC"); + project_file.write(qCompress(b)); + } else { + project_file.write(b); + } project_file.close(); diff --git a/app/node/project/serializer/serializer.h b/app/node/project/serializer/serializer.h index 831c98d44..3847ba062 100644 --- a/app/node/project/serializer/serializer.h +++ b/app/node/project/serializer/serializer.h @@ -160,7 +160,7 @@ public: static Result Load(Project *project, QXmlStreamReader *read_device, const QString &type); static Result Paste(const QString &type); - static Result Save(const SaveData &data, const QString &type); + static Result Save(const SaveData &data, const QString &type, bool compress); static Result Save(QXmlStreamWriter *write_device, const SaveData &data, const QString &type); static Result Copy(const SaveData &data, const QString &type); diff --git a/app/task/project/save/save.cpp b/app/task/project/save/save.cpp index 10446e8f1..0283c02f7 100644 --- a/app/task/project/save/save.cpp +++ b/app/task/project/save/save.cpp @@ -30,8 +30,9 @@ namespace olive { -ProjectSaveTask::ProjectSaveTask(Project *project) : - project_(project) +ProjectSaveTask::ProjectSaveTask(Project *project, bool use_compression) : + project_(project), + use_compression_(use_compression) { SetTitle(tr("Saving '%1'").arg(project->filename())); } @@ -42,7 +43,7 @@ bool ProjectSaveTask::Run() ProjectSerializer::SaveData data(project_, using_filename); - ProjectSerializer::Result result = ProjectSerializer::Save(data, QStringLiteral("project")); + ProjectSerializer::Result result = ProjectSerializer::Save(data, QStringLiteral("project"), use_compression_); bool success = false; diff --git a/app/task/project/save/save.h b/app/task/project/save/save.h index 6157b2d67..642d00e7f 100644 --- a/app/task/project/save/save.h +++ b/app/task/project/save/save.h @@ -30,7 +30,7 @@ class ProjectSaveTask : public Task { Q_OBJECT public: - ProjectSaveTask(Project* project); + ProjectSaveTask(Project* project, bool use_compression); Project* GetProject() const { @@ -50,6 +50,8 @@ private: QString override_filename_; + bool use_compression_; + }; }