Move OrganiseFormat to core/ and add an Organise class that actually does the work.

This commit is contained in:
David Sansome 2010-06-24 18:33:38 +00:00
parent e680c441c1
commit 0848f62c3d
37 changed files with 272 additions and 11 deletions

View File

@ -40,6 +40,8 @@ set(SOURCES
core/gnomeglobalshortcutbackend.cpp
core/mergedproxymodel.cpp
core/networkaccessmanager.cpp
core/organise.cpp
core/organiseformat.cpp
core/player.cpp
core/qxtglobalshortcutbackend.cpp
core/scopedtransaction.cpp
@ -120,7 +122,6 @@ set(SOURCES
ui/iconloader.cpp
ui/mainwindow.cpp
ui/organisedialog.cpp
ui/organiseformat.cpp
ui/qtsystemtrayicon.cpp
ui/settingsdialog.cpp
ui/systemtrayicon.cpp
@ -162,6 +163,7 @@ set(HEADERS
core/gnomeglobalshortcutbackend.h
core/mergedproxymodel.h
core/networkaccessmanager.h
core/organise.h
core/player.h
core/songloader.h
core/taskmanager.h

109
src/core/organise.cpp Normal file
View File

@ -0,0 +1,109 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "organise.h"
#include "taskmanager.h"
#include <QDir>
#include <QTimer>
#include <QThread>
const int Organise::kBatchSize = 10;
Organise::Organise(TaskManager* task_manager, const QString &destination,
const OrganiseFormat &format, bool copy, bool overwrite,
const QStringList &files)
: thread_(NULL),
task_manager_(task_manager),
destination_(destination),
format_(format),
copy_(copy),
overwrite_(overwrite),
files_(files),
task_id_(0),
progress_(0)
{
original_thread_ = thread();
}
void Organise::Start() {
if (thread_)
return;
task_id_ = task_manager_->StartTask(tr("Organising files"));
task_manager_->SetTaskProgress(task_id_, progress_, files_.count());
thread_ = new QThread;
connect(thread_, SIGNAL(started()), SLOT(ProcessSomeFiles()));
connect(thread_, SIGNAL(destroyed()), SLOT(deleteLater()));
moveToThread(thread_);
thread_->start();
}
void Organise::ProcessSomeFiles() {
// None left?
if (progress_ >= files_.count()) {
task_manager_->SetTaskFinished(task_id_);
// Move back to the original thread so deleteLater() can get called in
// the main thread's event loop
moveToThread(original_thread_);
deleteLater();
// Stop this thread
thread_->quit();
return;
}
QDir dir;
// We process files in batches so we can be cancelled part-way through.
const int n = qMin(files_.count(), progress_ + kBatchSize);
for ( ; progress_<n ; ++progress_) {
task_manager_->SetTaskProgress(task_id_, progress_ + 1);
// Read metadata from the file
QString filename = files_[progress_];
Song song;
song.InitFromFile(filename, -1);
if (!song.is_valid())
continue;
// Get the destination filename
QString dest_filename = destination_ + "/" + format_.GetFilenameForSong(song);
// Don't do anything if it's the destination is the same as the source
if (filename == dest_filename)
continue;
// Create directories as required
dir.mkpath(dest_filename.section('/', 0, -2));
// Remove the destination file if it exists and we want to overwrite
if (overwrite_ && QFile::exists(dest_filename))
QFile::remove(dest_filename);
// Copy or move
if (copy_)
QFile::copy(filename, dest_filename);
else
QFile::rename(filename, dest_filename);
}
QTimer::singleShot(0, this, SLOT(ProcessSomeFiles()));
}

56
src/core/organise.h Normal file
View File

@ -0,0 +1,56 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ORGANISE_H
#define ORGANISE_H
#include <QObject>
#include "organiseformat.h"
class TaskManager;
class Organise : public QObject {
Q_OBJECT
public:
Organise(TaskManager* task_manager, const QString& destination,
const OrganiseFormat& format, bool copy, bool overwrite,
const QStringList& files);
static const int kBatchSize;
void Start();
private slots:
void ProcessSomeFiles();
private:
QThread* thread_;
QThread* original_thread_;
TaskManager* task_manager_;
QString destination_;
OrganiseFormat format_;
bool copy_;
bool overwrite_;
QStringList files_;
int task_id_;
int progress_;
};
#endif // ORGANISE_H

View File

@ -35,6 +35,11 @@ OrganiseFormat::OrganiseFormat(const QString &format)
{
}
void OrganiseFormat::set_format(const QString &v) {
format_ = v;
format_.replace('\\', '/');
}
bool OrganiseFormat::IsValid() const {
int pos = 0;
QString format_copy(format_);
@ -211,5 +216,3 @@ void OrganiseFormat::SyntaxHighlighter::highlightBlock(const QString& text) {
}
}

View File

@ -35,7 +35,7 @@ public:
bool replace_spaces() const { return replace_spaces_; }
bool replace_the() const { return replace_the_; }
void set_format(const QString& v) { format_ = v; }
void set_format(const QString& v);
void set_replace_non_ascii(bool v) { replace_non_ascii_ = v; }
void set_replace_spaces(bool v) { replace_spaces_ = v; }
void set_replace_the(bool v) { replace_the_ = v; }

View File

@ -40,7 +40,7 @@ public:
public slots:
// Thread-safe
void SetTaskProgress(int id, int progress, int max = -1);
void SetTaskProgress(int id, int progress, int max = 0);
void SetTaskFinished(int id);
signals:

View File

@ -978,6 +978,9 @@ msgstr "خيارات"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "خيارات اخرى"

View File

@ -982,6 +982,9 @@ msgstr "Možnosti"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Jiné možnosti"

View File

@ -983,6 +983,9 @@ msgstr "Indstillinger"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Andre valgmuligheder"

View File

@ -986,6 +986,9 @@ msgstr "Einstellungen"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Weitere Optionen"

View File

@ -987,6 +987,9 @@ msgstr "Επιλογές"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Άλλες επιλογές"

View File

@ -983,6 +983,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Other options"

View File

@ -980,6 +980,9 @@ msgstr "Options"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Other options"

View File

@ -991,6 +991,9 @@ msgstr "Opciones"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Otras opciones"

View File

@ -978,6 +978,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr ""

View File

@ -986,6 +986,9 @@ msgstr "Options"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Autres options"

View File

@ -980,6 +980,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr ""

View File

@ -989,6 +989,9 @@ msgstr "Opzioni"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Altre opzioni"

View File

@ -980,6 +980,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr ""

View File

@ -981,6 +981,9 @@ msgstr "Instillinger"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr ""

View File

@ -978,6 +978,9 @@ msgstr "Opcions"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Autras opcions"

View File

@ -980,6 +980,9 @@ msgstr "Opcje"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Inne opcje"

View File

@ -985,6 +985,9 @@ msgstr "Opções"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Outras opções"

View File

@ -987,6 +987,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Outras opções"

View File

@ -979,6 +979,9 @@ msgstr "Opțiuni"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Alte opțiuni"

View File

@ -984,6 +984,9 @@ msgstr "Настройки"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Другие настройки"

View File

@ -985,6 +985,9 @@ msgstr "Možnosti"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Ostatné možnosti"

View File

@ -983,6 +983,9 @@ msgstr "Flaggor"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Övriga flaggor"

View File

@ -980,6 +980,9 @@ msgstr "Seçenekler"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Diğer Seçenekler"

View File

@ -969,6 +969,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr ""

View File

@ -985,6 +985,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "Інші параметри"

View File

@ -978,6 +978,9 @@ msgstr "选项"
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr "其它选项"

View File

@ -978,6 +978,9 @@ msgstr ""
msgid "Organise Files"
msgstr ""
msgid "Organising files"
msgstr ""
msgid "Other options"
msgstr ""

View File

@ -123,7 +123,7 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg
equalizer_(new Equalizer),
transcode_dialog_(new TranscodeDialog),
error_dialog_(new ErrorDialog),
organise_dialog_(new OrganiseDialog),
organise_dialog_(new OrganiseDialog(task_manager_)),
#ifdef ENABLE_VISUALISATIONS
visualisation_(new VisualisationContainer),
#endif

View File

@ -16,6 +16,7 @@
#include "organisedialog.h"
#include "ui_organisedialog.h"
#include "core/organise.h"
#include <QDir>
#include <QMenu>
@ -28,9 +29,10 @@ const char* OrganiseDialog::kDefaultFormat =
"%artist/%album{ (Disc %disc)}/{%track - }%title.%extension";
const char* OrganiseDialog::kSettingsGroup = "OrganiseDialog";
OrganiseDialog::OrganiseDialog(QWidget *parent)
OrganiseDialog::OrganiseDialog(TaskManager* task_manager, QWidget *parent)
: QDialog(parent),
ui_(new Ui_OrganiseDialog)
ui_(new Ui_OrganiseDialog),
task_manager_(task_manager)
{
ui_->setupUi(this);
connect(ui_->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), SLOT(Reset()));
@ -164,5 +166,11 @@ void OrganiseDialog::accept() {
s.setValue("replace_the", ui_->replace_the->isChecked());
s.setValue("overwrite", ui_->overwrite->isChecked());
// It deletes itself when it's finished.
Organise* organise = new Organise(
task_manager_, ui_->destination->currentText(), format_, true,
ui_->overwrite->isChecked(), filenames_);
organise->Start();
QDialog::accept();
}

View File

@ -21,9 +21,10 @@
#include <QMap>
#include <QUrl>
#include "organiseformat.h"
#include "core/organiseformat.h"
#include "core/song.h"
class TaskManager;
class Ui_OrganiseDialog;
class QAbstractItemModel;
@ -32,7 +33,7 @@ class OrganiseDialog : public QDialog {
Q_OBJECT
public:
OrganiseDialog(QWidget* parent = 0);
OrganiseDialog(TaskManager* task_manager, QWidget* parent = 0);
~OrganiseDialog();
static const int kNumberOfPreviews;
@ -60,6 +61,7 @@ private slots:
private:
Ui_OrganiseDialog* ui_;
TaskManager* task_manager_;
OrganiseFormat format_;

View File

@ -17,7 +17,7 @@
#include "gtest/gtest.h"
#include "test_utils.h"
#include "ui/organiseformat.h"
#include "core/organiseformat.h"
class OrganiseFormatTest : public ::testing::Test {
protected: