aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/converter/converterdialog.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-01-20 13:01:00 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-01-20 13:01:00 +0000
commit58eacba4daf81e8b24201c81125c97ff55742869 (patch)
treea8b5d89e573cef8ed72e00f654dd495a6a35264b /src/plugins/General/converter/converterdialog.cpp
parent30efd053e33c54a63d009d938dedbc2679f4dcdb (diff)
downloadqmmp-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.cpp101
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);