Implement legacy forge button!

Many refactors of the task system.
Progress dialog now accepts generic ProgressProvider objects
This commit is contained in:
Petr Mrázek 2013-09-18 00:00:35 +02:00
parent d38b90530b
commit b979d0ce5d
28 changed files with 296 additions and 236 deletions

View File

@ -156,7 +156,7 @@ gui/mainwindow.h
gui/settingsdialog.h gui/settingsdialog.h
gui/newinstancedialog.h gui/newinstancedialog.h
gui/logindialog.h gui/logindialog.h
gui/taskdialog.h gui/ProgressDialog.h
gui/aboutdialog.h gui/aboutdialog.h
gui/consolewindow.h gui/consolewindow.h
gui/instancedelegate.h gui/instancedelegate.h
@ -228,6 +228,7 @@ logic/EnabledItemFilter.h
# Tasks # Tasks
logic/tasks/Task.h logic/tasks/Task.h
logic/tasks/LoginTask.h logic/tasks/LoginTask.h
logic/tasks/ProgressProvider.h
) )
@ -239,13 +240,14 @@ gui/mainwindow.cpp
gui/settingsdialog.cpp gui/settingsdialog.cpp
gui/newinstancedialog.cpp gui/newinstancedialog.cpp
gui/logindialog.cpp gui/logindialog.cpp
gui/taskdialog.cpp
gui/aboutdialog.cpp gui/aboutdialog.cpp
gui/consolewindow.cpp gui/consolewindow.cpp
gui/instancedelegate.cpp gui/instancedelegate.cpp
gui/versionselectdialog.cpp gui/versionselectdialog.cpp
gui/lwjglselectdialog.cpp gui/lwjglselectdialog.cpp
gui/instancesettings.cpp gui/instancesettings.cpp
gui/ProgressDialog.cpp
gui/IconPickerDialog.cpp gui/IconPickerDialog.cpp
gui/LegacyModEditDialog.cpp gui/LegacyModEditDialog.cpp
gui/OneSixModEditDialog.cpp gui/OneSixModEditDialog.cpp
@ -313,12 +315,13 @@ gui/mainwindow.ui
gui/settingsdialog.ui gui/settingsdialog.ui
gui/newinstancedialog.ui gui/newinstancedialog.ui
gui/logindialog.ui gui/logindialog.ui
gui/taskdialog.ui
gui/aboutdialog.ui gui/aboutdialog.ui
gui/consolewindow.ui gui/consolewindow.ui
gui/versionselectdialog.ui gui/versionselectdialog.ui
gui/lwjglselectdialog.ui gui/lwjglselectdialog.ui
gui/instancesettings.ui gui/instancesettings.ui
gui/ProgressDialog.ui
gui/IconPickerDialog.ui gui/IconPickerDialog.ui
gui/LegacyModEditDialog.ui gui/LegacyModEditDialog.ui
gui/OneSixModEditDialog.ui gui/OneSixModEditDialog.ui

View File

@ -282,6 +282,7 @@ void MultiMC::initHttpMetaCache()
m_metacache->addBase("assets", QDir("assets").absolutePath()); m_metacache->addBase("assets", QDir("assets").absolutePath());
m_metacache->addBase("versions", QDir("versions").absolutePath()); m_metacache->addBase("versions", QDir("versions").absolutePath());
m_metacache->addBase("libraries", QDir("libraries").absolutePath()); m_metacache->addBase("libraries", QDir("libraries").absolutePath());
m_metacache->addBase("minecraftforge", QDir("mods/minecraftforge").absolutePath());
m_metacache->Load(); m_metacache->Load();
} }

View File

@ -13,10 +13,15 @@
* limitations under the License. * limitations under the License.
*/ */
#include "MultiMC.h"
#include "LegacyModEditDialog.h" #include "LegacyModEditDialog.h"
#include "ModEditDialogCommon.h" #include "ModEditDialogCommon.h"
#include "versionselectdialog.h"
#include "ProgressDialog.h"
#include "ui_LegacyModEditDialog.h" #include "ui_LegacyModEditDialog.h"
#include <logic/ModList.h> #include "logic/ModList.h"
#include "logic/lists/ForgeVersionList.h"
#include <pathutils.h> #include <pathutils.h>
#include <QFileDialog> #include <QFileDialog>
#include <QDebug> #include <QDebug>
@ -194,7 +199,39 @@ void LegacyModEditDialog::on_addCoreBtn_clicked()
} }
void LegacyModEditDialog::on_addForgeBtn_clicked() void LegacyModEditDialog::on_addForgeBtn_clicked()
{ {
VersionSelectDialog vselect(MMC->forgelist(), this);
vselect.setFilter(1, m_inst->intendedVersionId());
if (vselect.exec() && vselect.selectedVersion())
{
ForgeVersionPtr forge = vselect.selectedVersion().dynamicCast<ForgeVersion>();
if(!forge)
return;
auto entry = MMC->metacache()->resolveEntry("minecraftforge", forge->filename);
if(entry->stale)
{
DownloadJob * fjob = new DownloadJob("Forge download");
fjob->add(forge->universal_url, entry);
ProgressDialog dlg(this);
dlg.exec(fjob);
if(dlg.result() == QDialog::Accepted)
{
m_jarmods->stopWatching();
m_jarmods->installMod(QFileInfo(entry->getFullPath()));
m_jarmods->startWatching();
}
else
{
// failed to download forge :/
}
}
else
{
m_jarmods->stopWatching();
m_jarmods->installMod(QFileInfo(entry->getFullPath()));
m_jarmods->startWatching();
}
//m_selectedInstance->setIntendedVersionId(->descriptor());
}
} }
void LegacyModEditDialog::on_addJarBtn_clicked() void LegacyModEditDialog::on_addJarBtn_clicked()
{ {

View File

@ -17,6 +17,7 @@
#include <QDialog> #include <QDialog>
#include "logic/LegacyInstance.h" #include "logic/LegacyInstance.h"
#include <logic/net/DownloadJob.h>
namespace Ui { namespace Ui {
class LegacyModEditDialog; class LegacyModEditDialog;
@ -64,4 +65,5 @@ private:
QSharedPointer<ModList> m_jarmods; QSharedPointer<ModList> m_jarmods;
QSharedPointer<ModList> m_texturepacks; QSharedPointer<ModList> m_texturepacks;
LegacyInstance * m_inst; LegacyInstance * m_inst;
DownloadJobPtr forgeJob;
}; };

View File

@ -52,9 +52,6 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="addForgeBtn"> <widget class="QPushButton" name="addForgeBtn">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>MCForge</string> <string>MCForge</string>
</property> </property>

View File

@ -12,18 +12,21 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#include "MultiMC.h"
#include "OneSixModEditDialog.h" #include "OneSixModEditDialog.h"
#include "ModEditDialogCommon.h" #include "ModEditDialogCommon.h"
#include "ui_OneSixModEditDialog.h" #include "ui_OneSixModEditDialog.h"
#include <logic/ModList.h> #include "logic/ModList.h"
#include "logic/OneSixVersion.h"
#include "logic/EnabledItemFilter.h"
#include "logic/lists/ForgeVersionList.h"
#include "gui/versionselectdialog.h"
#include <pathutils.h> #include <pathutils.h>
#include <QFileDialog> #include <QFileDialog>
#include <QDebug> #include <QDebug>
#include <QEvent> #include <QEvent>
#include <QKeyEvent> #include <QKeyEvent>
#include "logic/OneSixVersion.h"
#include <logic/EnabledItemFilter.h>
OneSixModEditDialog::OneSixModEditDialog(OneSixInstance * inst, QWidget *parent): OneSixModEditDialog::OneSixModEditDialog(OneSixInstance * inst, QWidget *parent):
m_inst(inst), m_inst(inst),
@ -66,6 +69,17 @@ OneSixModEditDialog::~OneSixModEditDialog()
delete ui; delete ui;
} }
void OneSixModEditDialog::on_forgeBtn_clicked()
{
VersionSelectDialog vselect(MMC->forgelist(), this);
vselect.setFilter(1, m_inst->currentVersionId());
if (vselect.exec() && vselect.selectedVersion())
{
//m_selectedInstance->setIntendedVersionId(vselect.selectedVersion()->descriptor());
}
}
bool OneSixModEditDialog::loaderListFilter ( QKeyEvent* keyEvent ) bool OneSixModEditDialog::loaderListFilter ( QKeyEvent* keyEvent )
{ {
switch(keyEvent->key()) switch(keyEvent->key())

View File

@ -40,6 +40,7 @@ private slots:
void on_viewResPackBtn_clicked(); void on_viewResPackBtn_clicked();
// Questionable: SettingsDialog doesn't need this for some reason? // Questionable: SettingsDialog doesn't need this for some reason?
void on_buttonBox_rejected(); void on_buttonBox_rejected();
void on_forgeBtn_clicked();
protected: protected:
bool eventFilter(QObject *obj, QEvent *ev); bool eventFilter(QObject *obj, QEvent *ev);
bool loaderListFilter( QKeyEvent* ev ); bool loaderListFilter( QKeyEvent* ev );

View File

@ -64,7 +64,7 @@
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item> <item>
<widget class="QPushButton" name="forgeBrn"> <widget class="QPushButton" name="forgeBtn">
<property name="toolTip"> <property name="toolTip">
<string>Replace any current custom version with Minecraft Forge</string> <string>Replace any current custom version with Minecraft Forge</string>
</property> </property>

View File

@ -13,88 +13,89 @@
* limitations under the License. * limitations under the License.
*/ */
#include "taskdialog.h" #include "ProgressDialog.h"
#include "ui_taskdialog.h" #include "ui_ProgressDialog.h"
#include <QKeyEvent> #include <QKeyEvent>
#include "logic/tasks/Task.h" #include "logic/tasks/Task.h"
TaskDialog::TaskDialog(QWidget *parent) : ProgressDialog::ProgressDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::TaskDialog) ui(new Ui::ProgressDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
updateSize(); updateSize();
changeProgress(0); changeProgress(0,100);
} }
TaskDialog::~TaskDialog() ProgressDialog::~ProgressDialog()
{ {
delete ui; delete ui;
} }
void TaskDialog::updateSize() void ProgressDialog::updateSize()
{ {
resize(QSize(480, minimumSizeHint().height())); resize(QSize(480, minimumSizeHint().height()));
} }
void TaskDialog::exec(Task *task) int ProgressDialog::exec(ProgressProvider *task)
{ {
this->task = task; this->task = task;
// Connect signals. // Connect signals.
connect(task, SIGNAL(started()), SLOT(onTaskStarted())); connect(task, SIGNAL(started()), SLOT(onTaskStarted()));
connect(task, SIGNAL(failed(QString)), SLOT(onTaskEnded())); connect(task, SIGNAL(failed(QString)), SLOT(onTaskFailed(QString)));
connect(task, SIGNAL(succeeded()), SLOT(onTaskEnded())); connect(task, SIGNAL(succeeded()), SLOT(onTaskSucceeded()));
connect(task, SIGNAL(statusChanged(const QString&)), SLOT(changeStatus(const QString&))); connect(task, SIGNAL(status(QString)), SLOT(changeStatus(const QString&)));
connect(task, SIGNAL(progressChanged(int)), SLOT(changeProgress(int))); connect(task, SIGNAL(progress(qint64,qint64)), SLOT(changeProgress(qint64,qint64)));
// this makes sure that the task is started after the dialog is created // this makes sure that the task is started after the dialog is created
QMetaObject::invokeMethod(task, "startTask", Qt::QueuedConnection); QMetaObject::invokeMethod(task, "start", Qt::QueuedConnection);
QDialog::exec(); return QDialog::exec();
} }
Task* TaskDialog::getTask() ProgressProvider* ProgressDialog::getTask()
{ {
return task; return task;
} }
void TaskDialog::onTaskStarted() void ProgressDialog::onTaskStarted()
{ {
} }
void TaskDialog::onTaskEnded() void ProgressDialog::onTaskFailed(QString failure)
{ {
close(); reject();
} }
void TaskDialog::changeStatus(const QString &status) void ProgressDialog::onTaskSucceeded()
{
accept();
}
void ProgressDialog::changeStatus(const QString &status)
{ {
ui->statusLabel->setText(status); ui->statusLabel->setText(status);
updateSize(); updateSize();
} }
void TaskDialog::changeProgress(int progress) void ProgressDialog::changeProgress(qint64 current, qint64 total)
{ {
if (progress < 0) ui->taskProgressBar->setMaximum(total);
progress = 0; ui->taskProgressBar->setValue(current);
else if (progress > 100)
progress = 100;
ui->taskProgressBar->setValue(progress);
} }
void TaskDialog::keyPressEvent(QKeyEvent* e) void ProgressDialog::keyPressEvent(QKeyEvent* e)
{ {
if (e->key() == Qt::Key_Escape) if (e->key() == Qt::Key_Escape)
return; return;
QDialog::keyPressEvent(e); QDialog::keyPressEvent(e);
} }
void TaskDialog::closeEvent(QCloseEvent* e) void ProgressDialog::closeEvent(QCloseEvent* e)
{ {
if (task && task->isRunning()) if (task && task->isRunning())
{ {

View File

@ -18,32 +18,33 @@
#include <QDialog> #include <QDialog>
class Task; class ProgressProvider;
namespace Ui { namespace Ui {
class TaskDialog; class ProgressDialog;
} }
class TaskDialog : public QDialog class ProgressDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TaskDialog(QWidget *parent = 0); explicit ProgressDialog(QWidget *parent = 0);
~TaskDialog(); ~ProgressDialog();
void updateSize(); void updateSize();
void exec(Task* task); int exec(ProgressProvider* task);
Task* getTask(); ProgressProvider* getTask();
public slots: public slots:
void onTaskStarted(); void onTaskStarted();
void onTaskEnded(); void onTaskFailed(QString failure);
void onTaskSucceeded();
void changeStatus(const QString& status); void changeStatus(const QString& status);
void changeProgress(int progress); void changeProgress(qint64 current, qint64 total);
signals: signals:
@ -53,9 +54,9 @@ protected:
virtual void closeEvent(QCloseEvent* e); virtual void closeEvent(QCloseEvent* e);
private: private:
Ui::TaskDialog *ui; Ui::ProgressDialog *ui;
Task* task; ProgressProvider* task;
}; };
#endif // TASKDIALOG_H #endif // TASKDIALOG_H

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>TaskDialog</class> <class>ProgressDialog</class>
<widget class="QDialog" name="TaskDialog"> <widget class="QDialog" name="ProgressDialog">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>400</width>
<height>58</height> <height>68</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">

View File

@ -42,7 +42,7 @@
#include "gui/settingsdialog.h" #include "gui/settingsdialog.h"
#include "gui/newinstancedialog.h" #include "gui/newinstancedialog.h"
#include "gui/logindialog.h" #include "gui/logindialog.h"
#include "gui/taskdialog.h" #include "gui/ProgressDialog.h"
#include "gui/aboutdialog.h" #include "gui/aboutdialog.h"
#include "gui/versionselectdialog.h" #include "gui/versionselectdialog.h"
#include "gui/lwjglselectdialog.h" #include "gui/lwjglselectdialog.h"
@ -479,7 +479,7 @@ void MainWindow::doLogin(const QString& errorMsg)
{ {
UserInfo uInfo{loginDlg->getUsername(), loginDlg->getPassword()}; UserInfo uInfo{loginDlg->getUsername(), loginDlg->getPassword()};
TaskDialog* tDialog = new TaskDialog(this); ProgressDialog* tDialog = new ProgressDialog(this);
LoginTask* loginTask = new LoginTask(uInfo, tDialog); LoginTask* loginTask = new LoginTask(uInfo, tDialog);
connect(loginTask, SIGNAL(succeeded()),SLOT(onLoginComplete()), Qt::QueuedConnection); connect(loginTask, SIGNAL(succeeded()),SLOT(onLoginComplete()), Qt::QueuedConnection);
connect(loginTask, SIGNAL(failed(QString)), SLOT(doLogin(QString)), Qt::QueuedConnection); connect(loginTask, SIGNAL(failed(QString)), SLOT(doLogin(QString)), Qt::QueuedConnection);
@ -512,7 +512,7 @@ void MainWindow::onLoginComplete()
} }
else else
{ {
TaskDialog *tDialog = new TaskDialog(this); ProgressDialog *tDialog = new ProgressDialog(this);
connect(updateTask, SIGNAL(succeeded()),SLOT(onGameUpdateComplete())); connect(updateTask, SIGNAL(succeeded()),SLOT(onGameUpdateComplete()));
connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString))); connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
tDialog->exec(updateTask); tDialog->exec(updateTask);
@ -575,7 +575,7 @@ void MainWindow::startTask(Task *task)
connect(task, SIGNAL(started()), SLOT(taskStart())); connect(task, SIGNAL(started()), SLOT(taskStart()));
connect(task, SIGNAL(succeeded()), SLOT(taskEnd())); connect(task, SIGNAL(succeeded()), SLOT(taskEnd()));
connect(task, SIGNAL(failed(QString)), SLOT(taskEnd())); connect(task, SIGNAL(failed(QString)), SLOT(taskEnd()));
task->startTask(); task->start();
} }

View File

@ -24,7 +24,7 @@
#include "logic/tasks/Task.h" #include "logic/tasks/Task.h"
#include "versionselectdialog.h" #include "versionselectdialog.h"
#include "taskdialog.h" #include "ProgressDialog.h"
#include "IconPickerDialog.h" #include "IconPickerDialog.h"
#include <QLayout> #include <QLayout>

View File

@ -20,7 +20,7 @@
#include <QDebug> #include <QDebug>
#include <gui/taskdialog.h> #include <gui/ProgressDialog.h>
#include <logic/BaseVersion.h> #include <logic/BaseVersion.h>
#include <logic/lists/BaseVersionList.h> #include <logic/lists/BaseVersionList.h>
@ -41,11 +41,6 @@ VersionSelectDialog::VersionSelectDialog(BaseVersionList *vlist, QWidget *parent
ui->listView->setModel(m_proxyModel); ui->listView->setModel(m_proxyModel);
ui->listView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); ui->listView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->listView->header()->setSectionResizeMode(0, QHeaderView::Stretch); ui->listView->header()->setSectionResizeMode(0, QHeaderView::Stretch);
connect(ui->filterSnapshotsCheckbox, SIGNAL(clicked()), SLOT(updateFilterState()));
connect(ui->filterMCNostalgiaCheckbox, SIGNAL(clicked()), SLOT(updateFilterState()));
updateFilterState();
} }
VersionSelectDialog::~VersionSelectDialog() VersionSelectDialog::~VersionSelectDialog()
@ -63,7 +58,7 @@ int VersionSelectDialog::exec()
void VersionSelectDialog::loadList() void VersionSelectDialog::loadList()
{ {
TaskDialog *taskDlg = new TaskDialog(this); ProgressDialog *taskDlg = new ProgressDialog(this);
Task *loadTask = m_vlist->getLoadTask(); Task *loadTask = m_vlist->getLoadTask();
loadTask->setParent(taskDlg); loadTask->setParent(taskDlg);
taskDlg->exec(loadTask); taskDlg->exec(loadTask);
@ -81,10 +76,11 @@ void VersionSelectDialog::on_refreshButton_clicked()
loadList(); loadList();
} }
void VersionSelectDialog::updateFilterState() void VersionSelectDialog::setFilter(int column, QString filter)
{ {
m_proxyModel->setFilterKeyColumn(BaseVersionList::TypeColumn); m_proxyModel->setFilterKeyColumn(column);
m_proxyModel->setFilterFixedString(filter);
/*
QStringList filteredTypes; QStringList filteredTypes;
if (!ui->filterSnapshotsCheckbox->isChecked()) if (!ui->filterSnapshotsCheckbox->isChecked())
filteredTypes += "Snapshot"; filteredTypes += "Snapshot";
@ -96,6 +92,5 @@ void VersionSelectDialog::updateFilterState()
regexStr = QString("^((?!%1).)*$").arg(filteredTypes.join('|')); regexStr = QString("^((?!%1).)*$").arg(filteredTypes.join('|'));
qDebug() << "Filter:" << regexStr; qDebug() << "Filter:" << regexStr;
*/
m_proxyModel->setFilterRegExp(regexStr);
} }

View File

@ -43,11 +43,10 @@ public:
BaseVersionPtr selectedVersion() const; BaseVersionPtr selectedVersion() const;
void setFilter(int column, QString filter);
private slots: private slots:
void on_refreshButton_clicked(); void on_refreshButton_clicked();
void updateFilterState();
private: private:
Ui::VersionSelectDialog *ui; Ui::VersionSelectDialog *ui;

View File

@ -39,75 +39,6 @@
</attribute> </attribute>
</widget> </widget>
</item> </item>
<item>
<layout class="QHBoxLayout" name="filterCheckboxLayout1">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="filterSnapshotsCheckbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Show &amp;snapshots?</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="filterMCNostalgiaCheckbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Show &amp;Nostalgia?</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>

View File

@ -7,7 +7,5 @@ BaseUpdate::BaseUpdate ( BaseInstance* inst, QObject* parent ) : Task ( parent )
void BaseUpdate::updateDownloadProgress(qint64 current, qint64 total) void BaseUpdate::updateDownloadProgress(qint64 current, qint64 total)
{ {
// The progress on the current file is current / total emit progress(current, total);
float currentDLProgress = (float) current / (float) total;
setProgress((int)(currentDLProgress * 100)); // convert to percentage
} }

View File

@ -3,7 +3,7 @@
#include <iostream> #include <iostream>
#include "gui/logindialog.h" #include "gui/logindialog.h"
#include "gui/taskdialog.h" #include "gui/ProgressDialog.h"
#include "gui/consolewindow.h" #include "gui/consolewindow.h"
#include "logic/tasks/LoginTask.h" #include "logic/tasks/LoginTask.h"
#include "logic/MinecraftProcess.h" #include "logic/MinecraftProcess.h"
@ -48,7 +48,7 @@ void InstanceLauncher::doLogin ( const QString& errorMsg )
{ {
UserInfo uInfo {loginDlg->getUsername(), loginDlg->getPassword() }; UserInfo uInfo {loginDlg->getUsername(), loginDlg->getPassword() };
TaskDialog* tDialog = new TaskDialog ( nullptr ); ProgressDialog* tDialog = new ProgressDialog ( nullptr );
LoginTask* loginTask = new LoginTask ( uInfo, tDialog ); LoginTask* loginTask = new LoginTask ( uInfo, tDialog );
connect ( loginTask, SIGNAL ( succeeded() ),SLOT ( onLoginComplete() ), Qt::QueuedConnection ); connect ( loginTask, SIGNAL ( succeeded() ),SLOT ( onLoginComplete() ), Qt::QueuedConnection );
connect ( loginTask, SIGNAL ( failed ( QString ) ),SLOT ( doLogin ( QString ) ), Qt::QueuedConnection ); connect ( loginTask, SIGNAL ( failed ( QString ) ),SLOT ( doLogin ( QString ) ), Qt::QueuedConnection );

View File

@ -59,7 +59,7 @@ void LegacyUpdate::lwjglStart()
QNetworkReply * rep = worker->get ( req ); QNetworkReply * rep = worker->get ( req );
m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater); m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64))); connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SIGNAL(progress(qint64,qint64)));
connect(worker, SIGNAL(finished(QNetworkReply*)), SLOT(lwjglFinished(QNetworkReply*))); connect(worker, SIGNAL(finished(QNetworkReply*)), SLOT(lwjglFinished(QNetworkReply*)));
//connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(downloadError(QNetworkReply::NetworkError))); //connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(downloadError(QNetworkReply::NetworkError)));
} }
@ -97,7 +97,7 @@ void LegacyUpdate::lwjglFinished(QNetworkReply* reply)
req.setRawHeader("Host", hostname.toLatin1()); req.setRawHeader("Host", hostname.toLatin1());
req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)"); req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
QNetworkReply * rep = worker->get(req); QNetworkReply * rep = worker->get(req);
connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64))); connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SIGNAL(progress(qint64,qint64)));
m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater); m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
return; return;
} }
@ -232,7 +232,7 @@ void LegacyUpdate::jarStart()
legacyDownloadJob.reset(dljob); legacyDownloadJob.reset(dljob);
connect(dljob, SIGNAL(succeeded()), SLOT(jarFinished())); connect(dljob, SIGNAL(succeeded()), SLOT(jarFinished()));
connect(dljob, SIGNAL(failed()), SLOT(jarFailed())); connect(dljob, SIGNAL(failed()), SLOT(jarFailed()));
connect(dljob, SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64))); connect(dljob, SIGNAL(progress(qint64,qint64)), SIGNAL(progress(qint64,qint64)));
legacyDownloadJob->start(); legacyDownloadJob->start();
} }

View File

@ -78,7 +78,7 @@ void OneSixUpdate::versionFileStart()
specificVersionDownloadJob.reset(job); specificVersionDownloadJob.reset(job);
connect(specificVersionDownloadJob.data(), SIGNAL(succeeded()), SLOT(versionFileFinished())); connect(specificVersionDownloadJob.data(), SIGNAL(succeeded()), SLOT(versionFileFinished()));
connect(specificVersionDownloadJob.data(), SIGNAL(failed()), SLOT(versionFileFailed())); connect(specificVersionDownloadJob.data(), SIGNAL(failed()), SLOT(versionFileFailed()));
connect(specificVersionDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64))); connect(specificVersionDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SIGNAL(progress(qint64,qint64)));
specificVersionDownloadJob->start(); specificVersionDownloadJob->start();
} }
@ -171,7 +171,7 @@ void OneSixUpdate::jarlibStart()
} }
connect(jarlibDownloadJob.data(), SIGNAL(succeeded()), SLOT(jarlibFinished())); connect(jarlibDownloadJob.data(), SIGNAL(succeeded()), SLOT(jarlibFinished()));
connect(jarlibDownloadJob.data(), SIGNAL(failed()), SLOT(jarlibFailed())); connect(jarlibDownloadJob.data(), SIGNAL(failed()), SLOT(jarlibFailed()));
connect(jarlibDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64))); connect(jarlibDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SIGNAL(progress(qint64,qint64)));
jarlibDownloadJob->start(); jarlibDownloadJob->start();
} }

View File

@ -50,21 +50,90 @@ int ForgeVersionList::count() const
{ {
return m_vlist.count(); return m_vlist.count();
} }
/*
bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second) int ForgeVersionList::columnCount(const QModelIndex& parent) const
{ {
const BaseVersion & left = *first; return 3;
const BaseVersion & right = *second;
return left > right;
} }
void MinecraftVersionList::sort() QVariant ForgeVersionList::data(const QModelIndex &index, int role) const
{ {
beginResetModel(); if (!index.isValid())
qSort(m_vlist.begin(), m_vlist.end(), cmpVersions); return QVariant();
endResetModel();
if (index.row() > count())
return QVariant();
auto version = m_vlist[index.row()].dynamicCast<ForgeVersion>();
switch (role)
{
case Qt::DisplayRole:
switch (index.column())
{
case 0:
return version->name();
case 1:
return version->mcver;
case 2:
return version->typeString();
default:
return QVariant();
} }
*/
case Qt::ToolTipRole:
return version->descriptor();
case VersionPointerRole:
return qVariantFromValue(m_vlist[index.row()]);
default:
return QVariant();
}
}
QVariant ForgeVersionList::headerData(int section, Qt::Orientation orientation, int role) const
{
switch (role)
{
case Qt::DisplayRole:
switch (section)
{
case 0:
return "Version";
case 1:
return "Minecraft";
case 2:
return "Type";
default:
return QVariant();
}
case Qt::ToolTipRole:
switch (section)
{
case 0:
return "The name of the version.";
case 1:
return "Minecraft version";
case 2:
return "The version's type.";
default:
return QVariant();
}
default:
return QVariant();
}
}
BaseVersionPtr ForgeVersionList::getLatestStable() const BaseVersionPtr ForgeVersionList::getLatestStable() const
{ {
return BaseVersionPtr(); return BaseVersionPtr();
@ -99,7 +168,7 @@ void ForgeListLoadTask::executeTask()
listJob.reset(job); listJob.reset(job);
connect(listJob.data(), SIGNAL(succeeded()), SLOT(list_downloaded())); connect(listJob.data(), SIGNAL(succeeded()), SLOT(list_downloaded()));
connect(listJob.data(), SIGNAL(failed()), SLOT(versionFileFailed())); connect(listJob.data(), SIGNAL(failed()), SLOT(versionFileFailed()));
connect(listJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64))); connect(listJob.data(), SIGNAL(progress(qint64,qint64)), SIGNAL(progress(qint64,qint64)));
listJob->start(); listJob->start();
} }
@ -148,7 +217,7 @@ void ForgeListLoadTask::list_downloaded()
int build_nr = obj.value("build").toDouble(0); int build_nr = obj.value("build").toDouble(0);
if(!build_nr) if(!build_nr)
continue; continue;
QJsonArray files = root.value("files").toArray(); QJsonArray files = obj.value("files").toArray();
QString url, jobbuildver, mcver, buildtype, filename; QString url, jobbuildver, mcver, buildtype, filename;
QString changelog_url, installer_url; QString changelog_url, installer_url;
bool valid = false; bool valid = false;

View File

@ -26,7 +26,7 @@
#include "logic/net/DownloadJob.h" #include "logic/net/DownloadJob.h"
class ForgeVersion; class ForgeVersion;
typedef QSharedPointer<ForgeVersion> PtrForgeVersion; typedef QSharedPointer<ForgeVersion> ForgeVersionPtr;
struct ForgeVersion : public BaseVersion struct ForgeVersion : public BaseVersion
{ {
@ -36,7 +36,7 @@ struct ForgeVersion : public BaseVersion
}; };
virtual QString name() virtual QString name()
{ {
return "Forge " + jobbuildver + " (" + mcver + ")"; return "Forge " + jobbuildver;
}; };
virtual QString typeString() const virtual QString typeString() const
{ {
@ -71,6 +71,10 @@ public:
virtual BaseVersionPtr getLatestStable() const; virtual BaseVersionPtr getLatestStable() const;
virtual QVariant data(const QModelIndex& index, int role) const;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
virtual int columnCount(const QModelIndex& parent) const;
protected: protected:
QList<BaseVersionPtr> m_vlist; QList<BaseVersionPtr> m_vlist;

View File

@ -5,6 +5,8 @@
#include "ByteArrayDownload.h" #include "ByteArrayDownload.h"
#include "CacheDownload.h" #include "CacheDownload.h"
#include <QDebug>
ByteArrayDownloadPtr DownloadJob::add ( QUrl url ) ByteArrayDownloadPtr DownloadJob::add ( QUrl url )
{ {
ByteArrayDownloadPtr ptr (new ByteArrayDownload(url)); ByteArrayDownloadPtr ptr (new ByteArrayDownload(url));

View File

@ -5,6 +5,7 @@
#include "FileDownload.h" #include "FileDownload.h"
#include "CacheDownload.h" #include "CacheDownload.h"
#include "HttpMetaCache.h" #include "HttpMetaCache.h"
#include "logic/tasks/ProgressProvider.h"
class DownloadJob; class DownloadJob;
typedef QSharedPointer<DownloadJob> DownloadJobPtr; typedef QSharedPointer<DownloadJob> DownloadJobPtr;
@ -12,12 +13,12 @@ typedef QSharedPointer<DownloadJob> DownloadJobPtr;
/** /**
* A single file for the downloader/cache to process. * A single file for the downloader/cache to process.
*/ */
class DownloadJob : public QObject class DownloadJob : public ProgressProvider
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit DownloadJob(QString job_name) explicit DownloadJob(QString job_name)
:QObject(), m_job_name(job_name){}; :ProgressProvider(), m_job_name(job_name){};
ByteArrayDownloadPtr add(QUrl url); ByteArrayDownloadPtr add(QUrl url);
FileDownloadPtr add(QUrl url, QString rel_target_path); FileDownloadPtr add(QUrl url, QString rel_target_path);
@ -37,6 +38,19 @@ public:
{ {
return downloads.size(); return downloads.size();
} }
virtual void getProgress(qint64& current, qint64& total)
{
current = current_progress;
total = total_progress;
};
virtual QString getStatus() const
{
return m_job_name;
};
virtual bool isRunning() const
{
return m_running;
};
signals: signals:
void started(); void started();
void progress(qint64 current, qint64 total); void progress(qint64 current, qint64 total);
@ -56,5 +70,6 @@ private:
qint64 total_progress = 0; qint64 total_progress = 0;
int num_succeeded = 0; int num_succeeded = 0;
int num_failed = 0; int num_failed = 0;
bool m_running = false;
}; };

View File

@ -0,0 +1,20 @@
#pragma once
#include <QObject>
class ProgressProvider : public QObject
{
Q_OBJECT
protected:
explicit ProgressProvider(QObject* parent = 0): QObject(parent){}
signals:
void started();
void progress(qint64 current, qint64 total);
void succeeded();
void failed(QString reason);
void status(QString status);
public:
virtual QString getStatus() const = 0;
virtual void getProgress(qint64 &current, qint64 &total) = 0;
virtual bool isRunning() const = 0;
public slots:
virtual void start() = 0;
};

View File

@ -16,70 +16,56 @@
#include "Task.h" #include "Task.h"
Task::Task(QObject *parent) : Task::Task(QObject *parent) :
QObject(parent) ProgressProvider(parent)
{ {
} }
QString Task::getStatus() const QString Task::getStatus() const
{ {
return status; return m_status;
} }
void Task::setStatus(const QString &status) void Task::setStatus(const QString &new_status)
{ {
this->status = status; m_status = new_status;
emitStatusChange(status); emit status(new_status);
} }
int Task::getProgress() const void Task::setProgress(int new_progress)
{ {
return progress; m_progress = new_progress;
emit progress(new_progress, 100);
} }
void Task::setProgress(int progress) void Task::getProgress(qint64& current, qint64& total)
{ {
this->progress = progress; current = m_progress;
emitProgressChange(progress); total = 100;
} }
void Task::startTask()
{
emitStarted();
executeTask();
}
void Task::emitStarted() void Task::start()
{ {
running = true; m_running = true;
emit started(); emit started();
executeTask();
} }
void Task::emitFailed(QString reason) void Task::emitFailed(QString reason)
{ {
running = false; m_running = false;
emit failed(reason); emit failed(reason);
} }
void Task::emitSucceeded() void Task::emitSucceeded()
{ {
running = false; m_running = false;
emit succeeded(); emit succeeded();
} }
bool Task::isRunning() const bool Task::isRunning() const
{ {
return running; return m_running;
}
void Task::emitStatusChange(const QString &status)
{
emit statusChanged(status);
}
void Task::emitProgressChange(int progress)
{
emit progressChanged(progress);
} }

View File

@ -13,53 +13,37 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef TASK_H #pragma once
#define TASK_H
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include "ProgressProvider.h"
class Task : public QObject class Task : public ProgressProvider
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Task(QObject *parent = 0); explicit Task(QObject *parent = 0);
QString getStatus() const; virtual QString getStatus() const;
int getProgress() const; virtual void getProgress(qint64& current, qint64& total);
bool isRunning() const; virtual bool isRunning() const;
public slots: public slots:
void startTask(); virtual void start();
protected:
virtual void executeTask() = 0;
virtual void emitSucceeded();
virtual void emitFailed(QString reason);
protected slots: protected slots:
void setStatus(const QString& status); void setStatus(const QString& status);
void setProgress(int progress); void setProgress(int progress);
signals:
void started();
void failed(QString reason);
void succeeded();
void statusChanged(Task* task, const QString& status);
void progressChanged(Task* task, int progress);
void statusChanged(const QString& status);
void progressChanged(int progress);
protected: protected:
virtual void executeTask() = 0; QString m_status;
int m_progress = 0;
virtual void emitStarted(); bool m_running = false;
virtual void emitFailed(QString reason);
virtual void emitSucceeded();
virtual void emitStatusChange(const QString &status);
virtual void emitProgressChange(int progress);
QString status;
int progress;
bool running = false;
}; };
#endif // TASK_H