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