From 294023cf2d93a1a8bc0df4e56830cc88420e23ab Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Sat, 11 Jan 2014 01:04:59 +0100 Subject: [PATCH 1/2] Add the ability to choose destination folder in the transcoder dialog. --- src/transcoder/transcodedialog.cpp | 47 +++++++++++++++++++++++++++++- src/transcoder/transcodedialog.h | 6 ++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/transcoder/transcodedialog.cpp b/src/transcoder/transcodedialog.cpp index d2e11b5e1..9886f4ba2 100644 --- a/src/transcoder/transcodedialog.cpp +++ b/src/transcoder/transcodedialog.cpp @@ -20,6 +20,7 @@ #include "transcoderoptionsdialog.h" #include "ui_transcodedialog.h" #include "ui_transcodelogdialog.h" +#include "ui/iconloader.h" #include "ui/mainwindow.h" #include "widgets/fileview.h" @@ -95,6 +96,12 @@ TranscodeDialog::TranscodeDialog(QWidget *parent) cancel_button_->hide(); ui_->progress_group->hide(); + // Add a destination. + QIcon icon = IconLoader::Load("folder"); + QVariant data = QVariant::fromValue(QDir::homePath()); + QString text = TrimPath(data.toString()); + ui_->destination->addItem(icon, text, data); + // Connect stuff connect(ui_->add, SIGNAL(clicked()), SLOT(Add())); connect(ui_->remove, SIGNAL(clicked()), SLOT(Remove())); @@ -103,6 +110,8 @@ TranscodeDialog::TranscodeDialog(QWidget *parent) connect(close_button_, SIGNAL(clicked()), SLOT(hide())); connect(ui_->details, SIGNAL(clicked()), log_dialog_, SLOT(show())); connect(ui_->options, SIGNAL(clicked()), SLOT(Options())); + connect(ui_->destination, SIGNAL(activated(int)), + SLOT(SetDestination(int))); connect(transcoder_, SIGNAL(JobComplete(QString,bool)), SLOT(JobComplete(QString,bool))); connect(transcoder_, SIGNAL(LogLine(QString)), SLOT(LogLine(QString))); @@ -138,7 +147,8 @@ void TranscodeDialog::Start() { // Add jobs to the transcoder for (int i=0 ; irowCount() ; ++i) { QString filename = file_model->index(i, 0).data(Qt::UserRole).toString(); - transcoder_->AddJob(filename, preset); + QString outfilename = SetOutputFileName(filename, preset); + transcoder_->AddJob(filename, preset, outfilename); } // Set up the progressbar @@ -265,3 +275,38 @@ void TranscodeDialog::Options() { dialog.exec(); } } + +void TranscodeDialog::SetDestination(int index) { + if (!ui_->destination->itemData(index).isNull()) { + QString dir = QFileDialog::getExistingDirectory( + this, tr("Choose folder"), + ui_->destination->itemData(index).toString()); + // Do not update the QComboBox if the user canceled the dialog. + if (!dir.isEmpty()) { + QVariant data = QVariant::fromValue(dir); + QString text = TrimPath(dir); + ui_->destination->setItemText(index, text); + ui_->destination->setItemData(index, data); + } + } +} + +// Returns the rightmost non-empty part of 'path'. +QString TranscodeDialog::TrimPath(const QString& path) { + return path.section('/', -1, -1, QString::SectionSkipEmpty); +} + +QString TranscodeDialog::SetOutputFileName(const QString& input, + const TranscoderPreset &preset) { + QString path = ui_->destination->itemData( + ui_->destination->currentIndex()).toString(); + if (path.isEmpty()) { + // Keep the original path. + return input.section('.', 0, -2) + '.' + preset.extension_; + } + else { + QString file_name = TrimPath(input); + file_name = file_name.section('.', 0, -2); + return path + '/' + file_name + '.' + preset.extension_; + } +} diff --git a/src/transcoder/transcodedialog.h b/src/transcoder/transcodedialog.h index ebf70d204..a88097ef7 100644 --- a/src/transcoder/transcodedialog.h +++ b/src/transcoder/transcodedialog.h @@ -25,6 +25,8 @@ class Transcoder; class Ui_TranscodeDialog; class Ui_TranscodeLogDialog; +struct TranscoderPreset; + class TranscodeDialog : public QDialog { Q_OBJECT @@ -49,11 +51,15 @@ class TranscodeDialog : public QDialog { void LogLine(const QString& message); void AllJobsComplete(); void Options(); + void SetDestination(int index); private: void SetWorking(bool working); void UpdateStatusText(); void UpdateProgress(); + QString TrimPath(const QString& path); + QString SetOutputFileName(const QString& input, + const TranscoderPreset& preset); private: Ui_TranscodeDialog* ui_; From 9647636ab718524fa6e804f1a4d8c7bcac4c40ae Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Sat, 11 Jan 2014 18:59:54 +0100 Subject: [PATCH 2/2] Adjust the ui and clean up code. The selection of a destination folder is now done by pressing the button 'Select...'. The last selected folders along with the option 'Alongside the originals' are available in the box 'destination'. The methods TranscodeDialog::TrimPath and TranscodeDialog::GetOutputFileName are now const. Minor formatting fixes. --- src/transcoder/transcodedialog.cpp | 57 +++++++++++++++++------------- src/transcoder/transcodedialog.h | 9 ++--- src/transcoder/transcodedialog.ui | 53 ++++++++++++++++----------- 3 files changed, 69 insertions(+), 50 deletions(-) diff --git a/src/transcoder/transcodedialog.cpp b/src/transcoder/transcodedialog.cpp index 9886f4ba2..fc1cb2edd 100644 --- a/src/transcoder/transcodedialog.cpp +++ b/src/transcoder/transcodedialog.cpp @@ -36,6 +36,7 @@ const char* TranscodeDialog::kSettingsGroup = "Transcoder"; const int TranscodeDialog::kProgressInterval = 500; +const int TranscodeDialog::kMaxDestinationItems = 10; static bool ComparePresetsByName(const TranscoderPreset& left, const TranscoderPreset& right) { @@ -96,12 +97,6 @@ TranscodeDialog::TranscodeDialog(QWidget *parent) cancel_button_->hide(); ui_->progress_group->hide(); - // Add a destination. - QIcon icon = IconLoader::Load("folder"); - QVariant data = QVariant::fromValue(QDir::homePath()); - QString text = TrimPath(data.toString()); - ui_->destination->addItem(icon, text, data); - // Connect stuff connect(ui_->add, SIGNAL(clicked()), SLOT(Add())); connect(ui_->remove, SIGNAL(clicked()), SLOT(Remove())); @@ -110,8 +105,8 @@ TranscodeDialog::TranscodeDialog(QWidget *parent) connect(close_button_, SIGNAL(clicked()), SLOT(hide())); connect(ui_->details, SIGNAL(clicked()), log_dialog_, SLOT(show())); connect(ui_->options, SIGNAL(clicked()), SLOT(Options())); - connect(ui_->destination, SIGNAL(activated(int)), - SLOT(SetDestination(int))); + connect(ui_->select, SIGNAL(clicked()), SLOT(AddDestination())); + connect(transcoder_, SIGNAL(JobComplete(QString,bool)), SLOT(JobComplete(QString,bool))); connect(transcoder_, SIGNAL(LogLine(QString)), SLOT(LogLine(QString))); @@ -147,7 +142,7 @@ void TranscodeDialog::Start() { // Add jobs to the transcoder for (int i=0 ; irowCount() ; ++i) { QString filename = file_model->index(i, 0).data(Qt::UserRole).toString(); - QString outfilename = SetOutputFileName(filename, preset); + QString outfilename = GetOutputFileName(filename, preset); transcoder_->AddJob(filename, preset, outfilename); } @@ -276,35 +271,47 @@ void TranscodeDialog::Options() { } } -void TranscodeDialog::SetDestination(int index) { - if (!ui_->destination->itemData(index).isNull()) { - QString dir = QFileDialog::getExistingDirectory( - this, tr("Choose folder"), - ui_->destination->itemData(index).toString()); - // Do not update the QComboBox if the user canceled the dialog. - if (!dir.isEmpty()) { - QVariant data = QVariant::fromValue(dir); - QString text = TrimPath(dir); - ui_->destination->setItemText(index, text); - ui_->destination->setItemData(index, data); +// Adds a folder to the destination box. +void TranscodeDialog::AddDestination() { + int index = ui_->destination->currentIndex(); + QString initial_dir = (!ui_->destination->itemData(index).isNull() ? + ui_->destination->itemData(index).toString() : + QDir::homePath()); + QString dir = QFileDialog::getExistingDirectory( + this, tr("Add folder"), initial_dir); + + if (!dir.isEmpty()) { + // Keep only a finite number of items in the box. + while (ui_->destination->count() >= kMaxDestinationItems) { + ui_->destination->removeItem(1); // The oldest folder item. + } + + QIcon icon = IconLoader::Load("folder"); + QVariant data = QVariant::fromValue(dir); + // Do not insert duplicates. + int duplicate_index = ui_->destination->findData(data); + if (duplicate_index == -1) { + ui_->destination->addItem(icon, dir, data); + ui_->destination->setCurrentIndex(ui_->destination->count() - 1); + } else { + ui_->destination->setCurrentIndex(duplicate_index); } } } // Returns the rightmost non-empty part of 'path'. -QString TranscodeDialog::TrimPath(const QString& path) { +QString TranscodeDialog::TrimPath(const QString& path) const { return path.section('/', -1, -1, QString::SectionSkipEmpty); } -QString TranscodeDialog::SetOutputFileName(const QString& input, - const TranscoderPreset &preset) { +QString TranscodeDialog::GetOutputFileName(const QString& input, + const TranscoderPreset &preset) const { QString path = ui_->destination->itemData( ui_->destination->currentIndex()).toString(); if (path.isEmpty()) { // Keep the original path. return input.section('.', 0, -2) + '.' + preset.extension_; - } - else { + } else { QString file_name = TrimPath(input); file_name = file_name.section('.', 0, -2); return path + '/' + file_name + '.' + preset.extension_; diff --git a/src/transcoder/transcodedialog.h b/src/transcoder/transcodedialog.h index a88097ef7..5be060def 100644 --- a/src/transcoder/transcodedialog.h +++ b/src/transcoder/transcodedialog.h @@ -36,6 +36,7 @@ class TranscodeDialog : public QDialog { static const char* kSettingsGroup; static const int kProgressInterval; + static const int kMaxDestinationItems; void SetFilenames(const QStringList& filenames); @@ -51,15 +52,15 @@ class TranscodeDialog : public QDialog { void LogLine(const QString& message); void AllJobsComplete(); void Options(); - void SetDestination(int index); + void AddDestination(); private: void SetWorking(bool working); void UpdateStatusText(); void UpdateProgress(); - QString TrimPath(const QString& path); - QString SetOutputFileName(const QString& input, - const TranscoderPreset& preset); + QString TrimPath(const QString& path) const; + QString GetOutputFileName(const QString& input, + const TranscoderPreset& preset) const; private: Ui_TranscodeDialog* ui_; diff --git a/src/transcoder/transcodedialog.ui b/src/transcoder/transcodedialog.ui index 2a0e6e956..d6daedd05 100644 --- a/src/transcoder/transcodedialog.ui +++ b/src/transcoder/transcodedialog.ui @@ -98,7 +98,7 @@ Output options - + @@ -107,25 +107,21 @@ - - - - - - 0 - 0 - - - - - - - - Options... - - - - + + + + 0 + 0 + + + + + + + + Options... + + @@ -136,6 +132,15 @@ + + true + + + + 0 + 0 + + Alongside the originals @@ -143,6 +148,13 @@ + + + + Select... + + + @@ -196,7 +208,6 @@ add remove format - destination button_box