change: change code style to Linux style except indent.

This commit is contained in:
Mike Solar
2025-08-03 03:09:40 +08:00
parent 65ab76edc8
commit 74f73ab3be
789 changed files with 77113 additions and 68888 deletions
+158 -155
View File
@@ -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
View File
@@ -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_);
}
}
+41 -47
View File
@@ -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();
};
}
+113 -114
View File
@@ -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();
};
}
+190 -200
View File
@@ -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;
}
}
}
+32 -24
View File
@@ -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();
};
}
+132 -121
View File
@@ -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_;
};
}