From e570abb556a19e4139f8d31a882cc85ddb03c4c6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 23 Jul 2020 20:07:11 +1000 Subject: [PATCH] sequencedialog: split off the preset code for use elsewhere (particularly the export dialog) --- app/codec/encoder.cpp | 4 - app/dialog/sequence/CMakeLists.txt | 1 + app/dialog/sequence/presetmanager.h | 237 ++++++++++++++ app/dialog/sequence/sequence.cpp | 4 +- .../sequence/sequencedialogparametertab.cpp | 14 +- .../sequence/sequencedialogpresettab.cpp | 309 ++++++------------ app/dialog/sequence/sequencedialogpresettab.h | 39 ++- app/dialog/sequence/sequencepreset.h | 130 +++++++- 8 files changed, 495 insertions(+), 243 deletions(-) create mode 100644 app/dialog/sequence/presetmanager.h diff --git a/app/codec/encoder.cpp b/app/codec/encoder.cpp index 388278525..64dee8e6b 100644 --- a/app/codec/encoder.cpp +++ b/app/codec/encoder.cpp @@ -160,8 +160,6 @@ void EncodingParams::SetExportLength(const rational &export_length) void EncodingParams::Save(QXmlStreamWriter *writer) const { - writer->writeStartElement(QStringLiteral("encode")); - writer->writeTextElement(QStringLiteral("filename"), filename_); writer->writeStartElement(QStringLiteral("video")); @@ -211,8 +209,6 @@ void EncodingParams::Save(QXmlStreamWriter *writer) const } writer->writeEndElement(); // audio - - writer->writeEndElement(); // encode } Encoder* Encoder::CreateFromID(const QString &id, const EncodingParams& params) diff --git a/app/dialog/sequence/CMakeLists.txt b/app/dialog/sequence/CMakeLists.txt index 39e521400..d4a05877d 100644 --- a/app/dialog/sequence/CMakeLists.txt +++ b/app/dialog/sequence/CMakeLists.txt @@ -16,6 +16,7 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} + dialog/sequence/presetmanager.h dialog/sequence/sequence.h dialog/sequence/sequence.cpp dialog/sequence/sequencedialogparametertab.h diff --git a/app/dialog/sequence/presetmanager.h b/app/dialog/sequence/presetmanager.h new file mode 100644 index 000000000..6836e724e --- /dev/null +++ b/app/dialog/sequence/presetmanager.h @@ -0,0 +1,237 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef PRESETMANAGER_H +#define PRESETMANAGER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/define.h" +#include "common/filefunctions.h" +#include "common/xmlutils.h" + +OLIVE_NAMESPACE_ENTER + +class Preset +{ +public: + Preset() = default; + + const QString& GetName() const + { + return name_; + } + + void SetName(const QString& s) + { + name_ = s; + } + + virtual void Load(QXmlStreamReader* reader) = 0; + + virtual void Save(QXmlStreamWriter* writer) const = 0; + +private: + QString name_; + +}; + +using PresetPtr = std::shared_ptr; + +template +class PresetManager +{ +public: + PresetManager(QWidget* parent, const QString& preset_name) : + preset_name_(preset_name), + parent_(parent) + { + // Load custom preset data from file + QFile preset_file(GetCustomPresetFilename()); + if (preset_file.open(QFile::ReadOnly)) { + QXmlStreamReader reader(&preset_file); + + while (XMLReadNextStartElement(&reader)) { + if (reader.name() == QStringLiteral("presets")) { + while (XMLReadNextStartElement(&reader)) { + if (reader.name() == QStringLiteral("preset")) { + PresetPtr p = std::make_shared(); + + p->Load(&reader); + + custom_preset_data_.append(p); + } else { + reader.skipCurrentElement(); + } + } + } else { + reader.skipCurrentElement(); + } + } + + preset_file.close(); + } + } + + ~PresetManager() + { + // Save custom presets to disk + QFile preset_file(GetCustomPresetFilename()); + if (preset_file.open(QFile::WriteOnly)) { + QXmlStreamWriter writer(&preset_file); + writer.setAutoFormatting(true); + + writer.writeStartDocument(); + + writer.writeStartElement(QStringLiteral("presets")); + + foreach (PresetPtr p, custom_preset_data_) { + writer.writeStartElement(QStringLiteral("preset")); + + p->Save(&writer); + + writer.writeEndElement(); // preset + } + + writer.writeEndElement(); // presets + + writer.writeEndDocument(); + + preset_file.close(); + } + } + + QString GetPresetName(QString start) const + { + bool ok; + + forever { + start = QInputDialog::getText(parent_, + QCoreApplication::translate("PresetManager", "Save Preset"), + QCoreApplication::translate("PresetManager", "Set preset name:"), + QLineEdit::Normal, + start, + &ok); + + if (!ok) { + // Dialog cancelled - leave function entirely + return QString(); + } + + if (start.isEmpty()) { + // No preset name entered, start loop over + QMessageBox::critical(parent_, + QCoreApplication::translate("PresetManager", "Invalid preset name"), + QCoreApplication::translate("PresetManager", "You must enter a preset name"), + QMessageBox::Ok); + } else { + break; + } + } + + return start; + } + + bool SavePreset(PresetPtr preset) + { + QString preset_name; + int existing_preset; + + forever { + preset_name = GetPresetName(preset_name); + + if (preset_name.isEmpty()) { + // Dialog cancelled - leave function entirely + return false; + } + + existing_preset = -1; + for (int i=0; iGetName() == preset_name) { + existing_preset = i; + break; + } + } + + if (existing_preset == -1 + || QMessageBox::question(parent_, + QCoreApplication::translate("PresetManager", "Preset exists"), + QCoreApplication::translate("PresetManager", + "A preset with this name already exists. " + "Would you like to replace it?")) == QMessageBox::Yes) { + break; + } + } + + preset->SetName(preset_name); + + if (existing_preset >= 0) { + custom_preset_data_.replace(existing_preset, preset); + return false; + } else { + custom_preset_data_.append(preset); + return true; + } + } + + QString GetCustomPresetFilename() const + { + return QDir(FileFunctions::GetConfigurationLocation()).filePath(preset_name_); + } + + PresetPtr GetPreset(int index) + { + return custom_preset_data_.at(index); + } + + void DeletePreset(int index) + { + custom_preset_data_.removeAt(index); + } + + int GetNumberOfPresets() const + { + return custom_preset_data_.size(); + } + + const QVector& GetPresetData() const + { + return custom_preset_data_; + } + +private: + QVector custom_preset_data_; + + QString preset_name_; + + QWidget* parent_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // PRESETMANAGER_H diff --git a/app/dialog/sequence/sequence.cpp b/app/dialog/sequence/sequence.cpp index 69d79a66e..7dd12122b 100644 --- a/app/dialog/sequence/sequence.cpp +++ b/app/dialog/sequence/sequence.cpp @@ -68,8 +68,8 @@ SequenceDialog::SequenceDialog(Sequence* s, Type t, QWidget* parent) : // Set up dialog buttons QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); buttons->setCenterButtons(true); - connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); + connect(buttons, &QDialogButtonBox::accepted, this, &SequenceDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, this, &SequenceDialog::reject); layout->addWidget(buttons); // Set window title based on type diff --git a/app/dialog/sequence/sequencedialogparametertab.cpp b/app/dialog/sequence/sequencedialogparametertab.cpp index 83c5fda9b..1c8742675 100644 --- a/app/dialog/sequence/sequencedialogparametertab.cpp +++ b/app/dialog/sequence/sequencedialogparametertab.cpp @@ -185,13 +185,13 @@ PixelFormat::Format SequenceDialogParameterTab::GetSelectedPreviewFormat() const void SequenceDialogParameterTab::PresetChanged(const SequencePreset &preset) { - video_width_field_->SetValue(preset.width); - video_height_field_->SetValue(preset.height); - video_frame_rate_field_->setCurrentIndex(frame_rate_list_.indexOf(preset.frame_rate)); - audio_sample_rate_field_->setCurrentIndex(sample_rate_list_.indexOf(preset.sample_rate)); - audio_channels_field_->setCurrentIndex(channel_layout_list_.indexOf(preset.channel_layout)); - preview_resolution_field_->setCurrentIndex(divider_list_.indexOf(preset.preview_divider)); - preview_format_field_->setCurrentIndex(preview_format_list_.indexOf(preset.preview_format)); + video_width_field_->SetValue(preset.width()); + video_height_field_->SetValue(preset.height()); + video_frame_rate_field_->setCurrentIndex(frame_rate_list_.indexOf(preset.frame_rate())); + audio_sample_rate_field_->setCurrentIndex(sample_rate_list_.indexOf(preset.sample_rate())); + audio_channels_field_->setCurrentIndex(channel_layout_list_.indexOf(preset.channel_layout())); + preview_resolution_field_->setCurrentIndex(divider_list_.indexOf(preset.preview_divider())); + preview_format_field_->setCurrentIndex(preview_format_list_.indexOf(preset.preview_format())); } void SequenceDialogParameterTab::SavePresetClicked() diff --git a/app/dialog/sequence/sequencedialogpresettab.cpp b/app/dialog/sequence/sequencedialogpresettab.cpp index cfb0406fa..8bf6837dd 100644 --- a/app/dialog/sequence/sequencedialogpresettab.cpp +++ b/app/dialog/sequence/sequencedialogpresettab.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "sequencedialogpresettab.h" #include @@ -21,7 +41,8 @@ const int kDataPresetIsCustomRole = Qt::UserRole + 1; const int kDataPresetDataRole = Qt::UserRole + 2; SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget* parent) : - QWidget(parent) + QWidget(parent), + PresetManager(this, QStringLiteral("sequencepresets")) { QVBoxLayout* outer_layout = new QVBoxLayout(this); outer_layout->setMargin(0); @@ -48,123 +69,17 @@ SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget* parent) : preset_tree_->addTopLevelItem(CreateSDPresetFolder(tr("PAL"), 720, 576, rational(25, 1), 1)); // Load custom presets - QFile preset_file(GetCustomPresetFilename()); - if (preset_file.open(QFile::ReadOnly)) { - QXmlStreamReader reader(&preset_file); - - while (XMLReadNextStartElement(&reader)) { - if (reader.name() == QStringLiteral("presets")) { - while (XMLReadNextStartElement(&reader)) { - if (reader.name() == QStringLiteral("preset")) { - SequencePreset p; - - while (XMLReadNextStartElement(&reader)) { - if (reader.name() == QStringLiteral("name")) { - p.name = reader.readElementText(); - } else if (reader.name() == QStringLiteral("width")) { - p.width = reader.readElementText().toInt(); - } else if (reader.name() == QStringLiteral("height")) { - p.height = reader.readElementText().toInt(); - } else if (reader.name() == QStringLiteral("framerate")) { - p.frame_rate = rational::fromString(reader.readElementText()); - } else if (reader.name() == QStringLiteral("samplerate")) { - p.sample_rate = reader.readElementText().toInt(); - } else if (reader.name() == QStringLiteral("chlayout")) { - p.channel_layout = reader.readElementText().toULongLong(); - } else if (reader.name() == QStringLiteral("divider")) { - p.preview_divider = reader.readElementText().toInt(); - } else if (reader.name() == QStringLiteral("format")) { - p.preview_format = static_cast(reader.readElementText().toInt()); - } else { - reader.skipCurrentElement(); - } - } - - AddItem(my_presets_folder_, p, true); - } else { - reader.skipCurrentElement(); - } - } - } else { - reader.skipCurrentElement(); - } - } - - preset_file.close(); - } -} - -SequenceDialogPresetTab::~SequenceDialogPresetTab() -{ - // Save custom presets to disk - QFile preset_file(GetCustomPresetFilename()); - if (preset_file.open(QFile::WriteOnly)) { - QXmlStreamWriter writer(&preset_file); - writer.setAutoFormatting(true); - - writer.writeStartDocument(); - - writer.writeStartElement(QStringLiteral("presets")); - - foreach (const SequencePreset& p, custom_preset_data_) { - writer.writeStartElement(QStringLiteral("preset")); - - writer.writeTextElement(QStringLiteral("name"), p.name); - writer.writeTextElement(QStringLiteral("width"), QString::number(p.width)); - writer.writeTextElement(QStringLiteral("height"), QString::number(p.height)); - writer.writeTextElement(QStringLiteral("framerate"), p.frame_rate.toString()); - writer.writeTextElement(QStringLiteral("samplerate"), QString::number(p.sample_rate)); - writer.writeTextElement(QStringLiteral("chlayout"), QString::number(p.channel_layout)); - writer.writeTextElement(QStringLiteral("divider"), QString::number(p.preview_divider)); - writer.writeTextElement(QStringLiteral("format"), QString::number(p.preview_format)); - - writer.writeEndElement(); // preset - } - - writer.writeEndElement(); // presets - - writer.writeEndDocument(); - - preset_file.close(); + for (int i=0;i(preset); - forever { - preset_name = GetPresetName(preset_name); - - if (preset_name.isEmpty()) { - // Dialog cancelled - leave function entirely - return; - } - - existing_preset = -1; - for (int i=0; i= 0) { - custom_preset_data_.replace(existing_preset, preset); - } else { - AddItem(my_presets_folder_, preset, true); + if (SavePreset(preset_ptr)) { + AddCustomItem(my_presets_folder_, preset_ptr, GetNumberOfPresets() - 1); } } @@ -179,46 +94,46 @@ QTreeWidgetItem* SequenceDialogPresetTab::CreateFolder(const QString &name) QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &name, int width, int height, int divider) { QTreeWidgetItem* parent = CreateFolder(name); - AddItem(parent, {tr("%1 23.976 FPS").arg(name), - width, - height, - rational(24000, 1001), - 48000, - AV_CH_LAYOUT_STEREO, - divider, - PixelFormat::PIX_FMT_RGBA16F}); - AddItem(parent, {tr("%1 25 FPS").arg(name), - width, - height, - rational(25, 1), - 48000, - AV_CH_LAYOUT_STEREO, - divider, - PixelFormat::PIX_FMT_RGBA16F}); - AddItem(parent, {tr("%1 29.97 FPS").arg(name), - width, - height, - rational(30000, 1001), - 48000, - AV_CH_LAYOUT_STEREO, - divider, - PixelFormat::PIX_FMT_RGBA16F}); - AddItem(parent, {tr("%1 50 FPS").arg(name), - width, - height, - rational(50, 1), - 48000, - AV_CH_LAYOUT_STEREO, - divider, - PixelFormat::PIX_FMT_RGBA16F}); - AddItem(parent, {tr("%1 59.94 FPS").arg(name), - width, - height, - rational(60000, 1001), - 48000, - AV_CH_LAYOUT_STEREO, - divider, - PixelFormat::PIX_FMT_RGBA16F}); + AddStandardItem(parent, SequencePreset::Create(tr("%1 23.976 FPS").arg(name), + width, + height, + rational(24000, 1001), + 48000, + AV_CH_LAYOUT_STEREO, + divider, + PixelFormat::PIX_FMT_RGBA16F)); + AddStandardItem(parent, SequencePreset::Create(tr("%1 25 FPS").arg(name), + width, + height, + rational(25, 1), + 48000, + AV_CH_LAYOUT_STEREO, + divider, + PixelFormat::PIX_FMT_RGBA16F)); + AddStandardItem(parent, SequencePreset::Create(tr("%1 29.97 FPS").arg(name), + width, + height, + rational(30000, 1001), + 48000, + AV_CH_LAYOUT_STEREO, + divider, + PixelFormat::PIX_FMT_RGBA16F)); + AddStandardItem(parent, SequencePreset::Create(tr("%1 50 FPS").arg(name), + width, + height, + rational(50, 1), + 48000, + AV_CH_LAYOUT_STEREO, + divider, + PixelFormat::PIX_FMT_RGBA16F)); + AddStandardItem(parent, SequencePreset::Create(tr("%1 59.94 FPS").arg(name), + width, + height, + rational(60000, 1001), + 48000, + AV_CH_LAYOUT_STEREO, + divider, + PixelFormat::PIX_FMT_RGBA16F)); return parent; } @@ -226,54 +141,25 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &na { QTreeWidgetItem* parent = CreateFolder(name); preset_tree_->addTopLevelItem(parent); - AddItem(parent, {tr("%1 Standard").arg(name), - width, - height, - frame_rate, - 48000, - AV_CH_LAYOUT_STEREO, - divider, - PixelFormat::PIX_FMT_RGBA16F}); - AddItem(parent, {tr("%1 Widescreen").arg(name), - width, - height, - frame_rate, - 48000, - AV_CH_LAYOUT_STEREO, - divider, - PixelFormat::PIX_FMT_RGBA16F}); + AddStandardItem(parent, SequencePreset::Create(tr("%1 Standard").arg(name), + width, + height, + frame_rate, + 48000, + AV_CH_LAYOUT_STEREO, + divider, + PixelFormat::PIX_FMT_RGBA16F)); + AddStandardItem(parent, SequencePreset::Create(tr("%1 Widescreen").arg(name), + width, + height, + frame_rate, + 48000, + AV_CH_LAYOUT_STEREO, + divider, + PixelFormat::PIX_FMT_RGBA16F)); return parent; } -QString SequenceDialogPresetTab::GetPresetName(QString start) -{ - bool ok; - - forever { - start = QInputDialog::getText(this, - tr("Save Preset"), - tr("Set preset name:"), - QLineEdit::Normal, - start, - &ok); - - if (!ok) { - // Dialog cancelled - leave function entirely - return QString(); - } - - if (start.isEmpty()) { - // No preset name entered, start loop over - QMessageBox::critical(this, tr("Invalid preset name"), - tr("You must enter a preset name"), QMessageBox::Ok); - } else { - break; - } - } - - return start; -} - QTreeWidgetItem *SequenceDialogPresetTab::GetSelectedItem() { QList selected_items = preset_tree_->selectedItems(); @@ -298,23 +184,28 @@ QTreeWidgetItem *SequenceDialogPresetTab::GetSelectedCustomPreset() return nullptr; } -QString SequenceDialogPresetTab::GetCustomPresetFilename() +void SequenceDialogPresetTab::AddStandardItem(QTreeWidgetItem *folder, PresetPtr preset, const QString& description) { - return QDir(FileFunctions::GetConfigurationLocation()).filePath(QStringLiteral("presets")); + int index = default_preset_data_.size(); + default_preset_data_.append(preset); + AddItemInternal(folder, preset, false, index, description); } -void SequenceDialogPresetTab::AddItem(QTreeWidgetItem *folder, const SequencePreset& preset, bool is_custom, const QString &description) +void SequenceDialogPresetTab::AddCustomItem(QTreeWidgetItem *folder, PresetPtr preset, int index, const QString &description) +{ + AddItemInternal(folder, preset, true, index, description); +} + +void SequenceDialogPresetTab::AddItemInternal(QTreeWidgetItem *folder, PresetPtr preset, bool is_custom, int index, const QString &description) { QTreeWidgetItem* item = new QTreeWidgetItem(); - item->setText(0, preset.name); + + item->setText(0, preset->GetName()); item->setIcon(0, icon::Video); item->setToolTip(0, description); item->setData(0, kDataIsPreset, true); item->setData(0, kDataPresetIsCustomRole, is_custom); - - QList& list = is_custom ? custom_preset_data_ : default_preset_data_; - item->setData(0, kDataPresetDataRole, list.size()); - list.append(preset); + item->setData(0, kDataPresetDataRole, index); folder->addChild(item); } @@ -326,11 +217,11 @@ void SequenceDialogPresetTab::SelectedItemChanged(QTreeWidgetItem* current, QTre if (current->data(0, kDataIsPreset).toBool()) { int preset_index = current->data(0, kDataPresetDataRole).toInt(); - const SequencePreset& preset_data = (current->data(0, kDataPresetIsCustomRole).toBool()) - ? custom_preset_data_.at(preset_index) + PresetPtr preset_data = (current->data(0, kDataPresetIsCustomRole).toBool()) + ? GetPreset(preset_index) : default_preset_data_.at(preset_index); - emit PresetChanged(preset_data); + emit PresetChanged(*static_cast(preset_data.get())); } } @@ -375,7 +266,7 @@ void SequenceDialogPresetTab::DeleteSelectedPreset() } // Remove the preset - custom_preset_data_.removeAt(preset_index); + DeletePreset(preset_index); // Delete the item delete sel; diff --git a/app/dialog/sequence/sequencedialogpresettab.h b/app/dialog/sequence/sequencedialogpresettab.h index 3f426fa79..df5ba5596 100644 --- a/app/dialog/sequence/sequencedialogpresettab.h +++ b/app/dialog/sequence/sequencedialogpresettab.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SEQUENCEDIALOGPRESETTAB_H #define SEQUENCEDIALOGPRESETTAB_H @@ -5,18 +25,17 @@ #include #include +#include "presetmanager.h" #include "sequencepreset.h" OLIVE_NAMESPACE_ENTER -class SequenceDialogPresetTab : public QWidget +class SequenceDialogPresetTab : public QWidget, public PresetManager { Q_OBJECT public: SequenceDialogPresetTab(QWidget* parent = nullptr); - virtual ~SequenceDialogPresetTab() override; - public slots: void SaveParametersAsPreset(SequencePreset preset); @@ -32,24 +51,20 @@ private: QTreeWidgetItem *CreateSDPresetFolder(const QString& name, int width, int height, const rational &frame_rate, int divider); - QString GetPresetName(QString start); - QTreeWidgetItem* GetSelectedItem(); QTreeWidgetItem* GetSelectedCustomPreset(); - static QString GetCustomPresetFilename(); + void AddStandardItem(QTreeWidgetItem* folder, PresetPtr preset, const QString &description = QString()); - void AddItem(QTreeWidgetItem* folder, - const SequencePreset& preset, - bool is_custom = false, - const QString& description = QString()); + void AddCustomItem(QTreeWidgetItem* folder, PresetPtr preset, int index, const QString& description = QString()); + + void AddItemInternal(QTreeWidgetItem* folder, PresetPtr preset, bool is_custom, int index, const QString& description = QString()); QTreeWidget* preset_tree_; QTreeWidgetItem* my_presets_folder_; - QList default_preset_data_; - QList custom_preset_data_; + QList default_preset_data_; private slots: void SelectedItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); diff --git a/app/dialog/sequence/sequencepreset.h b/app/dialog/sequence/sequencepreset.h index fb4ba9ab2..4b0dc776e 100644 --- a/app/dialog/sequence/sequencepreset.h +++ b/app/dialog/sequence/sequencepreset.h @@ -21,20 +21,132 @@ #ifndef SEQUENCEPARAM_H #define SEQUENCEPARAM_H +#include + #include "common/rational.h" +#include "common/xmlutils.h" +#include "dialog/sequence/presetmanager.h" #include "render/pixelformat.h" OLIVE_NAMESPACE_ENTER -struct SequencePreset { - QString name; - int width; - int height; - rational frame_rate; - int sample_rate; - uint64_t channel_layout; - int preview_divider; - PixelFormat::Format preview_format; +class SequencePreset : public Preset { +public: + SequencePreset() = default; + + SequencePreset(const QString& name, + int width, + int height, + const rational& frame_rate, + int sample_rate, + uint64_t channel_layout, + int preview_divider, + PixelFormat::Format preview_format) : + width_(width), + height_(height), + frame_rate_(frame_rate), + sample_rate_(sample_rate), + channel_layout_(channel_layout), + preview_divider_(preview_divider), + preview_format_(preview_format) + { + SetName(name); + } + + static PresetPtr Create(const QString& name, + int width, + int height, + const rational& frame_rate, + int sample_rate, + uint64_t channel_layout, + int preview_divider, + PixelFormat::Format preview_format) + { + return std::make_shared(name, width, height, frame_rate, sample_rate, + channel_layout, preview_divider, preview_format); + } + + virtual void Load(QXmlStreamReader* reader) override + { + while (XMLReadNextStartElement(reader)) { + if (reader->name() == QStringLiteral("name")) { + SetName(reader->readElementText()); + } else if (reader->name() == QStringLiteral("width")) { + width_ = reader->readElementText().toInt(); + } else if (reader->name() == QStringLiteral("height")) { + height_ = reader->readElementText().toInt(); + } else if (reader->name() == QStringLiteral("framerate")) { + frame_rate_ = rational::fromString(reader->readElementText()); + } else if (reader->name() == QStringLiteral("samplerate")) { + sample_rate_ = reader->readElementText().toInt(); + } else if (reader->name() == QStringLiteral("chlayout")) { + channel_layout_ = reader->readElementText().toULongLong(); + } else if (reader->name() == QStringLiteral("divider")) { + preview_divider_ = reader->readElementText().toInt(); + } else if (reader->name() == QStringLiteral("format")) { + preview_format_ = static_cast(reader->readElementText().toInt()); + } else { + reader->skipCurrentElement(); + } + } + } + + virtual void Save(QXmlStreamWriter* writer) const override + { + writer->writeTextElement(QStringLiteral("name"), GetName()); + writer->writeTextElement(QStringLiteral("width"), QString::number(width_)); + writer->writeTextElement(QStringLiteral("height"), QString::number(height_)); + writer->writeTextElement(QStringLiteral("framerate"), frame_rate_.toString()); + writer->writeTextElement(QStringLiteral("samplerate"), QString::number(sample_rate_)); + writer->writeTextElement(QStringLiteral("chlayout"), QString::number(channel_layout_)); + writer->writeTextElement(QStringLiteral("divider"), QString::number(preview_divider_)); + writer->writeTextElement(QStringLiteral("format"), QString::number(preview_format_)); + } + + int width() const + { + return width_; + } + + int height() const + { + return height_; + } + + const rational& frame_rate() const + { + return frame_rate_; + } + + int sample_rate() const + { + return sample_rate_; + } + + uint64_t channel_layout() const + { + return channel_layout_; + } + + int preview_divider() const + { + return preview_divider_; + } + + PixelFormat::Format preview_format() const + { + return preview_format_; + } + +private: + int width_; + int height_; + rational frame_rate_; + int sample_rate_; + uint64_t channel_layout_; + int preview_divider_; + PixelFormat::Format preview_format_; + }; OLIVE_NAMESPACE_EXIT