##// END OF EJS Templates
Handles state role in variable widget delegate
Alexandre Leroux -
r812:dbdd8e1bf997
parent child
Show More
@@ -1,239 +1,252
1 #include <Variable/RenameVariableDialog.h>
1 #include <Variable/RenameVariableDialog.h>
2 #include <Variable/Variable.h>
2 #include <Variable/Variable.h>
3 #include <Variable/VariableController.h>
3 #include <Variable/VariableController.h>
4 #include <Variable/VariableInspectorWidget.h>
4 #include <Variable/VariableInspectorWidget.h>
5 #include <Variable/VariableMenuHeaderWidget.h>
5 #include <Variable/VariableMenuHeaderWidget.h>
6 #include <Variable/VariableModel.h>
6 #include <Variable/VariableModel.h>
7
7
8 #include <ui_VariableInspectorWidget.h>
8 #include <ui_VariableInspectorWidget.h>
9
9
10 #include <QMouseEvent>
10 #include <QMouseEvent>
11 #include <QSortFilterProxyModel>
11 #include <QSortFilterProxyModel>
12 #include <QStyledItemDelegate>
12 #include <QStyledItemDelegate>
13 #include <QWidgetAction>
13 #include <QWidgetAction>
14
14
15 #include <SqpApplication.h>
15 #include <SqpApplication.h>
16
16
17 Q_LOGGING_CATEGORY(LOG_VariableInspectorWidget, "VariableInspectorWidget")
17 Q_LOGGING_CATEGORY(LOG_VariableInspectorWidget, "VariableInspectorWidget")
18
18
19
19
20 class QProgressBarItemDelegate : public QStyledItemDelegate {
20 class QProgressBarItemDelegate : public QStyledItemDelegate {
21
21
22 public:
22 public:
23 QProgressBarItemDelegate(QObject *parent) : QStyledItemDelegate{parent} {}
23 QProgressBarItemDelegate(QObject *parent) : QStyledItemDelegate{parent} {}
24
24
25 void paint(QPainter *painter, const QStyleOptionViewItem &option,
25 void paint(QPainter *painter, const QStyleOptionViewItem &option,
26 const QModelIndex &index) const
26 const QModelIndex &index) const
27 {
27 {
28 auto data = index.data(Qt::DisplayRole);
28 auto data = index.data(Qt::DisplayRole);
29 auto progressData = index.data(VariableRoles::ProgressRole);
29 auto progressData = index.data(VariableRoles::ProgressRole);
30 if (data.isValid() && progressData.isValid()) {
30 if (data.isValid() && progressData.isValid()) {
31 auto name = data.value<QString>();
31 auto name = data.value<QString>();
32 auto progress = progressData.value<double>();
32 auto progress = progressData.value<double>();
33 if (progress > 0) {
33 if (progress > 0) {
34 auto cancelButtonWidth = 20;
34 auto cancelButtonWidth = 20;
35 auto progressBarOption = QStyleOptionProgressBar{};
35 auto progressBarOption = QStyleOptionProgressBar{};
36 auto progressRect = option.rect;
36 auto progressRect = option.rect;
37 progressRect.setWidth(progressRect.width() - cancelButtonWidth);
37 progressRect.setWidth(progressRect.width() - cancelButtonWidth);
38 progressBarOption.rect = progressRect;
38 progressBarOption.rect = progressRect;
39 progressBarOption.minimum = 0;
39 progressBarOption.minimum = 0;
40 progressBarOption.maximum = 100;
40 progressBarOption.maximum = 100;
41 progressBarOption.progress = progress;
41 progressBarOption.progress = progress;
42 progressBarOption.text
42 progressBarOption.text
43 = QString("%1 %2").arg(name).arg(QString::number(progress, 'f', 2) + "%");
43 = QString("%1 %2").arg(name).arg(QString::number(progress, 'f', 2) + "%");
44 progressBarOption.textVisible = true;
44 progressBarOption.textVisible = true;
45 progressBarOption.textAlignment = Qt::AlignCenter;
45 progressBarOption.textAlignment = Qt::AlignCenter;
46
46
47
47
48 QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption,
48 QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption,
49 painter);
49 painter);
50
50
51 // Cancel button
51 // Cancel button
52 auto buttonRect = QRect(progressRect.right(), option.rect.top(), cancelButtonWidth,
52 auto buttonRect = QRect(progressRect.right(), option.rect.top(), cancelButtonWidth,
53 option.rect.height());
53 option.rect.height());
54 auto buttonOption = QStyleOptionButton{};
54 auto buttonOption = QStyleOptionButton{};
55 buttonOption.rect = buttonRect;
55 buttonOption.rect = buttonRect;
56 buttonOption.text = "X";
56 buttonOption.text = "X";
57
57
58 QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter);
58 QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter);
59 }
59 }
60 else {
60 else {
61 QStyledItemDelegate::paint(painter, option, index);
61 QStyledItemDelegate::paint(painter, option, index);
62 }
62 }
63 }
63 }
64 else {
64 else {
65 QStyledItemDelegate::paint(painter, option, index);
65 QStyledItemDelegate::paint(painter, option, index);
66
67 // Sets color depending on the state
68 auto stateRoleData = index.data(VariableRoles::StateRole);
69 if (stateRoleData.canConvert<StateData>()) {
70 auto stateData = stateRoleData.value<StateData>();
71
72 auto color = QColor{stateData.value("color").toString()};
73 if (color.isValid()) {
74 auto newOption = option;
75 newOption.palette.setBrush(QPalette::Text, QBrush{color});
76 QStyledItemDelegate::paint(painter, newOption, index);
77 }
78 }
66 }
79 }
67 }
80 }
68
81
69 bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option,
82 bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option,
70 const QModelIndex &index)
83 const QModelIndex &index)
71 {
84 {
72 if (event->type() == QEvent::MouseButtonRelease) {
85 if (event->type() == QEvent::MouseButtonRelease) {
73 auto data = index.data(Qt::DisplayRole);
86 auto data = index.data(Qt::DisplayRole);
74 auto progressData = index.data(VariableRoles::ProgressRole);
87 auto progressData = index.data(VariableRoles::ProgressRole);
75 if (data.isValid() && progressData.isValid()) {
88 if (data.isValid() && progressData.isValid()) {
76 auto cancelButtonWidth = 20;
89 auto cancelButtonWidth = 20;
77 auto progressRect = option.rect;
90 auto progressRect = option.rect;
78 progressRect.setWidth(progressRect.width() - cancelButtonWidth);
91 progressRect.setWidth(progressRect.width() - cancelButtonWidth);
79 // Cancel button
92 // Cancel button
80 auto buttonRect = QRect(progressRect.right(), option.rect.top(), cancelButtonWidth,
93 auto buttonRect = QRect(progressRect.right(), option.rect.top(), cancelButtonWidth,
81 option.rect.height());
94 option.rect.height());
82
95
83 auto e = (QMouseEvent *)event;
96 auto e = (QMouseEvent *)event;
84 auto clickX = e->x();
97 auto clickX = e->x();
85 auto clickY = e->y();
98 auto clickY = e->y();
86
99
87 auto x = buttonRect.left(); // the X coordinate
100 auto x = buttonRect.left(); // the X coordinate
88 auto y = buttonRect.top(); // the Y coordinate
101 auto y = buttonRect.top(); // the Y coordinate
89 auto w = buttonRect.width(); // button width
102 auto w = buttonRect.width(); // button width
90 auto h = buttonRect.height(); // button height
103 auto h = buttonRect.height(); // button height
91
104
92 if (clickX > x && clickX < x + w) {
105 if (clickX > x && clickX < x + w) {
93 if (clickY > y && clickY < y + h) {
106 if (clickY > y && clickY < y + h) {
94 auto variableModel = sqpApp->variableController().variableModel();
107 auto variableModel = sqpApp->variableController().variableModel();
95 variableModel->abortProgress(index);
108 variableModel->abortProgress(index);
96 }
109 }
97 return true;
110 return true;
98 }
111 }
99 else {
112 else {
100 return QStyledItemDelegate::editorEvent(event, model, option, index);
113 return QStyledItemDelegate::editorEvent(event, model, option, index);
101 }
114 }
102 }
115 }
103 else {
116 else {
104 return QStyledItemDelegate::editorEvent(event, model, option, index);
117 return QStyledItemDelegate::editorEvent(event, model, option, index);
105 }
118 }
106 }
119 }
107 else {
120 else {
108 return QStyledItemDelegate::editorEvent(event, model, option, index);
121 return QStyledItemDelegate::editorEvent(event, model, option, index);
109 }
122 }
110
123
111
124
112 return QStyledItemDelegate::editorEvent(event, model, option, index);
125 return QStyledItemDelegate::editorEvent(event, model, option, index);
113 }
126 }
114 };
127 };
115
128
116 VariableInspectorWidget::VariableInspectorWidget(QWidget *parent)
129 VariableInspectorWidget::VariableInspectorWidget(QWidget *parent)
117 : QWidget{parent},
130 : QWidget{parent},
118 ui{new Ui::VariableInspectorWidget},
131 ui{new Ui::VariableInspectorWidget},
119 m_ProgressBarItemDelegate{new QProgressBarItemDelegate{this}}
132 m_ProgressBarItemDelegate{new QProgressBarItemDelegate{this}}
120 {
133 {
121 ui->setupUi(this);
134 ui->setupUi(this);
122
135
123 // Sets model for table
136 // Sets model for table
124 // auto sortFilterModel = new QSortFilterProxyModel{this};
137 // auto sortFilterModel = new QSortFilterProxyModel{this};
125 // sortFilterModel->setSourceModel(sqpApp->variableController().variableModel());
138 // sortFilterModel->setSourceModel(sqpApp->variableController().variableModel());
126
139
127 auto variableModel = sqpApp->variableController().variableModel();
140 auto variableModel = sqpApp->variableController().variableModel();
128 ui->tableView->setModel(variableModel);
141 ui->tableView->setModel(variableModel);
129
142
130 // Adds extra signal/slot between view and model, so the view can be updated instantly when
143 // Adds extra signal/slot between view and model, so the view can be updated instantly when
131 // there is a change of data in the model
144 // there is a change of data in the model
132 connect(variableModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this,
145 connect(variableModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this,
133 SLOT(refresh()));
146 SLOT(refresh()));
134
147
135 ui->tableView->setSelectionModel(sqpApp->variableController().variableSelectionModel());
148 ui->tableView->setSelectionModel(sqpApp->variableController().variableSelectionModel());
136 ui->tableView->setItemDelegateForColumn(0, m_ProgressBarItemDelegate);
149 ui->tableView->setItemDelegateForColumn(0, m_ProgressBarItemDelegate);
137
150
138 // Fixes column sizes
151 // Fixes column sizes
139 auto model = ui->tableView->model();
152 auto model = ui->tableView->model();
140 const auto count = model->columnCount();
153 const auto count = model->columnCount();
141 for (auto i = 0; i < count; ++i) {
154 for (auto i = 0; i < count; ++i) {
142 ui->tableView->setColumnWidth(
155 ui->tableView->setColumnWidth(
143 i, model->headerData(i, Qt::Horizontal, Qt::SizeHintRole).toSize().width());
156 i, model->headerData(i, Qt::Horizontal, Qt::SizeHintRole).toSize().width());
144 }
157 }
145
158
146 // Sets selection options
159 // Sets selection options
147 ui->tableView->setSelectionBehavior(QTableView::SelectRows);
160 ui->tableView->setSelectionBehavior(QTableView::SelectRows);
148 ui->tableView->setSelectionMode(QTableView::ExtendedSelection);
161 ui->tableView->setSelectionMode(QTableView::ExtendedSelection);
149
162
150 // Connection to show a menu when right clicking on the tree
163 // Connection to show a menu when right clicking on the tree
151 ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
164 ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
152 connect(ui->tableView, &QTableView::customContextMenuRequested, this,
165 connect(ui->tableView, &QTableView::customContextMenuRequested, this,
153 &VariableInspectorWidget::onTableMenuRequested);
166 &VariableInspectorWidget::onTableMenuRequested);
154 }
167 }
155
168
156 VariableInspectorWidget::~VariableInspectorWidget()
169 VariableInspectorWidget::~VariableInspectorWidget()
157 {
170 {
158 delete ui;
171 delete ui;
159 }
172 }
160
173
161 void VariableInspectorWidget::onTableMenuRequested(const QPoint &pos) noexcept
174 void VariableInspectorWidget::onTableMenuRequested(const QPoint &pos) noexcept
162 {
175 {
163 auto selectedRows = ui->tableView->selectionModel()->selectedRows();
176 auto selectedRows = ui->tableView->selectionModel()->selectedRows();
164
177
165 // Gets the model to retrieve the underlying selected variables
178 // Gets the model to retrieve the underlying selected variables
166 auto model = sqpApp->variableController().variableModel();
179 auto model = sqpApp->variableController().variableModel();
167 auto selectedVariables = QVector<std::shared_ptr<Variable> >{};
180 auto selectedVariables = QVector<std::shared_ptr<Variable> >{};
168 for (const auto &selectedRow : qAsConst(selectedRows)) {
181 for (const auto &selectedRow : qAsConst(selectedRows)) {
169 if (auto selectedVariable = model->variable(selectedRow.row())) {
182 if (auto selectedVariable = model->variable(selectedRow.row())) {
170 selectedVariables.push_back(selectedVariable);
183 selectedVariables.push_back(selectedVariable);
171 }
184 }
172 }
185 }
173
186
174 QMenu tableMenu{};
187 QMenu tableMenu{};
175
188
176 // Emits a signal so that potential receivers can populate the menu before displaying it
189 // Emits a signal so that potential receivers can populate the menu before displaying it
177 emit tableMenuAboutToBeDisplayed(&tableMenu, selectedVariables);
190 emit tableMenuAboutToBeDisplayed(&tableMenu, selectedVariables);
178
191
179 // Adds menu-specific actions
192 // Adds menu-specific actions
180 if (!selectedVariables.isEmpty()) {
193 if (!selectedVariables.isEmpty()) {
181 tableMenu.addSeparator();
194 tableMenu.addSeparator();
182
195
183 // 'Rename' and 'Duplicate' actions (only if one variable selected)
196 // 'Rename' and 'Duplicate' actions (only if one variable selected)
184 if (selectedVariables.size() == 1) {
197 if (selectedVariables.size() == 1) {
185 auto selectedVariable = selectedVariables.front();
198 auto selectedVariable = selectedVariables.front();
186
199
187 auto duplicateFun = [varW = std::weak_ptr<Variable>(selectedVariable)]()
200 auto duplicateFun = [varW = std::weak_ptr<Variable>(selectedVariable)]()
188 {
201 {
189 if (auto var = varW.lock()) {
202 if (auto var = varW.lock()) {
190 sqpApp->variableController().cloneVariable(var);
203 sqpApp->variableController().cloneVariable(var);
191 }
204 }
192 };
205 };
193
206
194 tableMenu.addAction(tr("Duplicate"), duplicateFun);
207 tableMenu.addAction(tr("Duplicate"), duplicateFun);
195
208
196 auto renameFun = [ varW = std::weak_ptr<Variable>(selectedVariable), &model, this ]()
209 auto renameFun = [ varW = std::weak_ptr<Variable>(selectedVariable), &model, this ]()
197 {
210 {
198 if (auto var = varW.lock()) {
211 if (auto var = varW.lock()) {
199 // Generates forbidden names (names associated to existing variables)
212 // Generates forbidden names (names associated to existing variables)
200 auto allVariables = model->variables();
213 auto allVariables = model->variables();
201 auto forbiddenNames = QVector<QString>(allVariables.size());
214 auto forbiddenNames = QVector<QString>(allVariables.size());
202 std::transform(allVariables.cbegin(), allVariables.cend(),
215 std::transform(allVariables.cbegin(), allVariables.cend(),
203 forbiddenNames.begin(),
216 forbiddenNames.begin(),
204 [](const auto &variable) { return variable->name(); });
217 [](const auto &variable) { return variable->name(); });
205
218
206 RenameVariableDialog dialog{var->name(), forbiddenNames, this};
219 RenameVariableDialog dialog{var->name(), forbiddenNames, this};
207 if (dialog.exec() == QDialog::Accepted) {
220 if (dialog.exec() == QDialog::Accepted) {
208 var->setName(dialog.name());
221 var->setName(dialog.name());
209 }
222 }
210 }
223 }
211 };
224 };
212
225
213 tableMenu.addAction(tr("Rename..."), renameFun);
226 tableMenu.addAction(tr("Rename..."), renameFun);
214 }
227 }
215
228
216 // 'Delete' action
229 // 'Delete' action
217 auto deleteFun = [&selectedVariables]() {
230 auto deleteFun = [&selectedVariables]() {
218 sqpApp->variableController().deleteVariables(selectedVariables);
231 sqpApp->variableController().deleteVariables(selectedVariables);
219 };
232 };
220
233
221 tableMenu.addAction(QIcon{":/icones/delete.png"}, tr("Delete"), deleteFun);
234 tableMenu.addAction(QIcon{":/icones/delete.png"}, tr("Delete"), deleteFun);
222 }
235 }
223
236
224 if (!tableMenu.isEmpty()) {
237 if (!tableMenu.isEmpty()) {
225 // Generates menu header (inserted before first action)
238 // Generates menu header (inserted before first action)
226 auto firstAction = tableMenu.actions().first();
239 auto firstAction = tableMenu.actions().first();
227 auto headerAction = new QWidgetAction{&tableMenu};
240 auto headerAction = new QWidgetAction{&tableMenu};
228 headerAction->setDefaultWidget(new VariableMenuHeaderWidget{selectedVariables, &tableMenu});
241 headerAction->setDefaultWidget(new VariableMenuHeaderWidget{selectedVariables, &tableMenu});
229 tableMenu.insertAction(firstAction, headerAction);
242 tableMenu.insertAction(firstAction, headerAction);
230
243
231 // Displays menu
244 // Displays menu
232 tableMenu.exec(QCursor::pos());
245 tableMenu.exec(QCursor::pos());
233 }
246 }
234 }
247 }
235
248
236 void VariableInspectorWidget::refresh() noexcept
249 void VariableInspectorWidget::refresh() noexcept
237 {
250 {
238 ui->tableView->viewport()->update();
251 ui->tableView->viewport()->update();
239 }
252 }
General Comments 0
You need to be logged in to leave comments. Login now