aboutsummaryrefslogtreecommitdiff
path: root/launcher/tasks
diff options
context:
space:
mode:
authorflow <thiagodonato300@gmail.com>2022-04-01 09:10:51 -0300
committerflow <thiagodonato300@gmail.com>2022-04-01 09:32:00 -0300
commit9b8493c30499e06bbef7b96ff415f80c140c1a7f (patch)
treef56773d7f046def84a98e45f741457767d3fb4e4 /launcher/tasks
parente22d54abd35560213377bb41f2bc902f67c8de64 (diff)
downloadPrismLauncher-9b8493c30499e06bbef7b96ff415f80c140c1a7f.tar.gz
PrismLauncher-9b8493c30499e06bbef7b96ff415f80c140c1a7f.tar.bz2
PrismLauncher-9b8493c30499e06bbef7b96ff415f80c140c1a7f.zip
feat: Use a single progress dialog when doing multiple tasks
This puts all mod downloading tasks inside a SequentialTask, which is, for more than one task, a multi step task. This is handled by the ProgressDialog by showing both the global progress of tasks executed, and the individual progress of each of them.
Diffstat (limited to 'launcher/tasks')
-rw-r--r--launcher/tasks/SequentialTask.cpp50
-rw-r--r--launcher/tasks/SequentialTask.h28
-rw-r--r--launcher/tasks/Task.h68
3 files changed, 92 insertions, 54 deletions
diff --git a/launcher/tasks/SequentialTask.cpp b/launcher/tasks/SequentialTask.cpp
index a66b9d78..1573e476 100644
--- a/launcher/tasks/SequentialTask.cpp
+++ b/launcher/tasks/SequentialTask.cpp
@@ -1,7 +1,23 @@
#include "SequentialTask.h"
-SequentialTask::SequentialTask(QObject *parent) : Task(parent), m_currentIndex(-1)
+SequentialTask::SequentialTask(QObject* parent, const QString& task_name) : Task(parent), m_name(task_name), m_currentIndex(-1) {}
+
+SequentialTask::~SequentialTask()
+{
+ for(auto task : m_queue){
+ if(task)
+ task->deleteLater();
+ }
+}
+
+auto SequentialTask::getStepProgress() const -> qint64
+{
+ return m_stepProgress;
+}
+
+auto SequentialTask::getStepTotalProgress() const -> qint64
{
+ return m_stepTotalProgress;
}
void SequentialTask::addTask(Task::Ptr task)
@@ -15,16 +31,24 @@ void SequentialTask::executeTask()
startNext();
}
+bool SequentialTask::abort()
+{
+ bool succeeded = true;
+ for (auto& task : m_queue) {
+ if (!task->abort()) succeeded = false;
+ }
+
+ return succeeded;
+}
+
void SequentialTask::startNext()
{
- if (m_currentIndex != -1)
- {
+ if (m_currentIndex != -1) {
Task::Ptr previous = m_queue[m_currentIndex];
disconnect(previous.get(), 0, this, 0);
}
m_currentIndex++;
- if (m_queue.isEmpty() || m_currentIndex >= m_queue.size())
- {
+ if (m_queue.isEmpty() || m_currentIndex >= m_queue.size()) {
emitSucceeded();
return;
}
@@ -33,23 +57,27 @@ void SequentialTask::startNext()
connect(next.get(), SIGNAL(status(QString)), this, SLOT(subTaskStatus(QString)));
connect(next.get(), SIGNAL(progress(qint64, qint64)), this, SLOT(subTaskProgress(qint64, qint64)));
connect(next.get(), SIGNAL(succeeded()), this, SLOT(startNext()));
+
+ setStatus(tr("Executing task %1 out of %2").arg(m_currentIndex + 1).arg(m_queue.size()));
next->start();
}
-void SequentialTask::subTaskFailed(const QString &msg)
+void SequentialTask::subTaskFailed(const QString& msg)
{
emitFailed(msg);
}
-void SequentialTask::subTaskStatus(const QString &msg)
+void SequentialTask::subTaskStatus(const QString& msg)
{
- setStatus(msg);
+ setStepStatus(m_queue[m_currentIndex]->getStatus());
}
void SequentialTask::subTaskProgress(qint64 current, qint64 total)
{
- if(total == 0)
- {
+ if (total == 0) {
setProgress(0, 100);
return;
}
- setProgress(current, total);
+ setProgress(m_currentIndex, m_queue.count());
+
+ m_stepProgress = current;
+ m_stepTotalProgress = total;
}
diff --git a/launcher/tasks/SequentialTask.h b/launcher/tasks/SequentialTask.h
index 027744f3..5b3c0111 100644
--- a/launcher/tasks/SequentialTask.h
+++ b/launcher/tasks/SequentialTask.h
@@ -9,13 +9,21 @@ class SequentialTask : public Task
{
Q_OBJECT
public:
- explicit SequentialTask(QObject *parent = 0);
- virtual ~SequentialTask() {};
+ explicit SequentialTask(QObject *parent = nullptr, const QString& task_name = "");
+ virtual ~SequentialTask();
+
+ inline auto isMultiStep() const -> bool override { return m_queue.size() > 1; };
+ auto getStepProgress() const -> qint64 override;
+ auto getStepTotalProgress() const -> qint64 override;
+
+ inline auto getStepStatus() const -> QString override { return m_step_status; }
void addTask(Task::Ptr task);
-protected:
- void executeTask();
+protected slots:
+ void executeTask() override;
+public slots:
+ bool abort() override;
private
slots:
@@ -24,7 +32,19 @@ slots:
void subTaskStatus(const QString &msg);
void subTaskProgress(qint64 current, qint64 total);
+signals:
+ void stepStatus(QString status);
+
private:
+ void setStepStatus(QString status) { m_step_status = status; };
+
+private:
+ QString m_name;
+ QString m_step_status;
+
QQueue<Task::Ptr > m_queue;
int m_currentIndex;
+
+ qint64 m_stepProgress = 0;
+ qint64 m_stepTotalProgress = 100;
};
diff --git a/launcher/tasks/Task.h b/launcher/tasks/Task.h
index 9cf08dbd..47c249b3 100644
--- a/launcher/tasks/Task.h
+++ b/launcher/tasks/Task.h
@@ -21,29 +21,27 @@
#include "QObjectPtr.h"
-class Task : public QObject
-{
+class Task : public QObject {
Q_OBJECT
-public:
+ public:
using Ptr = shared_qobject_ptr<Task>;
- enum class State
- {
- Inactive,
- Running,
- Succeeded,
- Failed,
- AbortedByUser
- };
+ enum class State { Inactive, Running, Succeeded, Failed, AbortedByUser };
-public:
- explicit Task(QObject *parent = 0);
- virtual ~Task() {};
+ public:
+ explicit Task(QObject* parent = 0);
+ virtual ~Task() = default;
bool isRunning() const;
bool isFinished() const;
bool wasSuccessful() const;
+ /*!
+ * MultiStep tasks are combinations of multiple tasks into a single logical task.
+ * The main usage of this is in SequencialTask.
+ */
+ virtual auto isMultiStep() const -> bool { return false; }
+
/*!
* Returns the string that was passed to emitFailed as the error message when the task failed.
* If the task hasn't failed, returns an empty string.
@@ -54,52 +52,45 @@ public:
virtual bool canAbort() const { return false; }
- QString getStatus()
- {
- return m_status;
- }
+ QString getStatus() { return m_status; }
+ virtual auto getStepStatus() const -> QString { return {}; }
- qint64 getProgress()
- {
- return m_progress;
- }
+ qint64 getProgress() { return m_progress; }
+ qint64 getTotalProgress() { return m_progressTotal; }
+ virtual auto getStepProgress() const -> qint64 { return 0; }
+ virtual auto getStepTotalProgress() const -> qint64 { return 100; }
- qint64 getTotalProgress()
- {
- return m_progressTotal;
- }
+ protected:
+ void logWarning(const QString& line);
-protected:
- void logWarning(const QString & line);
-
-private:
+ private:
QString describe();
-signals:
+ signals:
void started();
- void progress(qint64 current, qint64 total);
+ virtual void progress(qint64 current, qint64 total);
void finished();
void succeeded();
void failed(QString reason);
void status(QString status);
-public slots:
+ public slots:
virtual void start();
virtual bool abort() { return false; };
-protected:
+ protected:
virtual void executeTask() = 0;
-protected slots:
+ protected slots:
virtual void emitSucceeded();
virtual void emitAborted();
virtual void emitFailed(QString reason);
-public slots:
- void setStatus(const QString &status);
+ public slots:
+ void setStatus(const QString& status);
void setProgress(qint64 current, qint64 total);
-private:
+ private:
State m_state = State::Inactive;
QStringList m_Warnings;
QString m_failReason = "";
@@ -107,4 +98,3 @@ private:
int m_progress = 0;
int m_progressTotal = 100;
};
-