diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2016-01-20 13:01:00 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2016-01-20 13:01:00 +0000 |
| commit | 58eacba4daf81e8b24201c81125c97ff55742869 (patch) | |
| tree | a8b5d89e573cef8ed72e00f654dd495a6a35264b /src/plugins/General/converter/converterdialog.cpp | |
| parent | 30efd053e33c54a63d009d938dedbc2679f4dcdb (diff) | |
| download | qmmp-58eacba4daf81e8b24201c81125c97ff55742869.tar.gz qmmp-58eacba4daf81e8b24201c81125c97ff55742869.tar.bz2 qmmp-58eacba4daf81e8b24201c81125c97ff55742869.zip | |
converter: multi-thread support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6068 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/General/converter/converterdialog.cpp')
| -rw-r--r-- | src/plugins/General/converter/converterdialog.cpp | 101 |
1 files changed, 80 insertions, 21 deletions
diff --git a/src/plugins/General/converter/converterdialog.cpp b/src/plugins/General/converter/converterdialog.cpp index ab75ed07f..7bfafe37c 100644 --- a/src/plugins/General/converter/converterdialog.cpp +++ b/src/plugins/General/converter/converterdialog.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011-2015 by Ilya Kotov * + * Copyright (C) 2011-2016 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -23,26 +23,50 @@ #include <QMenu> #include <QFile> #include <QDir> +#include <QProgressBar> +#include <QThreadPool> #include <qmmpui/playlistitem.h> #include <qmmpui/metadataformatter.h> #include <qmmpui/filedialog.h> +#include <qmmp/metadatamanager.h> +#include "converter.h" #include "preseteditor.h" #include "converterdialog.h" -ConverterDialog::ConverterDialog(QList <PlayListTrack *> items, QWidget *parent) : QDialog(parent) +ConverterDialog::ConverterDialog(QList <PlayListTrack *> tracks, QWidget *parent) : QDialog(parent) { m_ui.setupUi(this); - MetaDataFormatter formatter("%p%if(%p&%t, - ,)%t - %l"); - foreach(PlayListTrack *item , items) + m_ui.tableWidget->verticalHeader()->setDefaultSectionSize(fontMetrics().height() + 3); + m_ui.tableWidget->verticalHeader()->setResizeMode(QHeaderView::Fixed); + + QStringList paths; + MetaDataFormatter formatter("%if(%p&%t,%p - %t,%f) - %l"); + foreach(PlayListTrack *track, tracks) { - if(item->length() == 0) + //skip streams + if(track->length() == 0 || track->url().contains("://")) + continue; + //skip duplicates + if(paths.contains(track->url())) continue; - QString text = formatter.format(item); - QListWidgetItem *listItem = new QListWidgetItem(text); - listItem->setData(Qt::UserRole, item->url()); - listItem->setCheckState(Qt::Checked); - m_ui.itemsListWidget->addItem(listItem); + //skip unsupported files + if(!MetaDataManager::instance()->supports(track->url())) + continue; + + paths.append(track->url()); + QString name = formatter.format(track); + QTableWidgetItem *item = new QTableWidgetItem(name); + item->setData(Qt::UserRole, track->url()); + item->setData(Qt::ToolTipRole, track->url()); + m_ui.tableWidget->insertRow(m_ui.tableWidget->rowCount()); + m_ui.tableWidget->setItem(m_ui.tableWidget->rowCount() - 1, 0, item); + QProgressBar *progressBar = new QProgressBar(this); + progressBar->setRange(0, 100); + m_ui.tableWidget->setCellWidget(m_ui.tableWidget->rowCount() - 1, 1, progressBar); + } + m_ui.tableWidget->resizeColumnsToContents(); + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("Converter"); QString music_path = QDesktopServices::storageLocation(QDesktopServices::MusicLocation); @@ -59,17 +83,7 @@ ConverterDialog::ConverterDialog(QList <PlayListTrack *> items, QWidget *parent ConverterDialog::~ConverterDialog() { savePresets(); -} - -QStringList ConverterDialog::selectedUrls() const -{ - QStringList out; - for(int i = 0; i < m_ui.itemsListWidget->count(); i++) - { - if(m_ui.itemsListWidget->item(i)->checkState() == Qt::Checked) - out << m_ui.itemsListWidget->item(i)->data(Qt::UserRole).toString(); - } - return out; + on_stopButton_clicked(); } QVariantMap ConverterDialog::preset() const @@ -93,6 +107,51 @@ void ConverterDialog::on_dirButton_clicked() m_ui.outDirEdit->setText(dir); } +void ConverterDialog::on_convertButton_clicked() +{ + m_ui.convertButton->setEnabled(false); + m_converters.clear(); + for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i) + { + QString url = m_ui.tableWidget->item(i, 0)->data(Qt::UserRole).toString(); + Converter *converter = new Converter(); + + + if(!converter->prepare(url, preset())) + { + //m_ui.tableWidget->setItem(i, 2, new QTableWidgetItem(tr("Error"))); + delete converter; + continue; + } + + converter->setAutoDelete(false); + m_converters.append(converter); + connect(converter, SIGNAL(progress(int)), m_ui.tableWidget->cellWidget(i, 1), SLOT(setValue(int))); + connect(converter, SIGNAL(finished(Converter *)), SLOT(onConvertFinished(Converter *))); + QThreadPool::globalInstance()->start(converter); + } +} + +void ConverterDialog::on_stopButton_clicked() +{ + if(m_converters.isEmpty()) + return; + + foreach(Converter *c, m_converters) + c->stop(); + QThreadPool::globalInstance()->waitForDone(); + qDeleteAll(m_converters); + m_converters.clear(); +} + +void ConverterDialog::onConvertFinished(Converter *c) +{ + m_converters.removeAll(c); + delete c; + if(m_converters.isEmpty()) + m_ui.convertButton->setEnabled(true); +} + void ConverterDialog::accept() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); |
