forked from joojinho/brigantine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
task_view.cpp
111 lines (95 loc) · 3.34 KB
/
task_view.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Andrew Naplavkov
#include <cstdint>
#include <QApplication>
#include <QHeaderView>
#include <QMenu>
#include <QMessageBox>
#include "task_view.h"
task_view::task_view(QWidget* parent) : QTableView(parent), m_mdl(0)
{
setModel(&m_mdl);
setContextMenuPolicy(Qt::CustomContextMenu);
verticalHeader()->hide();
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(on_show_menu(QPoint)));
connect(&m_mdl, SIGNAL(signal_progress()), this, SLOT(emit_progress()));
connect(&m_mdl, SIGNAL(signal_idle()), this, SLOT(emit_idle()));
connect(&m_mdl, SIGNAL(signal_need_vacuum()), this, SLOT(on_need_vacuum()));
m_cancel_act = new QAction("cancel this task", this);
m_cancel_act->setIconVisibleInMenu(true);
connect(m_cancel_act, SIGNAL(triggered()), this, SLOT(on_cancel()));
m_cancel_all_act = new QAction("cancel all tasks", this);
m_cancel_all_act->setIconVisibleInMenu(true);
connect(m_cancel_all_act, SIGNAL(triggered()), this, SLOT(on_cancel_all()));
m_clear_act = new QAction("clear", this);
m_clear_act->setIconVisibleInMenu(true);
connect(m_clear_act, SIGNAL(triggered()), this, SLOT(on_clear()));
}
void task_view::on_finished()
{
if (intptr_t(qobject_cast<task*>(sender())->get_id()) == intptr_t(m_idx_menu.internalPointer()))
m_cancel_act->setEnabled(false);
}
void task_view::on_show_menu(QPoint point)
{
m_idx_menu = indexAt(point);
auto tsk = m_mdl.get_task(m_idx_menu);
QList<QAction*> actions;
if (tsk)
{
m_cancel_act->setEnabled(!tsk->is_finished());
actions.append(m_cancel_act);
}
actions.append(m_cancel_all_act);
actions.append(m_clear_act);
QMenu::exec(actions, mapToGlobal(point));
}
void task_view::on_task(std::shared_ptr<task> tsk)
{
connect(tsk.get(), SIGNAL(signal_finished()), this, SLOT(on_finished()));
m_mdl.run(tsk);
}
void task_view::emit_progress()
{
m_cancel_all_act->setEnabled(true);
emit signal_progress();
}
void task_view::emit_idle()
{
m_cancel_all_act->setEnabled(false);
emit signal_idle();
}
void task_view::on_need_vacuum()
{
if (!isVisible()) m_mdl.vacuum(false);
}
void task_view::on_cancel()
{
auto tsk = m_mdl.get_task(m_idx_menu);
if (!tsk) return;
QMessageBox dlg(QApplication::activeWindow());
dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint);
dlg.setWindowIcon(QIcon(":/res/wheel.png"));
dlg.setIcon(QMessageBox::Question);
dlg.setText(QString("%1: %2").arg(tsk->get_id()).arg(tsk->get_string()));
dlg.setInformativeText("Do you want to cancel the task?");
dlg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
dlg.setDefaultButton(QMessageBox::Ok);
if (dlg.exec() != QMessageBox::Ok) return;
m_mdl.emit_cancel(intptr_t(m_idx_menu.internalPointer()));
}
void task_view::on_cancel_all()
{
QMessageBox dlg(QApplication::activeWindow());
dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint);
dlg.setWindowIcon(QIcon(":/res/wheel.png"));
dlg.setIcon(QMessageBox::Question);
dlg.setInformativeText("Do you want to cancel all tasks?");
dlg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
dlg.setDefaultButton(QMessageBox::Ok);
if (dlg.exec() != QMessageBox::Ok) return;
m_mdl.emit_cancel_all();
}
void task_view::on_clear()
{
m_mdl.vacuum(true);
}