Added support for saving and deleting custom templates.
This commit is contained in:
parent
932610e822
commit
18a3411e6e
@ -21,6 +21,10 @@
|
|||||||
|
|
||||||
#include "model_options.h"
|
#include "model_options.h"
|
||||||
|
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
OptionsModel::OptionsModel(void)
|
OptionsModel::OptionsModel(void)
|
||||||
{
|
{
|
||||||
m_rcMode = RCMode_CRF;
|
m_rcMode = RCMode_CRF;
|
||||||
@ -72,3 +76,91 @@ bool OptionsModel::equals(OptionsModel *model)
|
|||||||
|
|
||||||
return equal;
|
return equal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool OptionsModel::saveTemplate(OptionsModel *model, const QString &name)
|
||||||
|
{
|
||||||
|
const QString templateName = name.simplified();
|
||||||
|
const QString appDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
|
||||||
|
|
||||||
|
if(templateName.startsWith("<") || templateName.endsWith(">") || templateName.contains("\\") || templateName.contains("/"))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSettings settings(QString("%1/templates.ini").arg(appDir), QSettings::IniFormat);
|
||||||
|
settings.beginGroup(templateName);
|
||||||
|
|
||||||
|
settings.setValue("rate_control_mode", model->m_rcMode);
|
||||||
|
settings.setValue("target_bitrate", model->m_bitrate);
|
||||||
|
settings.setValue("target_quantizer", model->m_quantizer);
|
||||||
|
settings.setValue("preset_name", model->m_preset);
|
||||||
|
settings.setValue("tuning_name", model->m_tune);
|
||||||
|
settings.setValue("profile_name", model->m_profile);
|
||||||
|
settings.setValue("custom_params", model->m_custom);
|
||||||
|
|
||||||
|
settings.endGroup();
|
||||||
|
settings.sync();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QMap<QString, OptionsModel*> OptionsModel::loadAllTemplates(void)
|
||||||
|
{
|
||||||
|
QMap<QString, OptionsModel*> list;
|
||||||
|
const QString appDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
|
||||||
|
QSettings settings(QString("%1/templates.ini").arg(appDir), QSettings::IniFormat);
|
||||||
|
QStringList allTemplates = settings.childGroups();
|
||||||
|
|
||||||
|
while(!allTemplates.isEmpty())
|
||||||
|
{
|
||||||
|
settings.beginGroup(allTemplates.takeFirst());
|
||||||
|
|
||||||
|
bool complete = true;
|
||||||
|
if(!settings.contains("rate_control_mode")) complete = false;
|
||||||
|
if(!settings.contains("target_bitrate")) complete = false;
|
||||||
|
if(!settings.contains("target_quantizer")) complete = false;
|
||||||
|
if(!settings.contains("preset_name")) complete = false;
|
||||||
|
if(!settings.contains("tuning_name")) complete = false;
|
||||||
|
if(!settings.contains("profile_name")) complete = false;
|
||||||
|
if(!settings.contains("custom_params")) complete = false;
|
||||||
|
|
||||||
|
if(complete)
|
||||||
|
{
|
||||||
|
OptionsModel *options = new OptionsModel();
|
||||||
|
options->setRCMode(static_cast<OptionsModel::RCMode>(settings.value("rate_control_mode", options->m_rcMode).toInt()));
|
||||||
|
options->setBitrate(settings.value("target_bitrate", options->m_bitrate).toUInt());
|
||||||
|
options->setQuantizer(settings.value("target_quantizer", options->m_quantizer).toUInt());
|
||||||
|
options->setPreset(settings.value("preset_name", options->m_preset).toString());
|
||||||
|
options->setTune(settings.value("tuning_name", options->m_tune).toString());
|
||||||
|
options->setProfile(settings.value("profile_name", options->m_profile).toString());
|
||||||
|
options->setCustom(settings.value("custom_params", options->m_custom).toString());
|
||||||
|
list.insert(settings.group(), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OptionsModel::templateExists(const QString &name)
|
||||||
|
{
|
||||||
|
const QString appDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
|
||||||
|
QSettings settings(QString("%1/templates.ini").arg(appDir), QSettings::IniFormat);
|
||||||
|
QStringList allGroups = settings.childGroups();
|
||||||
|
return allGroups.contains(name, Qt::CaseInsensitive);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OptionsModel::deleteTemplate(const QString &name)
|
||||||
|
{
|
||||||
|
const QString appDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
|
||||||
|
QSettings settings(QString("%1/templates.ini").arg(appDir), QSettings::IniFormat);
|
||||||
|
|
||||||
|
if(settings.childGroups().contains(name, Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
settings.remove(name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
class OptionsModel
|
class OptionsModel
|
||||||
{
|
{
|
||||||
@ -59,8 +60,12 @@ public:
|
|||||||
//Stuff
|
//Stuff
|
||||||
bool equals(OptionsModel *model);
|
bool equals(OptionsModel *model);
|
||||||
|
|
||||||
//Helper
|
//Static functions
|
||||||
static QString rcMode2String(RCMode mode);
|
static QString rcMode2String(RCMode mode);
|
||||||
|
static bool saveTemplate(OptionsModel *model, const QString &name);
|
||||||
|
static QMap<QString, OptionsModel*> loadAllTemplates(void);
|
||||||
|
static bool templateExists(const QString &name);
|
||||||
|
static bool deleteTemplate(const QString &name);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
RCMode m_rcMode;
|
RCMode m_rcMode;
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
#include <QValidator>
|
#include <QValidator>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QInputDialog>
|
||||||
|
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
@ -129,6 +130,8 @@ AddJobDialog::AddJobDialog(QWidget *parent, OptionsModel *options)
|
|||||||
//Activate buttons
|
//Activate buttons
|
||||||
connect(buttonBrowseSource, SIGNAL(clicked()), this, SLOT(browseButtonClicked()));
|
connect(buttonBrowseSource, SIGNAL(clicked()), this, SLOT(browseButtonClicked()));
|
||||||
connect(buttonBrowseOutput, SIGNAL(clicked()), this, SLOT(browseButtonClicked()));
|
connect(buttonBrowseOutput, SIGNAL(clicked()), this, SLOT(browseButtonClicked()));
|
||||||
|
connect(buttonSaveTemplate, SIGNAL(clicked()), this, SLOT(saveTemplateButtonClicked()));
|
||||||
|
connect(buttonDeleteTemplate, SIGNAL(clicked()), this, SLOT(deleteTemplateButtonClicked()));
|
||||||
|
|
||||||
//Setup validator
|
//Setup validator
|
||||||
editCustomParams->installEventFilter(this);
|
editCustomParams->installEventFilter(this);
|
||||||
@ -147,19 +150,24 @@ AddJobDialog::AddJobDialog(QWidget *parent, OptionsModel *options)
|
|||||||
connect(cbxProfile, SIGNAL(currentIndexChanged(int)), this, SLOT(configurationChanged()));
|
connect(cbxProfile, SIGNAL(currentIndexChanged(int)), this, SLOT(configurationChanged()));
|
||||||
connect(editCustomParams, SIGNAL(textChanged(QString)), this, SLOT(configurationChanged()));
|
connect(editCustomParams, SIGNAL(textChanged(QString)), this, SLOT(configurationChanged()));
|
||||||
|
|
||||||
//Monitor template
|
//Setup template selector
|
||||||
cbxTemplate->insertItem(0, tr("<Default>"), QVariant::fromValue<void*>(m_defaults));
|
loadTemplateList();
|
||||||
cbxTemplate->setCurrentIndex(0);
|
|
||||||
if(!m_options->equals(m_defaults))
|
|
||||||
{
|
|
||||||
cbxTemplate->insertItem(1, tr("<Recently Used>"), QVariant::fromValue<void*>(m_options));
|
|
||||||
cbxTemplate->setCurrentIndex(1);
|
|
||||||
}
|
|
||||||
connect(cbxTemplate, SIGNAL(currentIndexChanged(int)), this, SLOT(templateSelected()));
|
connect(cbxTemplate, SIGNAL(currentIndexChanged(int)), this, SLOT(templateSelected()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AddJobDialog::~AddJobDialog(void)
|
AddJobDialog::~AddJobDialog(void)
|
||||||
{
|
{
|
||||||
|
for(int i = 0; i < cbxTemplate->model()->rowCount(); i++)
|
||||||
|
{
|
||||||
|
if(cbxTemplate->itemText(i).startsWith("<") || cbxTemplate->itemText(i).endsWith(">"))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
OptionsModel *item = reinterpret_cast<OptionsModel*>(cbxTemplate->itemData(i).value<void*>());
|
||||||
|
cbxTemplate->setItemData(i, QVariant::fromValue<void*>(NULL));
|
||||||
|
X264_DELETE(item);
|
||||||
|
}
|
||||||
|
|
||||||
X264_DELETE(m_defaults);
|
X264_DELETE(m_defaults);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,6 +324,80 @@ void AddJobDialog::templateSelected(void)
|
|||||||
modeIndexChanged(cbxRateControlMode->currentIndex());
|
modeIndexChanged(cbxRateControlMode->currentIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AddJobDialog::saveTemplateButtonClicked(void)
|
||||||
|
{
|
||||||
|
qDebug("Saving template");
|
||||||
|
QString name = tr("New Template");
|
||||||
|
|
||||||
|
forever
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
name = QInputDialog::getText(this, tr("Save Template"), tr("Please enter the name of the template:"), QLineEdit::Normal, name, &ok).simplified();
|
||||||
|
if(!ok) return;
|
||||||
|
if(name.startsWith("<") || name.endsWith(">"))
|
||||||
|
{
|
||||||
|
QMessageBox::warning (this, tr("Invalid Name"), tr("Sorry, the name you have entered is invalid!"));
|
||||||
|
while(name.startsWith("<")) name = name.mid(1).trimmed();
|
||||||
|
while(name.endsWith(">")) name = name.left(name.size() - 1).trimmed();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(OptionsModel::templateExists(name))
|
||||||
|
{
|
||||||
|
QMessageBox::warning (this, tr("Already Exists"), tr("Sorry, a template of that name already exists!"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
OptionsModel *options = new OptionsModel();
|
||||||
|
saveOptions(options);
|
||||||
|
|
||||||
|
if(options->equals(m_defaults))
|
||||||
|
{
|
||||||
|
QMessageBox::warning (this, tr("Default"), tr("It makes no sense to save the defaults!"));
|
||||||
|
X264_DELETE(options);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!OptionsModel::saveTemplate(options, name))
|
||||||
|
{
|
||||||
|
QMessageBox::warning (this, tr("Save Failed"), tr("Sorry, the template could not be used!"));
|
||||||
|
X264_DELETE(options);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index = cbxTemplate->model()->rowCount();
|
||||||
|
cbxTemplate->blockSignals(true);
|
||||||
|
cbxTemplate->insertItem(index, name, QVariant::fromValue<void*>(options));
|
||||||
|
cbxTemplate->setCurrentIndex(index);
|
||||||
|
for(int i = 0; i < cbxTemplate->model()->rowCount(); i++)
|
||||||
|
{
|
||||||
|
OptionsModel* temp = reinterpret_cast<OptionsModel*>(cbxTemplate->itemData(i).value<void*>());
|
||||||
|
if(temp == NULL)
|
||||||
|
{
|
||||||
|
cbxTemplate->removeItem(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cbxTemplate->blockSignals(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddJobDialog::deleteTemplateButtonClicked(void)
|
||||||
|
{
|
||||||
|
const int index = cbxTemplate->currentIndex();
|
||||||
|
QString name = cbxTemplate->itemText(index);
|
||||||
|
|
||||||
|
if(name.startsWith("<") || name.endsWith(">"))
|
||||||
|
{
|
||||||
|
QMessageBox::warning (this, tr("Invalid Item"), tr("Sorry, the selected item cannot be deleted!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OptionsModel::deleteTemplate(name);
|
||||||
|
OptionsModel *item = reinterpret_cast<OptionsModel*>(cbxTemplate->itemData(index).value<void*>());
|
||||||
|
cbxTemplate->removeItem(index);
|
||||||
|
X264_DELETE(item);
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Public functions
|
// Public functions
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -334,6 +416,33 @@ QString AddJobDialog::outputFile(void)
|
|||||||
// Private functions
|
// Private functions
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void AddJobDialog::loadTemplateList(void)
|
||||||
|
{
|
||||||
|
cbxTemplate->addItem(tr("<Default>"), QVariant::fromValue<void*>(m_defaults));
|
||||||
|
cbxTemplate->setCurrentIndex(0);
|
||||||
|
|
||||||
|
QMap<QString, OptionsModel*> templates = OptionsModel::loadAllTemplates();
|
||||||
|
QStringList templateNames = templates.keys();
|
||||||
|
templateNames.sort();
|
||||||
|
|
||||||
|
while(!templateNames.isEmpty())
|
||||||
|
{
|
||||||
|
QString current = templateNames.takeFirst();
|
||||||
|
cbxTemplate->addItem(current, QVariant::fromValue<void*>(templates.value(current)));
|
||||||
|
|
||||||
|
if(templates.value(current)->equals(m_options))
|
||||||
|
{
|
||||||
|
cbxTemplate->setCurrentIndex(cbxTemplate->count() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if((cbxTemplate->currentIndex() == 0) && (!m_options->equals(m_defaults)))
|
||||||
|
{
|
||||||
|
cbxTemplate->insertItem(1, tr("<Recently Used>"), QVariant::fromValue<void*>(m_options));
|
||||||
|
cbxTemplate->setCurrentIndex(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AddJobDialog::updateComboBox(QComboBox *cbox, const QString &text)
|
void AddJobDialog::updateComboBox(QComboBox *cbox, const QString &text)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < cbox->model()->rowCount(); i++)
|
for(int i = 0; i < cbox->model()->rowCount(); i++)
|
||||||
|
@ -54,10 +54,13 @@ private slots:
|
|||||||
void browseButtonClicked(void);
|
void browseButtonClicked(void);
|
||||||
void configurationChanged(void);
|
void configurationChanged(void);
|
||||||
void templateSelected(void);
|
void templateSelected(void);
|
||||||
|
void saveTemplateButtonClicked(void);
|
||||||
|
void deleteTemplateButtonClicked(void);
|
||||||
|
|
||||||
virtual void accept(void);
|
virtual void accept(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void loadTemplateList(void);
|
||||||
void restoreOptions(OptionsModel *options);
|
void restoreOptions(OptionsModel *options);
|
||||||
void saveOptions(OptionsModel *options);
|
void saveOptions(OptionsModel *options);
|
||||||
void updateComboBox(QComboBox *cbox, const QString &text);
|
void updateComboBox(QComboBox *cbox, const QString &text);
|
||||||
|
Loading…
Reference in New Issue
Block a user