sequencedialog: split off the preset code for use elsewhere (particularly the export dialog)

This commit is contained in:
itsmattkc
2020-07-23 20:07:11 +10:00
parent ce486f6b84
commit e570abb556
8 changed files with 495 additions and 243 deletions
-4
View File
@@ -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)
+1
View File
@@ -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
+237
View File
@@ -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 <http://www.gnu.org/licenses/>.
***/
#ifndef PRESETMANAGER_H
#define PRESETMANAGER_H
#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QInputDialog>
#include <QMessageBox>
#include <QObject>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#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<Preset>;
template <typename T>
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<T>();
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; i<custom_preset_data_.size(); i++) {
if (custom_preset_data_.at(i)->GetName() == 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<PresetPtr>& GetPresetData() const
{
return custom_preset_data_;
}
private:
QVector<PresetPtr> custom_preset_data_;
QString preset_name_;
QWidget* parent_;
};
OLIVE_NAMESPACE_EXIT
#endif // PRESETMANAGER_H
+2 -2
View File
@@ -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
@@ -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()
+100 -209
View File
@@ -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 <http://www.gnu.org/licenses/>.
***/
#include "sequencedialogpresettab.h"
#include <QDir>
@@ -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<SequencePreset>(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<PixelFormat::Format>(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<GetNumberOfPresets();i++) {
AddCustomItem(my_presets_folder_, GetPreset(i), i);
}
}
void SequenceDialogPresetTab::SaveParametersAsPreset(SequencePreset preset)
{
QString preset_name;
int existing_preset;
PresetPtr preset_ptr = std::make_shared<SequencePreset>(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<custom_preset_data_.size(); i++) {
if (custom_preset_data_.at(i).name == preset_name) {
existing_preset = i;
break;
}
}
if (existing_preset == -1
|| QMessageBox::question(this,
tr("Preset exists"),
tr("A preset with this name already exists. "
"Would you like to replace it?")) == QMessageBox::Yes) {
break;
}
}
preset.name = preset_name;
if (existing_preset >= 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<QTreeWidgetItem*> 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<SequencePreset>& 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<SequencePreset*>(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;
+27 -12
View File
@@ -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 <http://www.gnu.org/licenses/>.
***/
#ifndef SEQUENCEDIALOGPRESETTAB_H
#define SEQUENCEDIALOGPRESETTAB_H
@@ -5,18 +25,17 @@
#include <QTreeWidget>
#include <QWidget>
#include "presetmanager.h"
#include "sequencepreset.h"
OLIVE_NAMESPACE_ENTER
class SequenceDialogPresetTab : public QWidget
class SequenceDialogPresetTab : public QWidget, public PresetManager<SequencePreset>
{
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<SequencePreset> default_preset_data_;
QList<SequencePreset> custom_preset_data_;
QList<PresetPtr> default_preset_data_;
private slots:
void SelectedItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
+121 -9
View File
@@ -21,20 +21,132 @@
#ifndef SEQUENCEPARAM_H
#define SEQUENCEPARAM_H
#include <QXmlStreamWriter>
#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<SequencePreset>(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<PixelFormat::Format>(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