Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <QApplication>
- #include <QList>
- #include <QMainWindow>
- #include <QtTaskTree/QSingleTaskTreeRunner>
- #include <QPushButton>
- #include <QSpinBox>
- #include <QVBoxLayout>
- #include <QFormLayout>
- #include <QScrollArea>
- #include <QHBoxLayout>
- #include <QTextEdit>
- using namespace QtTaskTree;
- using namespace std::chrono;
- class TaskData
- {
- public:
- int id = 0;
- int length = 1;
- };
- class TaskList
- {
- public:
- QString addTask(int id, int length)
- {
- auto it = std::find_if(m_tasks.begin(), m_tasks.end(), [id](const TaskData &data) {
- return data.id == id;
- });
- if (it == m_tasks.end()) {
- m_tasks.append({id, length});
- return QString("Task created: %1 / %2").arg(id).arg(length);
- }
- if (it->length != length) {
- it->length = length;
- return QString("Task %1 updated").arg(id);
- }
- return "Nothing to do";
- }
- QString removeTask(int id)
- {
- const auto it = std::find_if(m_tasks.begin(), m_tasks.end(), [id](const TaskData &data) {
- return data.id == id;
- });
- if (it == m_tasks.end())
- return "Nothing to do";
- m_tasks.erase(it);
- return QString("Task %1 removed").arg(id);
- }
- QList<TaskData> tasks() const { return m_tasks; }
- private:
- QList<TaskData> m_tasks;
- };
- static ExecutableItem recipe(const TaskList &taskList)
- {
- const ListIterator<TaskData> iterator(taskList.tasks());
- const auto onSetup = [iterator](milliseconds &duration) {
- duration = seconds(iterator->length);
- qDebug() << iterator->id << "started.";
- };
- const auto onDone = [iterator] {
- qDebug() << iterator->id << "finished.";
- };
- return Forever {
- For(iterator) >> Do {
- QTimeoutTask(onSetup, onDone)
- },
- QSyncTask([] { qDebug() << "Reaching end. Restarting..."; })
- };
- }
- class MainWindow : public QMainWindow
- {
- public:
- MainWindow(QWidget *parent = nullptr);
- private:
- TaskList m_taskList;
- QSingleTaskTreeRunner m_taskTreeRunner;
- };
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- QWidget *cntrwdg = new QWidget;
- QVBoxLayout *vbox = new QVBoxLayout;
- QPushButton *btn_add = new QPushButton("Add / Update", this);
- QPushButton *btn_rem = new QPushButton("Delete", this);
- QPushButton *btn_print = new QPushButton("Print", this);
- QHBoxLayout *hbox = new QHBoxLayout;
- QPushButton *btn_start = new QPushButton("Start", this);
- QPushButton *btn_stop = new QPushButton("Stop", this);
- hbox->addWidget(btn_start);
- hbox->addWidget(btn_stop);
- QSpinBox *spin_seq = new QSpinBox(this);
- spin_seq->setRange(0, 999);
- QSpinBox *spin_seqLen = new QSpinBox(this);
- spin_seqLen->setRange(1, 999);
- QTextEdit *textEdit = new QTextEdit(this);
- QFormLayout *laySeq = new QFormLayout;
- QFormLayout *layseqLen = new QFormLayout;
- laySeq->addRow("Task ID\t\t", spin_seq);
- layseqLen->addRow("Sub-Task Length\t", spin_seqLen);
- vbox->addLayout(laySeq);
- vbox->addLayout(layseqLen);
- vbox->addWidget(btn_add);
- vbox->addWidget(btn_rem);
- vbox->addWidget(btn_print);
- vbox->addWidget(textEdit);
- vbox->addLayout(hbox);
- cntrwdg->setLayout(vbox);
- connect(btn_add, &QPushButton::clicked, this, [=] {
- textEdit->append(m_taskList.addTask(spin_seq->value(), spin_seqLen->value()));
- });
- connect(btn_rem, &QPushButton::clicked, this, [=] {
- textEdit->append(m_taskList.removeTask(spin_seq->value()));
- });
- connect(btn_print, &QPushButton::clicked, this, [=] {
- QString msg = "\n#####\tID ####\tLEN ###############\n";
- const QList<TaskData> tasks = m_taskList.tasks();
- for (const TaskData &task : tasks)
- msg += "Task:\t" + QString::number(task.id) + "\t" + QString::number(task.length) + "\n";
- msg += "#########################################\n";
- textEdit->append(msg);
- });
- connect(btn_start, &QPushButton::clicked, this, [=] {
- // Assume each sub-task takes 1s to finish
- // just for simulation purpose
- m_taskTreeRunner.start({recipe(m_taskList)});
- btn_add->setEnabled(false);
- btn_rem->setEnabled(false);
- });
- connect(btn_stop, &QPushButton::clicked, this, [=] {
- m_taskTreeRunner.reset();
- btn_add->setEnabled(true);
- btn_rem->setEnabled(true);
- });
- setCentralWidget(cntrwdg);
- setGeometry(800, 400, 600, 300);
- }
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
Advertisement
Add Comment
Please, Sign In to add comment