diff --git a/src/transcoder/transcodedialog.cpp b/src/transcoder/transcodedialog.cpp index d2e11b5e1..fc1cb2edd 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" @@ -35,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) { @@ -103,6 +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_->select, SIGNAL(clicked()), SLOT(AddDestination())); + connect(transcoder_, SIGNAL(JobComplete(QString,bool)), SLOT(JobComplete(QString,bool))); connect(transcoder_, SIGNAL(LogLine(QString)), SLOT(LogLine(QString))); @@ -138,7 +142,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 = GetOutputFileName(filename, preset); + transcoder_->AddJob(filename, preset, outfilename); } // Set up the progressbar @@ -265,3 +270,50 @@ void TranscodeDialog::Options() { dialog.exec(); } } + +// 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) const { + return path.section('/', -1, -1, QString::SectionSkipEmpty); +} + +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 { + 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..5be060def 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 @@ -34,6 +36,7 @@ class TranscodeDialog : public QDialog { static const char* kSettingsGroup; static const int kProgressInterval; + static const int kMaxDestinationItems; void SetFilenames(const QStringList& filenames); @@ -49,11 +52,15 @@ class TranscodeDialog : public QDialog { void LogLine(const QString& message); void AllJobsComplete(); void Options(); + void AddDestination(); private: void SetWorking(bool working); void UpdateStatusText(); void UpdateProgress(); + 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