summaryrefslogtreecommitdiffstats
path: root/logic/tasks/SequentialTask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'logic/tasks/SequentialTask.cpp')
-rw-r--r--logic/tasks/SequentialTask.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/logic/tasks/SequentialTask.cpp b/logic/tasks/SequentialTask.cpp
new file mode 100644
index 00000000..63025eee
--- /dev/null
+++ b/logic/tasks/SequentialTask.cpp
@@ -0,0 +1,77 @@
+#include "SequentialTask.h"
+
+SequentialTask::SequentialTask(QObject *parent) :
+ Task(parent), m_currentIndex(-1)
+{
+
+}
+
+QString SequentialTask::getStatus() const
+{
+ if (m_queue.isEmpty() || m_currentIndex >= m_queue.size())
+ {
+ return QString();
+ }
+ return m_queue.at(m_currentIndex)->getStatus();
+}
+
+void SequentialTask::getProgress(qint64 &current, qint64 &total)
+{
+ current = 0;
+ total = 0;
+ for (int i = 0; i < m_queue.size(); ++i)
+ {
+ qint64 subCurrent, subTotal;
+ m_queue.at(i)->getProgress(subCurrent, subTotal);
+ current += subCurrent;
+ total += subTotal;
+ }
+}
+
+void SequentialTask::addTask(std::shared_ptr<Task> task)
+{
+ m_queue.append(task);
+}
+
+void SequentialTask::executeTask()
+{
+ m_currentIndex = -1;
+ startNext();
+}
+
+void SequentialTask::startNext()
+{
+ if (m_currentIndex != -1)
+ {
+ std::shared_ptr<Task> previous = m_queue[m_currentIndex];
+ disconnect(previous.get(), 0, this, 0);
+ }
+ m_currentIndex++;
+ if (m_queue.isEmpty() || m_currentIndex >= m_queue.size())
+ {
+ emitSucceeded();
+ return;
+ }
+ std::shared_ptr<Task> next = m_queue[m_currentIndex];
+ connect(next.get(), SIGNAL(failed(QString)), this, SLOT(subTaskFailed(QString)));
+ connect(next.get(), SIGNAL(status(QString)), this, SLOT(subTaskStatus(QString)));
+ connect(next.get(), SIGNAL(progress(qint64,qint64)), this, SLOT(subTaskProgress()));
+ connect(next.get(), SIGNAL(succeeded()), this, SLOT(startNext()));
+ next->start();
+ emit status(getStatus());
+}
+
+void SequentialTask::subTaskFailed(const QString &msg)
+{
+ emitFailed(msg);
+}
+void SequentialTask::subTaskStatus(const QString &msg)
+{
+ setStatus(msg);
+}
+void SequentialTask::subTaskProgress()
+{
+ qint64 current, total;
+ getProgress(current, total);
+ setProgress(100 * current / total);
+}