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