From 7e3592bee891e78c9d42dcd84bc9c1ac7a3e7688 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 6 May 2013 17:19:20 -0500 Subject: [PATCH] Made the version list load in the background on startup. Resolves JIRA issue MMC-11: https://jira.forkk.net/browse/MMC-11 --- gui/mainwindow.cpp | 56 ++++++++++++++++++++++++++++++++------- gui/mainwindow.h | 7 +++++ gui/taskdialog.cpp | 12 +++------ libmultimc/include/task.h | 17 ++++++++++-- libmultimc/src/task.cpp | 30 ++++++++++++++++++--- 5 files changed, 98 insertions(+), 24 deletions(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 750610c5..96609531 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -56,6 +56,8 @@ #include "instancemodel.h" #include "instancedelegate.h" +#include "minecraftversionlist.h" + // Opens the given file in the default application. // TODO: Move this somewhere. void openInDefaultProgram ( QString filename ); @@ -75,16 +77,16 @@ MainWindow::MainWindow ( QWidget *parent ) : view->setPalette(pal); */ - view->setStyleSheet( - "QListView\ - {\ - background-image: url(:/backgrounds/kitteh);\ - background-attachment: fixed;\ - background-clip: padding;\ - background-position: top right;\ - background-repeat: none;\ - background-color:palette(base);\ - }"); +// view->setStyleSheet( +// "QListView\ +// {\ +// background-image: url(:/backgrounds/kitteh);\ +// background-attachment: fixed;\ +// background-clip: padding;\ +// background-position: top right;\ +// background-repeat: none;\ +// background-color:palette(base);\ +// }"); view->setSelectionMode ( QAbstractItemView::SingleSelection ); //view->setSpacing( KDialog::spacingHint() ); @@ -126,6 +128,12 @@ MainWindow::MainWindow ( QWidget *parent ) : instList.at(0)->setGroup("TEST GROUP"); instList.at(0)->setName("TEST ITEM"); */ + + if (!MinecraftVersionList::getMainList().isLoaded()) + { + m_versionLoadTask = MinecraftVersionList::getMainList().getLoadTask(); + startTask(m_versionLoadTask); + } } MainWindow::~MainWindow() @@ -146,6 +154,14 @@ void MainWindow::instanceActivated ( QModelIndex index ) void MainWindow::on_actionAddInstance_triggered() { + if (!MinecraftVersionList::getMainList().isLoaded() && + m_versionLoadTask && m_versionLoadTask->isRunning()) + { + QEventLoop waitLoop; + waitLoop.connect(m_versionLoadTask, SIGNAL(ended()), SLOT(quit())); + waitLoop.exec(); + } + NewInstanceDialog *newInstDlg = new NewInstanceDialog ( this ); if (newInstDlg->exec()) { @@ -347,6 +363,26 @@ void MainWindow::onLoginFailed ( QString inst, const QString& errorMsg ) doLogin(inst, errorMsg); } +void MainWindow::taskStart(Task *task) +{ + // Nothing to do here yet. +} + +void MainWindow::taskEnd(Task *task) +{ + if (task == m_versionLoadTask) + m_versionLoadTask = NULL; + + delete task; +} + +void MainWindow::startTask(Task *task) +{ + connect(task, SIGNAL(started(Task*)), SLOT(taskStart(Task*))); + connect(task, SIGNAL(ended(Task*)), SLOT(taskEnd(Task*))); + task->startTask(); +} + // Create A Desktop Shortcut void MainWindow::on_actionMakeDesktopShortcut_triggered() diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 896fe9f1..bc35038e 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -87,9 +87,14 @@ private slots: void onLoginComplete( QString inst, LoginResponse response ); void onLoginFailed( QString inst, const QString& errorMsg ); + + void taskStart(Task *task); + void taskEnd(Task *task); public slots: void instanceActivated ( QModelIndex ); + + void startTask(Task *task); private: Ui::MainWindow *ui; @@ -100,6 +105,8 @@ private: InstanceList instList; MinecraftProcess *proc; ConsoleWindow *console; + + Task *m_versionLoadTask; }; #endif // MAINWINDOW_H diff --git a/gui/taskdialog.cpp b/gui/taskdialog.cpp index 9b1ddf23..a74b7718 100644 --- a/gui/taskdialog.cpp +++ b/gui/taskdialog.cpp @@ -45,14 +45,10 @@ void TaskDialog::exec(Task *task) this->task = task; // Connect signals. - connect(task, SIGNAL(taskStarted(Task*)), - this, SLOT(onTaskStarted(Task*))); - connect(task, SIGNAL(taskEnded(Task*)), - this, SLOT(onTaskEnded(Task*))); - connect(task, SIGNAL(statusChanged(const QString&)), - this, SLOT(changeStatus(const QString&))); - connect(task, SIGNAL(progressChanged(int)), - this, SLOT(changeProgress(int))); + connect(task, SIGNAL(started(Task*)), SLOT(onTaskStarted(Task*))); + connect(task, SIGNAL(ended(Task*)), SLOT(onTaskEnded(Task*))); + connect(task, SIGNAL(statusChanged(const QString&)), SLOT(changeStatus(const QString&))); + connect(task, SIGNAL(progressChanged(int)), SLOT(changeProgress(int))); task->startTask(); QDialog::exec(); diff --git a/libmultimc/include/task.h b/libmultimc/include/task.h index fc5b1d25..c8c12c02 100644 --- a/libmultimc/include/task.h +++ b/libmultimc/include/task.h @@ -48,8 +48,15 @@ public slots: void setProgress(int progress); signals: - void taskStarted(Task* task); - void taskEnded(Task* task); + void started(Task* task); + void ended(Task* task); + + void started(); + void ended(); + + + void statusChanged(Task* task, const QString& status); + void progressChanged(Task* task, int progress); void statusChanged(const QString& status); void progressChanged(int progress); @@ -58,6 +65,12 @@ protected: virtual void run(); virtual void executeTask() = 0; + virtual void emitStarted(); + virtual void emitEnded(); + + virtual void emitStatusChange(const QString &status); + virtual void emitProgressChange(int progress); + QString status; int progress; }; diff --git a/libmultimc/src/task.cpp b/libmultimc/src/task.cpp index 3e30827b..780c3b38 100644 --- a/libmultimc/src/task.cpp +++ b/libmultimc/src/task.cpp @@ -29,7 +29,7 @@ QString Task::getStatus() const void Task::setStatus(const QString &status) { this->status = status; - emit statusChanged(status); + emitStatusChange(status); } int Task::getProgress() const @@ -45,7 +45,7 @@ void Task::calcProgress(int parts, int whole) void Task::setProgress(int progress) { this->progress = progress; - emit progressChanged(progress); + emitProgressChange(progress); } void Task::startTask() @@ -55,7 +55,29 @@ void Task::startTask() void Task::run() { - emit taskStarted(this); + emitStarted(); executeTask(); - emit taskEnded(this); + emitEnded(); +} + +void Task::emitStarted() +{ + emit started(); + emit started(this); +} + +void Task::emitEnded() +{ + emit ended(); + emit ended(this); +} + +void Task::emitStatusChange(const QString &status) +{ + emit statusChanged(status); +} + +void Task::emitProgressChange(int progress) +{ + emit progressChanged(progress); }