change: change code style to Linux style except indent.
This commit is contained in:
+158
-155
@@ -35,210 +35,213 @@
|
||||
#include "common/filefunctions.h"
|
||||
#include "common/xmlutils.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
class Preset
|
||||
namespace olive
|
||||
{
|
||||
|
||||
class Preset {
|
||||
public:
|
||||
Preset() = default;
|
||||
Preset() = default;
|
||||
|
||||
virtual ~Preset(){}
|
||||
virtual ~Preset()
|
||||
{
|
||||
}
|
||||
|
||||
const QString& GetName() const
|
||||
{
|
||||
return name_;
|
||||
}
|
||||
const QString &GetName() const
|
||||
{
|
||||
return name_;
|
||||
}
|
||||
|
||||
void SetName(const QString& s)
|
||||
{
|
||||
name_ = s;
|
||||
}
|
||||
void SetName(const QString &s)
|
||||
{
|
||||
name_ = s;
|
||||
}
|
||||
|
||||
virtual void Load(QXmlStreamReader* reader) = 0;
|
||||
virtual void Load(QXmlStreamReader *reader) = 0;
|
||||
|
||||
virtual void Save(QXmlStreamWriter* writer) const = 0;
|
||||
virtual void Save(QXmlStreamWriter *writer) const = 0;
|
||||
|
||||
private:
|
||||
QString name_;
|
||||
|
||||
QString name_;
|
||||
};
|
||||
|
||||
using PresetPtr = std::shared_ptr<Preset>;
|
||||
|
||||
template <typename T>
|
||||
class PresetManager
|
||||
{
|
||||
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);
|
||||
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_unique<T>();
|
||||
while (XMLReadNextStartElement(&reader)) {
|
||||
if (reader.name() == QStringLiteral("presets")) {
|
||||
while (XMLReadNextStartElement(&reader)) {
|
||||
if (reader.name() == QStringLiteral("preset")) {
|
||||
PresetPtr p = std::make_unique<T>();
|
||||
|
||||
p->Load(&reader);
|
||||
p->Load(&reader);
|
||||
|
||||
custom_preset_data_.append(p);
|
||||
} else {
|
||||
reader.skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader.skipCurrentElement();
|
||||
}
|
||||
}
|
||||
custom_preset_data_.append(p);
|
||||
} else {
|
||||
reader.skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader.skipCurrentElement();
|
||||
}
|
||||
}
|
||||
|
||||
preset_file.close();
|
||||
}
|
||||
}
|
||||
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);
|
||||
~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.writeStartDocument();
|
||||
|
||||
writer.writeStartElement(QStringLiteral("presets"));
|
||||
writer.writeStartElement(QStringLiteral("presets"));
|
||||
|
||||
foreach (PresetPtr p, custom_preset_data_) {
|
||||
writer.writeStartElement(QStringLiteral("preset"));
|
||||
foreach (PresetPtr p, custom_preset_data_) {
|
||||
writer.writeStartElement(QStringLiteral("preset"));
|
||||
|
||||
p->Save(&writer);
|
||||
p->Save(&writer);
|
||||
|
||||
writer.writeEndElement(); // preset
|
||||
}
|
||||
writer.writeEndElement(); // preset
|
||||
}
|
||||
|
||||
writer.writeEndElement(); // presets
|
||||
writer.writeEndElement(); // presets
|
||||
|
||||
writer.writeEndDocument();
|
||||
writer.writeEndDocument();
|
||||
|
||||
preset_file.close();
|
||||
}
|
||||
}
|
||||
preset_file.close();
|
||||
}
|
||||
}
|
||||
|
||||
QString GetPresetName(QString start) const
|
||||
{
|
||||
bool ok;
|
||||
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);
|
||||
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 (!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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
return start;
|
||||
}
|
||||
|
||||
enum SaveStatus {
|
||||
kAppended,
|
||||
kReplaced,
|
||||
kNotSaved
|
||||
};
|
||||
enum SaveStatus { kAppended, kReplaced, kNotSaved };
|
||||
|
||||
SaveStatus SavePreset(PresetPtr preset)
|
||||
{
|
||||
QString preset_name;
|
||||
int existing_preset;
|
||||
SaveStatus SavePreset(PresetPtr preset)
|
||||
{
|
||||
QString preset_name;
|
||||
int existing_preset;
|
||||
|
||||
forever {
|
||||
preset_name = GetPresetName(preset_name);
|
||||
forever
|
||||
{
|
||||
preset_name = GetPresetName(preset_name);
|
||||
|
||||
if (preset_name.isEmpty()) {
|
||||
// Dialog cancelled - leave function entirely
|
||||
return kNotSaved;
|
||||
}
|
||||
if (preset_name.isEmpty()) {
|
||||
// Dialog cancelled - leave function entirely
|
||||
return kNotSaved;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
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);
|
||||
preset->SetName(preset_name);
|
||||
|
||||
if (existing_preset >= 0) {
|
||||
custom_preset_data_.replace(existing_preset, preset);
|
||||
return kReplaced;
|
||||
} else {
|
||||
custom_preset_data_.append(preset);
|
||||
return kAppended;
|
||||
}
|
||||
}
|
||||
if (existing_preset >= 0) {
|
||||
custom_preset_data_.replace(existing_preset, preset);
|
||||
return kReplaced;
|
||||
} else {
|
||||
custom_preset_data_.append(preset);
|
||||
return kAppended;
|
||||
}
|
||||
}
|
||||
|
||||
QString GetCustomPresetFilename() const
|
||||
{
|
||||
return QDir(FileFunctions::GetConfigurationLocation()).filePath(preset_name_);
|
||||
}
|
||||
QString GetCustomPresetFilename() const
|
||||
{
|
||||
return QDir(FileFunctions::GetConfigurationLocation())
|
||||
.filePath(preset_name_);
|
||||
}
|
||||
|
||||
PresetPtr GetPreset(int index)
|
||||
{
|
||||
return custom_preset_data_.at(index);
|
||||
}
|
||||
PresetPtr GetPreset(int index)
|
||||
{
|
||||
return custom_preset_data_.at(index);
|
||||
}
|
||||
|
||||
void DeletePreset(int index)
|
||||
{
|
||||
custom_preset_data_.removeAt(index);
|
||||
}
|
||||
void DeletePreset(int index)
|
||||
{
|
||||
custom_preset_data_.removeAt(index);
|
||||
}
|
||||
|
||||
int GetNumberOfPresets() const
|
||||
{
|
||||
return custom_preset_data_.size();
|
||||
}
|
||||
int GetNumberOfPresets() const
|
||||
{
|
||||
return custom_preset_data_.size();
|
||||
}
|
||||
|
||||
const QVector<PresetPtr>& GetPresetData() const
|
||||
{
|
||||
return custom_preset_data_;
|
||||
}
|
||||
const QVector<PresetPtr> &GetPresetData() const
|
||||
{
|
||||
return custom_preset_data_;
|
||||
}
|
||||
|
||||
private:
|
||||
QVector<PresetPtr> custom_preset_data_;
|
||||
QVector<PresetPtr> custom_preset_data_;
|
||||
|
||||
QString preset_name_;
|
||||
|
||||
QWidget* parent_;
|
||||
QString preset_name_;
|
||||
|
||||
QWidget *parent_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+156
-137
@@ -35,194 +35,213 @@
|
||||
#include "common/qtutils.h"
|
||||
#include "undo/undostack.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
SequenceDialog::SequenceDialog(Sequence* s, Type t, QWidget* parent) :
|
||||
QDialog(parent),
|
||||
sequence_(s),
|
||||
make_undoable_(true)
|
||||
namespace olive
|
||||
{
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
|
||||
QSplitter* splitter = new QSplitter();
|
||||
layout->addWidget(splitter);
|
||||
SequenceDialog::SequenceDialog(Sequence *s, Type t, QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, sequence_(s)
|
||||
, make_undoable_(true)
|
||||
{
|
||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||
|
||||
preset_tab_ = new SequenceDialogPresetTab();
|
||||
splitter->addWidget(preset_tab_);
|
||||
QSplitter *splitter = new QSplitter();
|
||||
layout->addWidget(splitter);
|
||||
|
||||
parameter_tab_ = new SequenceDialogParameterTab(sequence_);
|
||||
splitter->addWidget(parameter_tab_);
|
||||
preset_tab_ = new SequenceDialogPresetTab();
|
||||
splitter->addWidget(preset_tab_);
|
||||
|
||||
connect(preset_tab_, &SequenceDialogPresetTab::PresetChanged,
|
||||
parameter_tab_, &SequenceDialogParameterTab::PresetChanged);
|
||||
connect(preset_tab_, &SequenceDialogPresetTab::PresetAccepted,
|
||||
this, &SequenceDialog::accept);
|
||||
connect(parameter_tab_, &SequenceDialogParameterTab::SaveParametersAsPreset,
|
||||
preset_tab_, &SequenceDialogPresetTab::SaveParametersAsPreset);
|
||||
parameter_tab_ = new SequenceDialogParameterTab(sequence_);
|
||||
splitter->addWidget(parameter_tab_);
|
||||
|
||||
// Set up name section
|
||||
QHBoxLayout* name_layout = new QHBoxLayout();
|
||||
name_layout->addWidget(new QLabel(tr("Name:")));
|
||||
name_field_ = new QLineEdit();
|
||||
name_layout->addWidget(name_field_);
|
||||
layout->addLayout(name_layout);
|
||||
connect(preset_tab_, &SequenceDialogPresetTab::PresetChanged,
|
||||
parameter_tab_, &SequenceDialogParameterTab::PresetChanged);
|
||||
connect(preset_tab_, &SequenceDialogPresetTab::PresetAccepted, this,
|
||||
&SequenceDialog::accept);
|
||||
connect(parameter_tab_, &SequenceDialogParameterTab::SaveParametersAsPreset,
|
||||
preset_tab_, &SequenceDialogPresetTab::SaveParametersAsPreset);
|
||||
|
||||
// Set up dialog buttons
|
||||
QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||
QPushButton *default_btn = buttons->addButton(tr("Set As Default"), QDialogButtonBox::ActionRole);
|
||||
connect(buttons, &QDialogButtonBox::accepted, this, &SequenceDialog::accept);
|
||||
connect(buttons, &QDialogButtonBox::rejected, this, &SequenceDialog::reject);
|
||||
connect(default_btn, &QPushButton::clicked, this, &SequenceDialog::SetAsDefaultClicked);
|
||||
layout->addWidget(buttons);
|
||||
// Set up name section
|
||||
QHBoxLayout *name_layout = new QHBoxLayout();
|
||||
name_layout->addWidget(new QLabel(tr("Name:")));
|
||||
name_field_ = new QLineEdit();
|
||||
name_layout->addWidget(name_field_);
|
||||
layout->addLayout(name_layout);
|
||||
|
||||
// Set window title based on type
|
||||
switch (t) {
|
||||
case kNew:
|
||||
setWindowTitle(tr("New Sequence"));
|
||||
break;
|
||||
case kExisting:
|
||||
setWindowTitle(tr("Editing \"%1\"").arg(sequence_->GetLabel()));
|
||||
break;
|
||||
}
|
||||
// Set up dialog buttons
|
||||
QDialogButtonBox *buttons =
|
||||
new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||
QPushButton *default_btn =
|
||||
buttons->addButton(tr("Set As Default"), QDialogButtonBox::ActionRole);
|
||||
connect(buttons, &QDialogButtonBox::accepted, this,
|
||||
&SequenceDialog::accept);
|
||||
connect(buttons, &QDialogButtonBox::rejected, this,
|
||||
&SequenceDialog::reject);
|
||||
connect(default_btn, &QPushButton::clicked, this,
|
||||
&SequenceDialog::SetAsDefaultClicked);
|
||||
layout->addWidget(buttons);
|
||||
|
||||
name_field_->setText(sequence_->GetLabel());
|
||||
// Set window title based on type
|
||||
switch (t) {
|
||||
case kNew:
|
||||
setWindowTitle(tr("New Sequence"));
|
||||
break;
|
||||
case kExisting:
|
||||
setWindowTitle(tr("Editing \"%1\"").arg(sequence_->GetLabel()));
|
||||
break;
|
||||
}
|
||||
|
||||
name_field_->setText(sequence_->GetLabel());
|
||||
}
|
||||
|
||||
void SequenceDialog::SetUndoable(bool u)
|
||||
{
|
||||
make_undoable_ = u;
|
||||
make_undoable_ = u;
|
||||
}
|
||||
|
||||
void SequenceDialog::SetNameIsEditable(bool e)
|
||||
{
|
||||
name_field_->setEnabled(e);
|
||||
name_field_->setEnabled(e);
|
||||
}
|
||||
|
||||
void SequenceDialog::accept()
|
||||
{
|
||||
if (name_field_->isEnabled() && name_field_->text().isEmpty()) {
|
||||
QtUtils::MsgBox(this, QMessageBox::Critical, tr("Error editing Sequence"), tr("Please enter a name for this Sequence."));
|
||||
return;
|
||||
}
|
||||
if (name_field_->isEnabled() && name_field_->text().isEmpty()) {
|
||||
QtUtils::MsgBox(this, QMessageBox::Critical,
|
||||
tr("Error editing Sequence"),
|
||||
tr("Please enter a name for this Sequence."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!VideoParams::FormatIsFloat(parameter_tab_->GetSelectedPreviewFormat())
|
||||
&& !OLIVE_CONFIG("PreviewNonFloatDontAskAgain").toBool()) {
|
||||
QMessageBox b(this);
|
||||
QCheckBox *dont_show_again_ = new QCheckBox(tr("Don't ask me again"));
|
||||
if (!VideoParams::FormatIsFloat(
|
||||
parameter_tab_->GetSelectedPreviewFormat()) &&
|
||||
!OLIVE_CONFIG("PreviewNonFloatDontAskAgain").toBool()) {
|
||||
QMessageBox b(this);
|
||||
QCheckBox *dont_show_again_ = new QCheckBox(tr("Don't ask me again"));
|
||||
|
||||
b.setIcon(QMessageBox::Warning);
|
||||
b.setWindowTitle(tr("Low Quality Preview"));
|
||||
b.setText(tr("The preview resolution has been set to a non-float format. This may cause banding and clipping artifacts in the preview.\n\n"
|
||||
"Do you wish to continue?"));
|
||||
b.setCheckBox(dont_show_again_);
|
||||
b.setIcon(QMessageBox::Warning);
|
||||
b.setWindowTitle(tr("Low Quality Preview"));
|
||||
b.setText(tr(
|
||||
"The preview resolution has been set to a non-float format. This may cause banding and clipping artifacts in the preview.\n\n"
|
||||
"Do you wish to continue?"));
|
||||
b.setCheckBox(dont_show_again_);
|
||||
|
||||
b.addButton(QMessageBox::Yes);
|
||||
b.addButton(QMessageBox::No);
|
||||
b.addButton(QMessageBox::Yes);
|
||||
b.addButton(QMessageBox::No);
|
||||
|
||||
if (b.exec() == QMessageBox::No) {
|
||||
return;
|
||||
}
|
||||
if (b.exec() == QMessageBox::No) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (dont_show_again_->isChecked()) {
|
||||
OLIVE_CONFIG("PreviewNonFloatDontAskAgain") = true;
|
||||
}
|
||||
}
|
||||
if (dont_show_again_->isChecked()) {
|
||||
OLIVE_CONFIG("PreviewNonFloatDontAskAgain") = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Generate video and audio parameter structs from data
|
||||
VideoParams video_params = VideoParams(parameter_tab_->GetSelectedVideoWidth(),
|
||||
parameter_tab_->GetSelectedVideoHeight(),
|
||||
parameter_tab_->GetSelectedVideoFrameRate().flipped(),
|
||||
parameter_tab_->GetSelectedPreviewFormat(),
|
||||
VideoParams::kInternalChannelCount,
|
||||
parameter_tab_->GetSelectedVideoPixelAspect(),
|
||||
parameter_tab_->GetSelectedVideoInterlacingMode(),
|
||||
parameter_tab_->GetSelectedPreviewResolution());
|
||||
// Generate video and audio parameter structs from data
|
||||
VideoParams video_params =
|
||||
VideoParams(parameter_tab_->GetSelectedVideoWidth(),
|
||||
parameter_tab_->GetSelectedVideoHeight(),
|
||||
parameter_tab_->GetSelectedVideoFrameRate().flipped(),
|
||||
parameter_tab_->GetSelectedPreviewFormat(),
|
||||
VideoParams::kInternalChannelCount,
|
||||
parameter_tab_->GetSelectedVideoPixelAspect(),
|
||||
parameter_tab_->GetSelectedVideoInterlacingMode(),
|
||||
parameter_tab_->GetSelectedPreviewResolution());
|
||||
|
||||
AudioParams audio_params = AudioParams(parameter_tab_->GetSelectedAudioSampleRate(),
|
||||
parameter_tab_->GetSelectedAudioChannelLayout(),
|
||||
Sequence::kDefaultSampleFormat);
|
||||
AudioParams audio_params =
|
||||
AudioParams(parameter_tab_->GetSelectedAudioSampleRate(),
|
||||
parameter_tab_->GetSelectedAudioChannelLayout(),
|
||||
Sequence::kDefaultSampleFormat);
|
||||
|
||||
if (make_undoable_) {
|
||||
if (make_undoable_) {
|
||||
// Make undoable command to change the parameters
|
||||
SequenceParamCommand *param_command = new SequenceParamCommand(
|
||||
sequence_, video_params, audio_params, name_field_->text(),
|
||||
parameter_tab_->GetSelectedPreviewAutoCache());
|
||||
|
||||
// Make undoable command to change the parameters
|
||||
SequenceParamCommand* param_command = new SequenceParamCommand(sequence_,
|
||||
video_params,
|
||||
audio_params,
|
||||
name_field_->text(),
|
||||
parameter_tab_->GetSelectedPreviewAutoCache());
|
||||
Core::instance()->undo_stack()->push(
|
||||
param_command,
|
||||
tr("Set Sequence Parameters For \"%1\"").arg(sequence_->GetLabel()));
|
||||
|
||||
Core::instance()->undo_stack()->push(param_command, tr("Set Sequence Parameters For \"%1\"").arg(sequence_->GetLabel()));
|
||||
} else {
|
||||
// Set sequence values directly with no undo command
|
||||
sequence_->SetVideoParams(video_params);
|
||||
sequence_->SetAudioParams(audio_params);
|
||||
sequence_->SetLabel(name_field_->text());
|
||||
sequence_->SetVideoAutoCacheEnabled(
|
||||
parameter_tab_->GetSelectedPreviewAutoCache());
|
||||
}
|
||||
|
||||
} else {
|
||||
// Set sequence values directly with no undo command
|
||||
sequence_->SetVideoParams(video_params);
|
||||
sequence_->SetAudioParams(audio_params);
|
||||
sequence_->SetLabel(name_field_->text());
|
||||
sequence_->SetVideoAutoCacheEnabled(parameter_tab_->GetSelectedPreviewAutoCache());
|
||||
}
|
||||
|
||||
QDialog::accept();
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void SequenceDialog::SetAsDefaultClicked()
|
||||
{
|
||||
if (QtUtils::MsgBox(this, QMessageBox::Question, tr("Confirm Set As Default"),
|
||||
tr("Are you sure you want to set the current parameters as defaults?"),
|
||||
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
|
||||
// Maybe replace with Preset system
|
||||
OLIVE_CONFIG("DefaultSequenceWidth") = parameter_tab_->GetSelectedVideoWidth();
|
||||
OLIVE_CONFIG("DefaultSequenceHeight") = parameter_tab_->GetSelectedVideoHeight();
|
||||
OLIVE_CONFIG("DefaultSequencePixelAspect") = QVariant::fromValue(parameter_tab_->GetSelectedVideoPixelAspect());
|
||||
OLIVE_CONFIG("DefaultSequenceFrameRate") = QVariant::fromValue(parameter_tab_->GetSelectedVideoFrameRate().flipped());
|
||||
OLIVE_CONFIG("DefaultSequenceInterlacing") = parameter_tab_->GetSelectedVideoInterlacingMode();
|
||||
OLIVE_CONFIG("DefaultSequenceAudioFrequency") = parameter_tab_->GetSelectedAudioSampleRate();
|
||||
OLIVE_CONFIG("DefaultSequenceAudioLayout") = QVariant::fromValue(parameter_tab_->GetSelectedAudioChannelLayout());
|
||||
}
|
||||
if (QtUtils::MsgBox(
|
||||
this, QMessageBox::Question, tr("Confirm Set As Default"),
|
||||
tr("Are you sure you want to set the current parameters as defaults?"),
|
||||
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
|
||||
// Maybe replace with Preset system
|
||||
OLIVE_CONFIG("DefaultSequenceWidth") =
|
||||
parameter_tab_->GetSelectedVideoWidth();
|
||||
OLIVE_CONFIG("DefaultSequenceHeight") =
|
||||
parameter_tab_->GetSelectedVideoHeight();
|
||||
OLIVE_CONFIG("DefaultSequencePixelAspect") =
|
||||
QVariant::fromValue(parameter_tab_->GetSelectedVideoPixelAspect());
|
||||
OLIVE_CONFIG("DefaultSequenceFrameRate") = QVariant::fromValue(
|
||||
parameter_tab_->GetSelectedVideoFrameRate().flipped());
|
||||
OLIVE_CONFIG("DefaultSequenceInterlacing") =
|
||||
parameter_tab_->GetSelectedVideoInterlacingMode();
|
||||
OLIVE_CONFIG("DefaultSequenceAudioFrequency") =
|
||||
parameter_tab_->GetSelectedAudioSampleRate();
|
||||
OLIVE_CONFIG("DefaultSequenceAudioLayout") = QVariant::fromValue(
|
||||
parameter_tab_->GetSelectedAudioChannelLayout());
|
||||
}
|
||||
}
|
||||
|
||||
SequenceDialog::SequenceParamCommand::SequenceParamCommand(Sequence* s,
|
||||
const VideoParams& video_params,
|
||||
const AudioParams &audio_params,
|
||||
const QString& name, bool autocache) :
|
||||
sequence_(s),
|
||||
new_video_params_(video_params),
|
||||
new_audio_params_(audio_params),
|
||||
new_name_(name),
|
||||
new_autocache_(autocache),
|
||||
old_video_params_(s->GetVideoParams()),
|
||||
old_audio_params_(s->GetAudioParams()),
|
||||
old_name_(s->GetLabel()),
|
||||
old_autocache_(s->IsVideoAutoCacheEnabled())
|
||||
SequenceDialog::SequenceParamCommand::SequenceParamCommand(
|
||||
Sequence *s, const VideoParams &video_params,
|
||||
const AudioParams &audio_params, const QString &name, bool autocache)
|
||||
: sequence_(s)
|
||||
, new_video_params_(video_params)
|
||||
, new_audio_params_(audio_params)
|
||||
, new_name_(name)
|
||||
, new_autocache_(autocache)
|
||||
, old_video_params_(s->GetVideoParams())
|
||||
, old_audio_params_(s->GetAudioParams())
|
||||
, old_name_(s->GetLabel())
|
||||
, old_autocache_(s->IsVideoAutoCacheEnabled())
|
||||
{
|
||||
}
|
||||
|
||||
Project *SequenceDialog::SequenceParamCommand::GetRelevantProject() const
|
||||
{
|
||||
return sequence_->project();
|
||||
return sequence_->project();
|
||||
}
|
||||
|
||||
void SequenceDialog::SequenceParamCommand::redo()
|
||||
{
|
||||
if (sequence_->GetVideoParams() != new_video_params_) {
|
||||
sequence_->SetVideoParams(new_video_params_);
|
||||
}
|
||||
if (sequence_->GetAudioParams() != new_audio_params_) {
|
||||
sequence_->SetAudioParams(new_audio_params_);
|
||||
}
|
||||
sequence_->SetLabel(new_name_);
|
||||
sequence_->SetVideoAutoCacheEnabled(new_autocache_);
|
||||
if (sequence_->GetVideoParams() != new_video_params_) {
|
||||
sequence_->SetVideoParams(new_video_params_);
|
||||
}
|
||||
if (sequence_->GetAudioParams() != new_audio_params_) {
|
||||
sequence_->SetAudioParams(new_audio_params_);
|
||||
}
|
||||
sequence_->SetLabel(new_name_);
|
||||
sequence_->SetVideoAutoCacheEnabled(new_autocache_);
|
||||
}
|
||||
|
||||
void SequenceDialog::SequenceParamCommand::undo()
|
||||
{
|
||||
if (sequence_->GetVideoParams() != old_video_params_) {
|
||||
sequence_->SetVideoParams(old_video_params_);
|
||||
}
|
||||
if (sequence_->GetAudioParams() != old_audio_params_) {
|
||||
sequence_->SetAudioParams(old_audio_params_);
|
||||
}
|
||||
sequence_->SetLabel(old_name_);
|
||||
sequence_->SetVideoAutoCacheEnabled(old_autocache_);
|
||||
if (sequence_->GetVideoParams() != old_video_params_) {
|
||||
sequence_->SetVideoParams(old_video_params_);
|
||||
}
|
||||
if (sequence_->GetAudioParams() != old_audio_params_) {
|
||||
sequence_->SetAudioParams(old_audio_params_);
|
||||
}
|
||||
sequence_->SetLabel(old_name_);
|
||||
sequence_->SetVideoAutoCacheEnabled(old_autocache_);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -30,7 +30,8 @@
|
||||
#include "sequencedialogpresettab.h"
|
||||
#include "undo/undocommand.h"
|
||||
|
||||
namespace olive {
|
||||
namespace olive
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief A dialog for editing Sequence parameters
|
||||
@@ -46,19 +47,15 @@ namespace olive {
|
||||
* latter will be the main undoable action, the parameter editing doesn't have to be undoable since to the user they'll
|
||||
* be viewed as one single action (see SetUndoable()).
|
||||
*/
|
||||
class SequenceDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
class SequenceDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
/**
|
||||
/**
|
||||
* @brief Used to set the dialog mode of operation (see SequenceDialog())
|
||||
*/
|
||||
enum Type {
|
||||
kNew,
|
||||
kExisting
|
||||
};
|
||||
enum Type { kNew, kExisting };
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief SequenceDialog Constructor
|
||||
*
|
||||
* @param s
|
||||
@@ -70,73 +67,70 @@ public:
|
||||
* @param parent
|
||||
* QWidget parent
|
||||
*/
|
||||
SequenceDialog(Sequence* s, Type t = kExisting, QWidget* parent = nullptr);
|
||||
SequenceDialog(Sequence *s, Type t = kExisting, QWidget *parent = nullptr);
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief Set whether the parameter changes should be made into an undo command or not
|
||||
*
|
||||
* Defaults to true.
|
||||
*/
|
||||
void SetUndoable(bool u);
|
||||
void SetUndoable(bool u);
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief Set whether the name of this Sequence can be edited with this dialog
|
||||
*
|
||||
* Defaults to true.
|
||||
*/
|
||||
void SetNameIsEditable(bool e);
|
||||
void SetNameIsEditable(bool e);
|
||||
|
||||
public slots:
|
||||
/**
|
||||
/**
|
||||
* @brief Function called when the user presses OK
|
||||
*/
|
||||
virtual void accept() override;
|
||||
virtual void accept() override;
|
||||
|
||||
private:
|
||||
Sequence* sequence_;
|
||||
Sequence *sequence_;
|
||||
|
||||
SequenceDialogPresetTab* preset_tab_;
|
||||
SequenceDialogPresetTab *preset_tab_;
|
||||
|
||||
SequenceDialogParameterTab* parameter_tab_;
|
||||
SequenceDialogParameterTab *parameter_tab_;
|
||||
|
||||
bool make_undoable_;
|
||||
bool make_undoable_;
|
||||
|
||||
QLineEdit* name_field_;
|
||||
QLineEdit *name_field_;
|
||||
|
||||
/**
|
||||
/**
|
||||
* @brief An UndoCommand for setting the parameters on a sequence
|
||||
*/
|
||||
class SequenceParamCommand : public UndoCommand {
|
||||
public:
|
||||
SequenceParamCommand(Sequence* s,
|
||||
const VideoParams& video_params,
|
||||
const AudioParams& audio_params,
|
||||
const QString& name,
|
||||
bool autocache);
|
||||
class SequenceParamCommand : public UndoCommand {
|
||||
public:
|
||||
SequenceParamCommand(Sequence *s, const VideoParams &video_params,
|
||||
const AudioParams &audio_params,
|
||||
const QString &name, bool autocache);
|
||||
|
||||
virtual Project* GetRelevantProject() const override;
|
||||
virtual Project *GetRelevantProject() const override;
|
||||
|
||||
protected:
|
||||
virtual void redo() override;
|
||||
virtual void undo() override;
|
||||
protected:
|
||||
virtual void redo() override;
|
||||
virtual void undo() override;
|
||||
|
||||
private:
|
||||
Sequence* sequence_;
|
||||
private:
|
||||
Sequence *sequence_;
|
||||
|
||||
VideoParams new_video_params_;
|
||||
AudioParams new_audio_params_;
|
||||
QString new_name_;
|
||||
bool new_autocache_;
|
||||
VideoParams new_video_params_;
|
||||
AudioParams new_audio_params_;
|
||||
QString new_name_;
|
||||
bool new_autocache_;
|
||||
|
||||
VideoParams old_video_params_;
|
||||
AudioParams old_audio_params_;
|
||||
QString old_name_;
|
||||
bool old_autocache_;
|
||||
};
|
||||
VideoParams old_video_params_;
|
||||
AudioParams old_audio_params_;
|
||||
QString old_name_;
|
||||
bool old_autocache_;
|
||||
};
|
||||
|
||||
private slots:
|
||||
void SetAsDefaultClicked();
|
||||
|
||||
void SetAsDefaultClicked();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -7,150 +7,149 @@
|
||||
|
||||
#include "core.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidget* parent) :
|
||||
QWidget(parent)
|
||||
namespace olive
|
||||
{
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
|
||||
int row = 0;
|
||||
SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence *sequence,
|
||||
QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||
|
||||
// Set up video section
|
||||
QGroupBox* video_group = new QGroupBox();
|
||||
video_group->setTitle(tr("Video"));
|
||||
QGridLayout *video_layout = new QGridLayout(video_group);
|
||||
video_layout->addWidget(new QLabel(tr("Width:")), row, 0);
|
||||
width_slider_ = new IntegerSlider();
|
||||
width_slider_->SetMinimum(0);
|
||||
video_layout->addWidget(width_slider_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Height:")), row, 0);
|
||||
height_slider_ = new IntegerSlider();
|
||||
height_slider_->SetMinimum(0);
|
||||
video_layout->addWidget(height_slider_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Frame Rate:")), row, 0);
|
||||
framerate_combo_ = new FrameRateComboBox();
|
||||
video_layout->addWidget(framerate_combo_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Pixel Aspect Ratio:")), row, 0);
|
||||
pixelaspect_combo_ = new PixelAspectRatioComboBox();
|
||||
video_layout->addWidget(pixelaspect_combo_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Interlacing:")), row, 0);
|
||||
interlacing_combo_ = new InterlacedComboBox();
|
||||
video_layout->addWidget(interlacing_combo_, row, 1);
|
||||
layout->addWidget(video_group);
|
||||
int row = 0;
|
||||
|
||||
row = 0;
|
||||
// Set up video section
|
||||
QGroupBox *video_group = new QGroupBox();
|
||||
video_group->setTitle(tr("Video"));
|
||||
QGridLayout *video_layout = new QGridLayout(video_group);
|
||||
video_layout->addWidget(new QLabel(tr("Width:")), row, 0);
|
||||
width_slider_ = new IntegerSlider();
|
||||
width_slider_->SetMinimum(0);
|
||||
video_layout->addWidget(width_slider_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Height:")), row, 0);
|
||||
height_slider_ = new IntegerSlider();
|
||||
height_slider_->SetMinimum(0);
|
||||
video_layout->addWidget(height_slider_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Frame Rate:")), row, 0);
|
||||
framerate_combo_ = new FrameRateComboBox();
|
||||
video_layout->addWidget(framerate_combo_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Pixel Aspect Ratio:")), row, 0);
|
||||
pixelaspect_combo_ = new PixelAspectRatioComboBox();
|
||||
video_layout->addWidget(pixelaspect_combo_, row, 1);
|
||||
row++;
|
||||
video_layout->addWidget(new QLabel(tr("Interlacing:")), row, 0);
|
||||
interlacing_combo_ = new InterlacedComboBox();
|
||||
video_layout->addWidget(interlacing_combo_, row, 1);
|
||||
layout->addWidget(video_group);
|
||||
|
||||
// Set up audio section
|
||||
QGroupBox* audio_group = new QGroupBox();
|
||||
audio_group->setTitle(tr("Audio"));
|
||||
QGridLayout* audio_layout = new QGridLayout(audio_group);
|
||||
audio_layout->addWidget(new QLabel(tr("Sample Rate:")), row, 0);
|
||||
audio_sample_rate_field_ = new SampleRateComboBox();
|
||||
audio_layout->addWidget(audio_sample_rate_field_, row, 1);
|
||||
row++;
|
||||
audio_layout->addWidget(new QLabel(tr("Channels:")), row, 0);
|
||||
audio_channels_field_ = new ChannelLayoutComboBox();
|
||||
audio_layout->addWidget(audio_channels_field_, row, 1);
|
||||
layout->addWidget(audio_group);
|
||||
row = 0;
|
||||
|
||||
row = 0;
|
||||
// Set up audio section
|
||||
QGroupBox *audio_group = new QGroupBox();
|
||||
audio_group->setTitle(tr("Audio"));
|
||||
QGridLayout *audio_layout = new QGridLayout(audio_group);
|
||||
audio_layout->addWidget(new QLabel(tr("Sample Rate:")), row, 0);
|
||||
audio_sample_rate_field_ = new SampleRateComboBox();
|
||||
audio_layout->addWidget(audio_sample_rate_field_, row, 1);
|
||||
row++;
|
||||
audio_layout->addWidget(new QLabel(tr("Channels:")), row, 0);
|
||||
audio_channels_field_ = new ChannelLayoutComboBox();
|
||||
audio_layout->addWidget(audio_channels_field_, row, 1);
|
||||
layout->addWidget(audio_group);
|
||||
|
||||
// Set up preview section
|
||||
QGroupBox* preview_group = new QGroupBox();
|
||||
preview_group->setTitle(tr("Preview"));
|
||||
QGridLayout* preview_layout = new QGridLayout(preview_group);
|
||||
preview_layout->addWidget(new QLabel(tr("Resolution:")), row, 0);
|
||||
preview_resolution_field_ = new VideoDividerComboBox();
|
||||
preview_layout->addWidget(preview_resolution_field_, row, 1);
|
||||
preview_resolution_label_ = new QLabel();
|
||||
preview_layout->addWidget(preview_resolution_label_, row, 2);
|
||||
row++;
|
||||
preview_layout->addWidget(new QLabel(tr("Quality:")), row, 0);
|
||||
preview_format_field_ = new PixelFormatComboBox(false);
|
||||
preview_layout->addWidget(preview_format_field_, row, 1, 1, 2);
|
||||
row = 0;
|
||||
|
||||
/* TEMP: Disable sequence auto-cache, wanna see if clip cache supersedes it.
|
||||
// Set up preview section
|
||||
QGroupBox *preview_group = new QGroupBox();
|
||||
preview_group->setTitle(tr("Preview"));
|
||||
QGridLayout *preview_layout = new QGridLayout(preview_group);
|
||||
preview_layout->addWidget(new QLabel(tr("Resolution:")), row, 0);
|
||||
preview_resolution_field_ = new VideoDividerComboBox();
|
||||
preview_layout->addWidget(preview_resolution_field_, row, 1);
|
||||
preview_resolution_label_ = new QLabel();
|
||||
preview_layout->addWidget(preview_resolution_label_, row, 2);
|
||||
row++;
|
||||
preview_layout->addWidget(new QLabel(tr("Quality:")), row, 0);
|
||||
preview_format_field_ = new PixelFormatComboBox(false);
|
||||
preview_layout->addWidget(preview_format_field_, row, 1, 1, 2);
|
||||
|
||||
/* TEMP: Disable sequence auto-cache, wanna see if clip cache supersedes it.
|
||||
row++;
|
||||
preview_layout->addWidget(new QLabel(tr("Auto-Cache:")), row, 0);
|
||||
preview_layout->addWidget(preview_autocache_field_, row, 1);*/
|
||||
preview_autocache_field_ = new QCheckBox();
|
||||
preview_autocache_field_ = new QCheckBox();
|
||||
|
||||
layout->addWidget(preview_group);
|
||||
layout->addWidget(preview_group);
|
||||
|
||||
// Set values based on input sequence
|
||||
VideoParams vp = sequence->GetVideoParams();
|
||||
AudioParams ap = sequence->GetAudioParams();
|
||||
width_slider_->SetValue(vp.width());
|
||||
height_slider_->SetValue(vp.height());
|
||||
framerate_combo_->SetFrameRate(vp.time_base().flipped());
|
||||
pixelaspect_combo_->SetPixelAspectRatio(vp.pixel_aspect_ratio());
|
||||
interlacing_combo_->SetInterlaceMode(vp.interlacing());
|
||||
preview_resolution_field_->SetDivider(vp.divider());
|
||||
preview_format_field_->SetPixelFormat(vp.format());
|
||||
preview_autocache_field_->setChecked(sequence->IsVideoAutoCacheEnabled());
|
||||
audio_sample_rate_field_->SetSampleRate(ap.sample_rate());
|
||||
audio_channels_field_->SetChannelLayout(ap.channel_layout());
|
||||
// Set values based on input sequence
|
||||
VideoParams vp = sequence->GetVideoParams();
|
||||
AudioParams ap = sequence->GetAudioParams();
|
||||
width_slider_->SetValue(vp.width());
|
||||
height_slider_->SetValue(vp.height());
|
||||
framerate_combo_->SetFrameRate(vp.time_base().flipped());
|
||||
pixelaspect_combo_->SetPixelAspectRatio(vp.pixel_aspect_ratio());
|
||||
interlacing_combo_->SetInterlaceMode(vp.interlacing());
|
||||
preview_resolution_field_->SetDivider(vp.divider());
|
||||
preview_format_field_->SetPixelFormat(vp.format());
|
||||
preview_autocache_field_->setChecked(sequence->IsVideoAutoCacheEnabled());
|
||||
audio_sample_rate_field_->SetSampleRate(ap.sample_rate());
|
||||
audio_channels_field_->SetChannelLayout(ap.channel_layout());
|
||||
|
||||
connect(preview_resolution_field_, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||
this, &SequenceDialogParameterTab::UpdatePreviewResolutionLabel);
|
||||
connect(
|
||||
preview_resolution_field_,
|
||||
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||
this, &SequenceDialogParameterTab::UpdatePreviewResolutionLabel);
|
||||
|
||||
layout->addStretch();
|
||||
layout->addStretch();
|
||||
|
||||
QPushButton* save_preset_btn = new QPushButton(tr("Save Preset"));
|
||||
connect(save_preset_btn, &QPushButton::clicked, this, &SequenceDialogParameterTab::SavePresetClicked);
|
||||
layout->addWidget(save_preset_btn);
|
||||
QPushButton *save_preset_btn = new QPushButton(tr("Save Preset"));
|
||||
connect(save_preset_btn, &QPushButton::clicked, this,
|
||||
&SequenceDialogParameterTab::SavePresetClicked);
|
||||
layout->addWidget(save_preset_btn);
|
||||
|
||||
UpdatePreviewResolutionLabel();
|
||||
UpdatePreviewResolutionLabel();
|
||||
}
|
||||
|
||||
void SequenceDialogParameterTab::PresetChanged(const SequencePreset &preset)
|
||||
{
|
||||
width_slider_->SetValue(preset.width());
|
||||
height_slider_->SetValue(preset.height());
|
||||
framerate_combo_->SetFrameRate(preset.frame_rate());
|
||||
pixelaspect_combo_->SetPixelAspectRatio(preset.pixel_aspect());
|
||||
interlacing_combo_->SetInterlaceMode(preset.interlacing());
|
||||
audio_sample_rate_field_->SetSampleRate(preset.sample_rate());
|
||||
audio_channels_field_->SetChannelLayout(preset.channel_layout());
|
||||
preview_resolution_field_->SetDivider(preset.preview_divider());
|
||||
preview_format_field_->SetPixelFormat(preset.preview_format());
|
||||
preview_autocache_field_->setChecked(preset.preview_autocache());
|
||||
width_slider_->SetValue(preset.width());
|
||||
height_slider_->SetValue(preset.height());
|
||||
framerate_combo_->SetFrameRate(preset.frame_rate());
|
||||
pixelaspect_combo_->SetPixelAspectRatio(preset.pixel_aspect());
|
||||
interlacing_combo_->SetInterlaceMode(preset.interlacing());
|
||||
audio_sample_rate_field_->SetSampleRate(preset.sample_rate());
|
||||
audio_channels_field_->SetChannelLayout(preset.channel_layout());
|
||||
preview_resolution_field_->SetDivider(preset.preview_divider());
|
||||
preview_format_field_->SetPixelFormat(preset.preview_format());
|
||||
preview_autocache_field_->setChecked(preset.preview_autocache());
|
||||
}
|
||||
|
||||
void SequenceDialogParameterTab::SavePresetClicked()
|
||||
{
|
||||
AVChannelLayout layout=GetSelectedAudioChannelLayout();
|
||||
emit SaveParametersAsPreset(SequencePreset(QString(),
|
||||
GetSelectedVideoWidth(),
|
||||
GetSelectedVideoHeight(),
|
||||
GetSelectedVideoFrameRate(),
|
||||
GetSelectedVideoPixelAspect(),
|
||||
GetSelectedVideoInterlacingMode(),
|
||||
GetSelectedAudioSampleRate(),
|
||||
layout,
|
||||
GetSelectedPreviewResolution(),
|
||||
GetSelectedPreviewFormat(),
|
||||
GetSelectedPreviewAutoCache()));
|
||||
av_channel_layout_uninit(&layout);
|
||||
AVChannelLayout layout = GetSelectedAudioChannelLayout();
|
||||
emit SaveParametersAsPreset(SequencePreset(
|
||||
QString(), GetSelectedVideoWidth(), GetSelectedVideoHeight(),
|
||||
GetSelectedVideoFrameRate(), GetSelectedVideoPixelAspect(),
|
||||
GetSelectedVideoInterlacingMode(), GetSelectedAudioSampleRate(), layout,
|
||||
GetSelectedPreviewResolution(), GetSelectedPreviewFormat(),
|
||||
GetSelectedPreviewAutoCache()));
|
||||
av_channel_layout_uninit(&layout);
|
||||
}
|
||||
|
||||
void SequenceDialogParameterTab::UpdatePreviewResolutionLabel()
|
||||
{
|
||||
VideoParams test_param(GetSelectedVideoWidth(),
|
||||
GetSelectedVideoHeight(),
|
||||
PixelFormat::INVALID,
|
||||
VideoParams::kInternalChannelCount,
|
||||
rational(1),
|
||||
VideoParams::kInterlaceNone,
|
||||
preview_resolution_field_->currentData().toInt());
|
||||
VideoParams test_param(GetSelectedVideoWidth(), GetSelectedVideoHeight(),
|
||||
PixelFormat::INVALID,
|
||||
VideoParams::kInternalChannelCount, rational(1),
|
||||
VideoParams::kInterlaceNone,
|
||||
preview_resolution_field_->currentData().toInt());
|
||||
|
||||
preview_resolution_label_->setText(tr("(%1x%2)").arg(QString::number(test_param.effective_width()),
|
||||
QString::number(test_param.effective_height())));
|
||||
preview_resolution_label_->setText(
|
||||
tr("(%1x%2)").arg(QString::number(test_param.effective_width()),
|
||||
QString::number(test_param.effective_height())));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,97 +11,99 @@
|
||||
#include "widget/slider/integerslider.h"
|
||||
#include "widget/standardcombos/standardcombos.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
class SequenceDialogParameterTab : public QWidget
|
||||
namespace olive
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
class SequenceDialogParameterTab : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SequenceDialogParameterTab(Sequence* sequence, QWidget* parent = nullptr);
|
||||
SequenceDialogParameterTab(Sequence *sequence, QWidget *parent = nullptr);
|
||||
|
||||
int GetSelectedVideoWidth() const
|
||||
{
|
||||
return width_slider_->GetValue();
|
||||
}
|
||||
int GetSelectedVideoWidth() const
|
||||
{
|
||||
return width_slider_->GetValue();
|
||||
}
|
||||
|
||||
int GetSelectedVideoHeight() const
|
||||
{
|
||||
return height_slider_->GetValue();
|
||||
}
|
||||
int GetSelectedVideoHeight() const
|
||||
{
|
||||
return height_slider_->GetValue();
|
||||
}
|
||||
|
||||
rational GetSelectedVideoFrameRate() const
|
||||
{
|
||||
return framerate_combo_->GetFrameRate();
|
||||
}
|
||||
rational GetSelectedVideoFrameRate() const
|
||||
{
|
||||
return framerate_combo_->GetFrameRate();
|
||||
}
|
||||
|
||||
rational GetSelectedVideoPixelAspect() const
|
||||
{
|
||||
return pixelaspect_combo_->GetPixelAspectRatio();
|
||||
}
|
||||
rational GetSelectedVideoPixelAspect() const
|
||||
{
|
||||
return pixelaspect_combo_->GetPixelAspectRatio();
|
||||
}
|
||||
|
||||
VideoParams::Interlacing GetSelectedVideoInterlacingMode() const
|
||||
{
|
||||
return interlacing_combo_->GetInterlaceMode();
|
||||
}
|
||||
VideoParams::Interlacing GetSelectedVideoInterlacingMode() const
|
||||
{
|
||||
return interlacing_combo_->GetInterlaceMode();
|
||||
}
|
||||
|
||||
int GetSelectedAudioSampleRate() const { return audio_sample_rate_field_->GetSampleRate(); }
|
||||
int GetSelectedAudioSampleRate() const
|
||||
{
|
||||
return audio_sample_rate_field_->GetSampleRate();
|
||||
}
|
||||
|
||||
[[nodiscard]] AVChannelLayout GetSelectedAudioChannelLayout() const
|
||||
{
|
||||
return audio_channels_field_->GetChannelLayout();
|
||||
}
|
||||
[[nodiscard]] AVChannelLayout GetSelectedAudioChannelLayout() const
|
||||
{
|
||||
return audio_channels_field_->GetChannelLayout();
|
||||
}
|
||||
|
||||
int GetSelectedPreviewResolution() const
|
||||
{
|
||||
return preview_resolution_field_->GetDivider();
|
||||
}
|
||||
int GetSelectedPreviewResolution() const
|
||||
{
|
||||
return preview_resolution_field_->GetDivider();
|
||||
}
|
||||
|
||||
PixelFormat GetSelectedPreviewFormat() const
|
||||
{
|
||||
return preview_format_field_->GetPixelFormat();
|
||||
}
|
||||
PixelFormat GetSelectedPreviewFormat() const
|
||||
{
|
||||
return preview_format_field_->GetPixelFormat();
|
||||
}
|
||||
|
||||
bool GetSelectedPreviewAutoCache() const
|
||||
{
|
||||
//return preview_autocache_field_->isChecked();
|
||||
// TEMP: Disable sequence auto-cache, wanna see if clip cache supersedes it.
|
||||
return false;
|
||||
}
|
||||
bool GetSelectedPreviewAutoCache() const
|
||||
{
|
||||
//return preview_autocache_field_->isChecked();
|
||||
// TEMP: Disable sequence auto-cache, wanna see if clip cache supersedes it.
|
||||
return false;
|
||||
}
|
||||
|
||||
public slots:
|
||||
void PresetChanged(const SequencePreset& preset);
|
||||
void PresetChanged(const SequencePreset &preset);
|
||||
|
||||
signals:
|
||||
void SaveParametersAsPreset(const SequencePreset& preset);
|
||||
void SaveParametersAsPreset(const SequencePreset &preset);
|
||||
|
||||
private:
|
||||
IntegerSlider *width_slider_;
|
||||
IntegerSlider *width_slider_;
|
||||
|
||||
IntegerSlider *height_slider_;
|
||||
IntegerSlider *height_slider_;
|
||||
|
||||
FrameRateComboBox *framerate_combo_;
|
||||
FrameRateComboBox *framerate_combo_;
|
||||
|
||||
PixelAspectRatioComboBox *pixelaspect_combo_;
|
||||
PixelAspectRatioComboBox *pixelaspect_combo_;
|
||||
|
||||
InterlacedComboBox *interlacing_combo_;
|
||||
InterlacedComboBox *interlacing_combo_;
|
||||
|
||||
SampleRateComboBox* audio_sample_rate_field_;
|
||||
SampleRateComboBox *audio_sample_rate_field_;
|
||||
|
||||
ChannelLayoutComboBox* audio_channels_field_;
|
||||
ChannelLayoutComboBox *audio_channels_field_;
|
||||
|
||||
VideoDividerComboBox* preview_resolution_field_;
|
||||
VideoDividerComboBox *preview_resolution_field_;
|
||||
|
||||
QLabel* preview_resolution_label_;
|
||||
QLabel *preview_resolution_label_;
|
||||
|
||||
PixelFormatComboBox* preview_format_field_;
|
||||
PixelFormatComboBox *preview_format_field_;
|
||||
|
||||
QCheckBox *preview_autocache_field_;
|
||||
QCheckBox *preview_autocache_field_;
|
||||
|
||||
private slots:
|
||||
void SavePresetClicked();
|
||||
|
||||
void UpdatePreviewResolutionLabel();
|
||||
void SavePresetClicked();
|
||||
|
||||
void UpdatePreviewResolutionLabel();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -35,279 +35,269 @@
|
||||
#include "ui/icons/icons.h"
|
||||
#include "widget/menu/menu.h"
|
||||
|
||||
namespace olive {
|
||||
namespace olive
|
||||
{
|
||||
|
||||
const int kDataIsPreset = Qt::UserRole;
|
||||
const int kDataPresetIsCustomRole = Qt::UserRole + 1;
|
||||
const int kDataPresetDataRole = Qt::UserRole + 2;
|
||||
|
||||
SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget* parent) :
|
||||
QWidget(parent),
|
||||
PresetManager<SequencePreset>(this, QStringLiteral("sequencepresets"))
|
||||
SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, PresetManager<SequencePreset>(this, QStringLiteral("sequencepresets"))
|
||||
{
|
||||
QVBoxLayout* outer_layout = new QVBoxLayout(this);
|
||||
outer_layout->setContentsMargins(0, 0, 0, 0);
|
||||
QVBoxLayout *outer_layout = new QVBoxLayout(this);
|
||||
outer_layout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
preset_tree_ = new QTreeWidget();
|
||||
preset_tree_->setColumnCount(1);
|
||||
preset_tree_->setHeaderLabel(tr("Preset"));
|
||||
preset_tree_->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(preset_tree_, &QTreeWidget::customContextMenuRequested, this, &SequenceDialogPresetTab::ShowContextMenu);
|
||||
outer_layout->addWidget(preset_tree_);
|
||||
connect(preset_tree_, &QTreeWidget::currentItemChanged, this, &SequenceDialogPresetTab::SelectedItemChanged);
|
||||
connect(preset_tree_, &QTreeWidget::itemDoubleClicked, this, &SequenceDialogPresetTab::ItemDoubleClicked);
|
||||
preset_tree_ = new QTreeWidget();
|
||||
preset_tree_->setColumnCount(1);
|
||||
preset_tree_->setHeaderLabel(tr("Preset"));
|
||||
preset_tree_->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(preset_tree_, &QTreeWidget::customContextMenuRequested, this,
|
||||
&SequenceDialogPresetTab::ShowContextMenu);
|
||||
outer_layout->addWidget(preset_tree_);
|
||||
connect(preset_tree_, &QTreeWidget::currentItemChanged, this,
|
||||
&SequenceDialogPresetTab::SelectedItemChanged);
|
||||
connect(preset_tree_, &QTreeWidget::itemDoubleClicked, this,
|
||||
&SequenceDialogPresetTab::ItemDoubleClicked);
|
||||
|
||||
// Add "my presets" folder
|
||||
my_presets_folder_ = CreateFolder(tr("My Presets"));
|
||||
preset_tree_->addTopLevelItem(my_presets_folder_);
|
||||
// Add "my presets" folder
|
||||
my_presets_folder_ = CreateFolder(tr("My Presets"));
|
||||
preset_tree_->addTopLevelItem(my_presets_folder_);
|
||||
|
||||
// Add presets
|
||||
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("4K UHD"), 3840, 2160, 2));
|
||||
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("1080p"), 1920, 1080, 1));
|
||||
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("720p"), 1280, 720, 1));
|
||||
// Add presets
|
||||
preset_tree_->addTopLevelItem(
|
||||
CreateHDPresetFolder(tr("4K UHD"), 3840, 2160, 2));
|
||||
preset_tree_->addTopLevelItem(
|
||||
CreateHDPresetFolder(tr("1080p"), 1920, 1080, 1));
|
||||
preset_tree_->addTopLevelItem(
|
||||
CreateHDPresetFolder(tr("720p"), 1280, 720, 1));
|
||||
|
||||
preset_tree_->addTopLevelItem(CreateSDPresetFolder(tr("NTSC"), 720, 480, rational(30000, 1001),
|
||||
VideoParams::kPixelAspectNTSCStandard,
|
||||
VideoParams::kPixelAspectNTSCWidescreen, 1));
|
||||
preset_tree_->addTopLevelItem(CreateSDPresetFolder(tr("PAL"), 720, 576, rational(25, 1),
|
||||
VideoParams::kPixelAspectPALStandard,
|
||||
VideoParams::kPixelAspectPALWidescreen, 1));
|
||||
preset_tree_->addTopLevelItem(
|
||||
CreateSDPresetFolder(tr("NTSC"), 720, 480, rational(30000, 1001),
|
||||
VideoParams::kPixelAspectNTSCStandard,
|
||||
VideoParams::kPixelAspectNTSCWidescreen, 1));
|
||||
preset_tree_->addTopLevelItem(
|
||||
CreateSDPresetFolder(tr("PAL"), 720, 576, rational(25, 1),
|
||||
VideoParams::kPixelAspectPALStandard,
|
||||
VideoParams::kPixelAspectPALWidescreen, 1));
|
||||
|
||||
// Load custom presets
|
||||
for (int i=0;i<GetNumberOfPresets();i++) {
|
||||
AddCustomItem(my_presets_folder_, GetPreset(i), i);
|
||||
}
|
||||
// Load custom presets
|
||||
for (int i = 0; i < GetNumberOfPresets(); i++) {
|
||||
AddCustomItem(my_presets_folder_, GetPreset(i), i);
|
||||
}
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::SaveParametersAsPreset(SequencePreset preset)
|
||||
{
|
||||
PresetPtr preset_ptr = std::make_shared<SequencePreset>(preset);
|
||||
PresetPtr preset_ptr = std::make_shared<SequencePreset>(preset);
|
||||
|
||||
// If replaced, no need to make another item. If not saved, shared ptr will delete itself
|
||||
if (SavePreset(preset_ptr) == kAppended) {
|
||||
AddCustomItem(my_presets_folder_, preset_ptr, GetNumberOfPresets() - 1);
|
||||
}
|
||||
// If replaced, no need to make another item. If not saved, shared ptr will delete itself
|
||||
if (SavePreset(preset_ptr) == kAppended) {
|
||||
AddCustomItem(my_presets_folder_, preset_ptr, GetNumberOfPresets() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
QTreeWidgetItem* SequenceDialogPresetTab::CreateFolder(const QString &name)
|
||||
QTreeWidgetItem *SequenceDialogPresetTab::CreateFolder(const QString &name)
|
||||
{
|
||||
QTreeWidgetItem* folder = new QTreeWidgetItem();
|
||||
folder->setText(0, name);
|
||||
folder->setIcon(0, icon::Folder);
|
||||
return folder;
|
||||
QTreeWidgetItem *folder = new QTreeWidgetItem();
|
||||
folder->setText(0, name);
|
||||
folder->setIcon(0, icon::Folder);
|
||||
return folder;
|
||||
}
|
||||
|
||||
QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &name, int width, int height, int divider)
|
||||
QTreeWidgetItem *
|
||||
SequenceDialogPresetTab::CreateHDPresetFolder(const QString &name, int width,
|
||||
int height, int divider)
|
||||
{
|
||||
const PixelFormat default_format = static_cast<PixelFormat::Format>(OLIVE_CONFIG("OfflinePixelFormat").toInt());
|
||||
const bool default_autocache = false;
|
||||
QTreeWidgetItem* parent = CreateFolder(name);
|
||||
AVChannelLayout layout;
|
||||
av_channel_layout_from_mask(&layout, AV_CH_LAYOUT_STEREO);
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 23.976 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(24000, 1001),
|
||||
VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone,
|
||||
48000,
|
||||
layout,
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 25 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(25, 1),
|
||||
VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone,
|
||||
48000,
|
||||
layout,
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 29.97 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(30000, 1001),
|
||||
VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone,
|
||||
48000,
|
||||
layout,
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 50 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(50, 1),
|
||||
VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone,
|
||||
48000,
|
||||
layout,
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 59.94 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(60000, 1001),
|
||||
VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone,
|
||||
48000,
|
||||
layout,
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
av_channel_layout_uninit(&layout);
|
||||
return parent;
|
||||
const PixelFormat default_format = static_cast<PixelFormat::Format>(
|
||||
OLIVE_CONFIG("OfflinePixelFormat").toInt());
|
||||
const bool default_autocache = false;
|
||||
QTreeWidgetItem *parent = CreateFolder(name);
|
||||
AVChannelLayout layout;
|
||||
av_channel_layout_from_mask(&layout, AV_CH_LAYOUT_STEREO);
|
||||
AddStandardItem(parent,
|
||||
std::make_shared<SequencePreset>(
|
||||
tr("%1 23.976 FPS").arg(name), width, height,
|
||||
rational(24000, 1001), VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone, 48000, layout, divider,
|
||||
default_format, default_autocache));
|
||||
AddStandardItem(parent,
|
||||
std::make_shared<SequencePreset>(
|
||||
tr("%1 25 FPS").arg(name), width, height,
|
||||
rational(25, 1), VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone, 48000, layout, divider,
|
||||
default_format, default_autocache));
|
||||
AddStandardItem(parent,
|
||||
std::make_shared<SequencePreset>(
|
||||
tr("%1 29.97 FPS").arg(name), width, height,
|
||||
rational(30000, 1001), VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone, 48000, layout, divider,
|
||||
default_format, default_autocache));
|
||||
AddStandardItem(parent,
|
||||
std::make_shared<SequencePreset>(
|
||||
tr("%1 50 FPS").arg(name), width, height,
|
||||
rational(50, 1), VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone, 48000, layout, divider,
|
||||
default_format, default_autocache));
|
||||
AddStandardItem(parent,
|
||||
std::make_shared<SequencePreset>(
|
||||
tr("%1 59.94 FPS").arg(name), width, height,
|
||||
rational(60000, 1001), VideoParams::kPixelAspectSquare,
|
||||
VideoParams::kInterlaceNone, 48000, layout, divider,
|
||||
default_format, default_autocache));
|
||||
av_channel_layout_uninit(&layout);
|
||||
return parent;
|
||||
}
|
||||
|
||||
QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &name, int width, int height, const rational& frame_rate, const rational &standard_par, const rational &wide_par, int divider)
|
||||
QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(
|
||||
const QString &name, int width, int height, const rational &frame_rate,
|
||||
const rational &standard_par, const rational &wide_par, int divider)
|
||||
{
|
||||
const PixelFormat default_format = static_cast<PixelFormat::Format>(OLIVE_CONFIG("OfflinePixelFormat").toInt());
|
||||
const bool default_autocache = false;
|
||||
QTreeWidgetItem* parent = CreateFolder(name);
|
||||
preset_tree_->addTopLevelItem(parent);
|
||||
AVChannelLayout layout;
|
||||
av_channel_layout_from_mask(&layout,AV_CH_LAYOUT_STEREO);
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 Standard").arg(name),
|
||||
width,
|
||||
height,
|
||||
frame_rate,
|
||||
standard_par,
|
||||
VideoParams::kInterlacedBottomFirst,
|
||||
48000,
|
||||
layout,
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 Widescreen").arg(name),
|
||||
width,
|
||||
height,
|
||||
frame_rate,
|
||||
wide_par,
|
||||
VideoParams::kInterlacedBottomFirst,
|
||||
48000,
|
||||
layout,
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
av_channel_layout_uninit(&layout);
|
||||
return parent;
|
||||
const PixelFormat default_format = static_cast<PixelFormat::Format>(
|
||||
OLIVE_CONFIG("OfflinePixelFormat").toInt());
|
||||
const bool default_autocache = false;
|
||||
QTreeWidgetItem *parent = CreateFolder(name);
|
||||
preset_tree_->addTopLevelItem(parent);
|
||||
AVChannelLayout layout;
|
||||
av_channel_layout_from_mask(&layout, AV_CH_LAYOUT_STEREO);
|
||||
AddStandardItem(
|
||||
parent, std::make_shared<SequencePreset>(
|
||||
tr("%1 Standard").arg(name), width, height, frame_rate,
|
||||
standard_par, VideoParams::kInterlacedBottomFirst, 48000,
|
||||
layout, divider, default_format, default_autocache));
|
||||
AddStandardItem(
|
||||
parent, std::make_shared<SequencePreset>(
|
||||
tr("%1 Widescreen").arg(name), width, height, frame_rate,
|
||||
wide_par, VideoParams::kInterlacedBottomFirst, 48000,
|
||||
layout, divider, default_format, default_autocache));
|
||||
av_channel_layout_uninit(&layout);
|
||||
return parent;
|
||||
}
|
||||
|
||||
QTreeWidgetItem *SequenceDialogPresetTab::GetSelectedItem()
|
||||
{
|
||||
QList<QTreeWidgetItem*> selected_items = preset_tree_->selectedItems();
|
||||
QList<QTreeWidgetItem *> selected_items = preset_tree_->selectedItems();
|
||||
|
||||
if (selected_items.isEmpty()) {
|
||||
return nullptr;
|
||||
} else {
|
||||
return selected_items.first();
|
||||
}
|
||||
if (selected_items.isEmpty()) {
|
||||
return nullptr;
|
||||
} else {
|
||||
return selected_items.first();
|
||||
}
|
||||
}
|
||||
|
||||
QTreeWidgetItem *SequenceDialogPresetTab::GetSelectedCustomPreset()
|
||||
{
|
||||
QTreeWidgetItem* sel = GetSelectedItem();
|
||||
QTreeWidgetItem *sel = GetSelectedItem();
|
||||
|
||||
if (sel
|
||||
&& sel->data(0, kDataIsPreset).toBool()
|
||||
&& sel->data(0, kDataPresetIsCustomRole).toBool()) {
|
||||
return sel;
|
||||
}
|
||||
if (sel && sel->data(0, kDataIsPreset).toBool() &&
|
||||
sel->data(0, kDataPresetIsCustomRole).toBool()) {
|
||||
return sel;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::AddStandardItem(QTreeWidgetItem *folder, PresetPtr preset, const QString& description)
|
||||
void SequenceDialogPresetTab::AddStandardItem(QTreeWidgetItem *folder,
|
||||
PresetPtr preset,
|
||||
const QString &description)
|
||||
{
|
||||
int index = default_preset_data_.size();
|
||||
default_preset_data_.append(preset);
|
||||
AddItemInternal(folder, preset, false, index, description);
|
||||
int index = default_preset_data_.size();
|
||||
default_preset_data_.append(preset);
|
||||
AddItemInternal(folder, preset, false, index, description);
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::AddCustomItem(QTreeWidgetItem *folder, PresetPtr preset, int index, const QString &description)
|
||||
void SequenceDialogPresetTab::AddCustomItem(QTreeWidgetItem *folder,
|
||||
PresetPtr preset, int index,
|
||||
const QString &description)
|
||||
{
|
||||
AddItemInternal(folder, preset, true, index, description);
|
||||
AddItemInternal(folder, preset, true, index, description);
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::AddItemInternal(QTreeWidgetItem *folder, PresetPtr preset, bool is_custom, int index, const QString &description)
|
||||
void SequenceDialogPresetTab::AddItemInternal(QTreeWidgetItem *folder,
|
||||
PresetPtr preset, bool is_custom,
|
||||
int index,
|
||||
const QString &description)
|
||||
{
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
||||
|
||||
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);
|
||||
item->setData(0, kDataPresetDataRole, index);
|
||||
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);
|
||||
item->setData(0, kDataPresetDataRole, index);
|
||||
|
||||
folder->addChild(item);
|
||||
folder->addChild(item);
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::SelectedItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous)
|
||||
void SequenceDialogPresetTab::SelectedItemChanged(QTreeWidgetItem *current,
|
||||
QTreeWidgetItem *previous)
|
||||
{
|
||||
Q_UNUSED(previous)
|
||||
Q_UNUSED(previous)
|
||||
|
||||
if (current->data(0, kDataIsPreset).toBool()) {
|
||||
int preset_index = current->data(0, kDataPresetDataRole).toInt();
|
||||
if (current->data(0, kDataIsPreset).toBool()) {
|
||||
int preset_index = current->data(0, kDataPresetDataRole).toInt();
|
||||
|
||||
PresetPtr preset_data = (current->data(0, kDataPresetIsCustomRole).toBool())
|
||||
? GetPreset(preset_index)
|
||||
: default_preset_data_.at(preset_index);
|
||||
PresetPtr preset_data =
|
||||
(current->data(0, kDataPresetIsCustomRole).toBool()) ?
|
||||
GetPreset(preset_index) :
|
||||
default_preset_data_.at(preset_index);
|
||||
|
||||
emit PresetChanged(*static_cast<SequencePreset*>(preset_data.get()));
|
||||
}
|
||||
emit PresetChanged(*static_cast<SequencePreset *>(preset_data.get()));
|
||||
}
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::ItemDoubleClicked(QTreeWidgetItem *item, int column)
|
||||
void SequenceDialogPresetTab::ItemDoubleClicked(QTreeWidgetItem *item,
|
||||
int column)
|
||||
{
|
||||
Q_UNUSED(column)
|
||||
Q_UNUSED(column)
|
||||
|
||||
if (item->data(0, kDataIsPreset).toBool()) {
|
||||
emit PresetAccepted();
|
||||
}
|
||||
if (item->data(0, kDataIsPreset).toBool()) {
|
||||
emit PresetAccepted();
|
||||
}
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::ShowContextMenu()
|
||||
{
|
||||
QTreeWidgetItem* sel = GetSelectedCustomPreset();
|
||||
QTreeWidgetItem *sel = GetSelectedCustomPreset();
|
||||
|
||||
if (sel) {
|
||||
Menu m(this);
|
||||
if (sel) {
|
||||
Menu m(this);
|
||||
|
||||
QAction* delete_action = m.addAction(tr("Delete Preset"));
|
||||
connect(delete_action, &QAction::triggered, this, &SequenceDialogPresetTab::DeleteSelectedPreset);
|
||||
QAction *delete_action = m.addAction(tr("Delete Preset"));
|
||||
connect(delete_action, &QAction::triggered, this,
|
||||
&SequenceDialogPresetTab::DeleteSelectedPreset);
|
||||
|
||||
m.exec(QCursor::pos());
|
||||
}
|
||||
m.exec(QCursor::pos());
|
||||
}
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::DeleteSelectedPreset()
|
||||
{
|
||||
QTreeWidgetItem* sel = GetSelectedCustomPreset();
|
||||
QTreeWidgetItem *sel = GetSelectedCustomPreset();
|
||||
|
||||
if (sel) {
|
||||
int preset_index = sel->data(0, kDataPresetDataRole).toInt();
|
||||
if (sel) {
|
||||
int preset_index = sel->data(0, kDataPresetDataRole).toInt();
|
||||
|
||||
// Shift all items whose index was after this preset forward
|
||||
for (int i=0; i<my_presets_folder_->childCount(); i++) {
|
||||
QTreeWidgetItem* custom_item = my_presets_folder_->child(i);
|
||||
int this_item_index = custom_item->data(0, kDataPresetDataRole).toInt();
|
||||
// Shift all items whose index was after this preset forward
|
||||
for (int i = 0; i < my_presets_folder_->childCount(); i++) {
|
||||
QTreeWidgetItem *custom_item = my_presets_folder_->child(i);
|
||||
int this_item_index =
|
||||
custom_item->data(0, kDataPresetDataRole).toInt();
|
||||
|
||||
if (this_item_index > preset_index) {
|
||||
custom_item->setData(0, kDataPresetDataRole, this_item_index - 1);
|
||||
}
|
||||
}
|
||||
if (this_item_index > preset_index) {
|
||||
custom_item->setData(0, kDataPresetDataRole,
|
||||
this_item_index - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the preset
|
||||
DeletePreset(preset_index);
|
||||
// Remove the preset
|
||||
DeletePreset(preset_index);
|
||||
|
||||
// Delete the item
|
||||
delete sel;
|
||||
}
|
||||
// Delete the item
|
||||
delete sel;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -28,53 +28,61 @@
|
||||
#include "presetmanager.h"
|
||||
#include "sequencepreset.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
class SequenceDialogPresetTab : public QWidget, public PresetManager<SequencePreset>
|
||||
namespace olive
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
class SequenceDialogPresetTab : public QWidget,
|
||||
public PresetManager<SequencePreset> {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SequenceDialogPresetTab(QWidget* parent = nullptr);
|
||||
SequenceDialogPresetTab(QWidget *parent = nullptr);
|
||||
|
||||
public slots:
|
||||
void SaveParametersAsPreset(SequencePreset preset);
|
||||
void SaveParametersAsPreset(SequencePreset preset);
|
||||
|
||||
signals:
|
||||
void PresetChanged(const SequencePreset& preset);
|
||||
void PresetChanged(const SequencePreset &preset);
|
||||
|
||||
void PresetAccepted();
|
||||
void PresetAccepted();
|
||||
|
||||
private:
|
||||
QTreeWidgetItem *CreateFolder(const QString& name);
|
||||
QTreeWidgetItem *CreateFolder(const QString &name);
|
||||
|
||||
QTreeWidgetItem *CreateHDPresetFolder(const QString& name, int width, int height, int divider);
|
||||
QTreeWidgetItem *CreateHDPresetFolder(const QString &name, int width,
|
||||
int height, int divider);
|
||||
|
||||
QTreeWidgetItem *CreateSDPresetFolder(const QString& name, int width, int height, const rational &frame_rate, const rational& standard_par, const rational& wide_par, int divider);
|
||||
QTreeWidgetItem *CreateSDPresetFolder(
|
||||
const QString &name, int width, int height, const rational &frame_rate,
|
||||
const rational &standard_par, const rational &wide_par, int divider);
|
||||
|
||||
QTreeWidgetItem* GetSelectedItem();
|
||||
QTreeWidgetItem* GetSelectedCustomPreset();
|
||||
QTreeWidgetItem *GetSelectedItem();
|
||||
QTreeWidgetItem *GetSelectedCustomPreset();
|
||||
|
||||
void AddStandardItem(QTreeWidgetItem* folder, PresetPtr preset, const QString &description = QString());
|
||||
void AddStandardItem(QTreeWidgetItem *folder, PresetPtr preset,
|
||||
const QString &description = QString());
|
||||
|
||||
void AddCustomItem(QTreeWidgetItem* folder, PresetPtr preset, int index, 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());
|
||||
void AddItemInternal(QTreeWidgetItem *folder, PresetPtr preset,
|
||||
bool is_custom, int index,
|
||||
const QString &description = QString());
|
||||
|
||||
QTreeWidget* preset_tree_;
|
||||
QTreeWidget *preset_tree_;
|
||||
|
||||
QTreeWidgetItem* my_presets_folder_;
|
||||
QTreeWidgetItem *my_presets_folder_;
|
||||
|
||||
QVector<PresetPtr> default_preset_data_;
|
||||
QVector<PresetPtr> default_preset_data_;
|
||||
|
||||
private slots:
|
||||
void SelectedItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||
void SelectedItemChanged(QTreeWidgetItem *current,
|
||||
QTreeWidgetItem *previous);
|
||||
|
||||
void ItemDoubleClicked(QTreeWidgetItem *item, int column);
|
||||
void ItemDoubleClicked(QTreeWidgetItem *item, int column);
|
||||
|
||||
void ShowContextMenu();
|
||||
|
||||
void DeleteSelectedPreset();
|
||||
void ShowContextMenu();
|
||||
|
||||
void DeleteSelectedPreset();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -28,145 +28,156 @@
|
||||
#include "dialog/sequence/presetmanager.h"
|
||||
#include "render/videoparams.h"
|
||||
|
||||
namespace olive {
|
||||
namespace olive
|
||||
{
|
||||
|
||||
class SequencePreset : public Preset {
|
||||
public:
|
||||
SequencePreset() = default;
|
||||
SequencePreset() = default;
|
||||
|
||||
SequencePreset(const QString& name,
|
||||
int width,
|
||||
int height,
|
||||
const rational& frame_rate,
|
||||
const rational& pixel_aspect,
|
||||
VideoParams::Interlacing interlacing,
|
||||
int sample_rate,
|
||||
AVChannelLayout &channel_layout,
|
||||
int preview_divider,
|
||||
PixelFormat preview_format,
|
||||
bool preview_autocache) :
|
||||
width_(width),
|
||||
height_(height),
|
||||
frame_rate_(frame_rate),
|
||||
pixel_aspect_(pixel_aspect),
|
||||
interlacing_(interlacing),
|
||||
sample_rate_(sample_rate),
|
||||
channel_layout_(channel_layout),
|
||||
preview_divider_(preview_divider),
|
||||
preview_format_(preview_format),
|
||||
preview_autocache_(preview_autocache)
|
||||
{
|
||||
SetName(name);
|
||||
}
|
||||
SequencePreset(const QString &name, int width, int height,
|
||||
const rational &frame_rate, const rational &pixel_aspect,
|
||||
VideoParams::Interlacing interlacing, int sample_rate,
|
||||
AVChannelLayout &channel_layout, int preview_divider,
|
||||
PixelFormat preview_format, bool preview_autocache)
|
||||
: width_(width)
|
||||
, height_(height)
|
||||
, frame_rate_(frame_rate)
|
||||
, pixel_aspect_(pixel_aspect)
|
||||
, interlacing_(interlacing)
|
||||
, sample_rate_(sample_rate)
|
||||
, channel_layout_(channel_layout)
|
||||
, preview_divider_(preview_divider)
|
||||
, preview_format_(preview_format)
|
||||
, preview_autocache_(preview_autocache)
|
||||
{
|
||||
SetName(name);
|
||||
}
|
||||
|
||||
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().toStdString());
|
||||
} else if (reader->name() == QStringLiteral("pixelaspect")) {
|
||||
pixel_aspect_ = rational::fromString(reader->readElementText().toStdString());
|
||||
} else if (reader->name() == QStringLiteral("interlacing")) {
|
||||
interlacing_ = static_cast<VideoParams::Interlacing>(reader->readElementText().toInt());
|
||||
} else if (reader->name() == QStringLiteral("samplerate")) {
|
||||
sample_rate_ = reader->readElementText().toInt();
|
||||
} else if (reader->name() == QStringLiteral("chlayout")) {
|
||||
channel_layout_.u.mask = 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 if (reader->name() == QStringLiteral("autocache")) {
|
||||
preview_autocache_ = reader->readElementText().toInt();
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
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().toStdString());
|
||||
} else if (reader->name() == QStringLiteral("pixelaspect")) {
|
||||
pixel_aspect_ = rational::fromString(
|
||||
reader->readElementText().toStdString());
|
||||
} else if (reader->name() == QStringLiteral("interlacing")) {
|
||||
interlacing_ = static_cast<VideoParams::Interlacing>(
|
||||
reader->readElementText().toInt());
|
||||
} else if (reader->name() == QStringLiteral("samplerate")) {
|
||||
sample_rate_ = reader->readElementText().toInt();
|
||||
} else if (reader->name() == QStringLiteral("chlayout")) {
|
||||
channel_layout_.u.mask =
|
||||
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 if (reader->name() == QStringLiteral("autocache")) {
|
||||
preview_autocache_ = 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"), QString::fromStdString(frame_rate_.toString()));
|
||||
writer->writeTextElement(QStringLiteral("pixelaspect"), QString::fromStdString(pixel_aspect_.toString()));
|
||||
writer->writeTextElement(QStringLiteral("interlacing_"), QString::number(interlacing_));
|
||||
writer->writeTextElement(QStringLiteral("samplerate"), QString::number(sample_rate_));
|
||||
writer->writeTextElement(QStringLiteral("chlayout"), QString::number(channel_layout_.u.mask));
|
||||
writer->writeTextElement(QStringLiteral("divider"), QString::number(preview_divider_));
|
||||
writer->writeTextElement(QStringLiteral("format"), QString::number(preview_format_));
|
||||
writer->writeTextElement(QStringLiteral("autocache"), QString::number(preview_autocache_));
|
||||
}
|
||||
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"),
|
||||
QString::fromStdString(frame_rate_.toString()));
|
||||
writer->writeTextElement(
|
||||
QStringLiteral("pixelaspect"),
|
||||
QString::fromStdString(pixel_aspect_.toString()));
|
||||
writer->writeTextElement(QStringLiteral("interlacing_"),
|
||||
QString::number(interlacing_));
|
||||
writer->writeTextElement(QStringLiteral("samplerate"),
|
||||
QString::number(sample_rate_));
|
||||
writer->writeTextElement(QStringLiteral("chlayout"),
|
||||
QString::number(channel_layout_.u.mask));
|
||||
writer->writeTextElement(QStringLiteral("divider"),
|
||||
QString::number(preview_divider_));
|
||||
writer->writeTextElement(QStringLiteral("format"),
|
||||
QString::number(preview_format_));
|
||||
writer->writeTextElement(QStringLiteral("autocache"),
|
||||
QString::number(preview_autocache_));
|
||||
}
|
||||
|
||||
int width() const
|
||||
{
|
||||
return width_;
|
||||
}
|
||||
int width() const
|
||||
{
|
||||
return width_;
|
||||
}
|
||||
|
||||
int height() const
|
||||
{
|
||||
return height_;
|
||||
}
|
||||
int height() const
|
||||
{
|
||||
return height_;
|
||||
}
|
||||
|
||||
const rational& frame_rate() const
|
||||
{
|
||||
return frame_rate_;
|
||||
}
|
||||
const rational &frame_rate() const
|
||||
{
|
||||
return frame_rate_;
|
||||
}
|
||||
|
||||
const rational& pixel_aspect() const
|
||||
{
|
||||
return pixel_aspect_;
|
||||
}
|
||||
const rational &pixel_aspect() const
|
||||
{
|
||||
return pixel_aspect_;
|
||||
}
|
||||
|
||||
VideoParams::Interlacing interlacing() const
|
||||
{
|
||||
return interlacing_;
|
||||
}
|
||||
VideoParams::Interlacing interlacing() const
|
||||
{
|
||||
return interlacing_;
|
||||
}
|
||||
|
||||
int sample_rate() const
|
||||
{
|
||||
return sample_rate_;
|
||||
}
|
||||
int sample_rate() const
|
||||
{
|
||||
return sample_rate_;
|
||||
}
|
||||
|
||||
AVChannelLayout channel_layout() const
|
||||
{
|
||||
return channel_layout_;
|
||||
}
|
||||
AVChannelLayout channel_layout() const
|
||||
{
|
||||
return channel_layout_;
|
||||
}
|
||||
|
||||
int preview_divider() const
|
||||
{
|
||||
return preview_divider_;
|
||||
}
|
||||
int preview_divider() const
|
||||
{
|
||||
return preview_divider_;
|
||||
}
|
||||
|
||||
PixelFormat preview_format() const
|
||||
{
|
||||
return preview_format_;
|
||||
}
|
||||
PixelFormat preview_format() const
|
||||
{
|
||||
return preview_format_;
|
||||
}
|
||||
|
||||
bool preview_autocache() const
|
||||
{
|
||||
return preview_autocache_;
|
||||
}
|
||||
bool preview_autocache() const
|
||||
{
|
||||
return preview_autocache_;
|
||||
}
|
||||
|
||||
private:
|
||||
int width_;
|
||||
int height_;
|
||||
rational frame_rate_;
|
||||
rational pixel_aspect_;
|
||||
VideoParams::Interlacing interlacing_;
|
||||
int sample_rate_;
|
||||
AVChannelLayout channel_layout_;
|
||||
int preview_divider_;
|
||||
PixelFormat preview_format_;
|
||||
bool preview_autocache_;
|
||||
|
||||
int width_;
|
||||
int height_;
|
||||
rational frame_rate_;
|
||||
rational pixel_aspect_;
|
||||
VideoParams::Interlacing interlacing_;
|
||||
int sample_rate_;
|
||||
AVChannelLayout channel_layout_;
|
||||
int preview_divider_;
|
||||
PixelFormat preview_format_;
|
||||
bool preview_autocache_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user