##// END OF EJS Templates
Reset of the drag&drop operations when a drag is started from the datasource or from the variables
trabillard -
r883:4dce99ba7a36
parent child
Show More
@@ -0,0 +1,14
1 #ifndef SCIQLOP_VARIABLEINSPECTORTABLEVIEW_H
2 #define SCIQLOP_VARIABLEINSPECTORTABLEVIEW_H
3
4 #include <QTableView>
5
6 class VariableInspectorTableView : public QTableView {
7 public:
8 VariableInspectorTableView(QWidget *parent = nullptr);
9
10 protected:
11 void startDrag(Qt::DropActions supportedActions);
12 };
13
14 #endif // SCIQLOP_VARIABLEINSPECTORTABLEVIEW_H
@@ -0,0 +1,13
1 #include "Variable/VariableInspectorTableView.h"
2
3 #include "DragDropHelper.h"
4 #include "SqpApplication.h"
5
6 VariableInspectorTableView::VariableInspectorTableView(QWidget *parent) : QTableView(parent) {}
7
8 void VariableInspectorTableView::startDrag(Qt::DropActions supportedActions)
9 {
10 // Resets the drag&drop operations before it's starting
11 sqpApp->dragDropHelper().resetDragAndDrop();
12 QTableView::startDrag(supportedActions);
13 }
1 NO CONTENT: modified file
@@ -1,14 +1,15
1 1 #ifndef SCIQLOP_DATASOURCETREEWIDGET_H
2 2 #define SCIQLOP_DATASOURCETREEWIDGET_H
3 3
4 4 #include <QTreeWidget>
5 5
6 6 class DataSourceTreeWidget : public QTreeWidget {
7 7 public:
8 8 DataSourceTreeWidget(QWidget *parent);
9 9
10 10 protected:
11 11 QMimeData *mimeData(const QList<QTreeWidgetItem *> items) const override;
12 void startDrag(Qt::DropActions supportedActions) override;
12 13 };
13 14
14 15 #endif // SCIQLOP_DATASOURCETREEWIDGET_H
@@ -1,87 +1,89
1 1
2 2 gui_moc_headers = [
3 3 'include/DataSource/DataSourceWidget.h',
4 4 'include/Settings/SqpSettingsDialog.h',
5 5 'include/Settings/SqpSettingsGeneralWidget.h',
6 6 'include/SidePane/SqpSidePane.h',
7 7 'include/SqpApplication.h',
8 8 'include/DragDropHelper.h',
9 9 'include/TimeWidget/TimeWidget.h',
10 10 'include/Variable/VariableInspectorWidget.h',
11 'include/Variable/VariableInspectorTableView.h',
11 12 'include/Variable/RenameVariableDialog.h',
12 13 'include/Visualization/qcustomplot.h',
13 14 'include/Visualization/VisualizationGraphWidget.h',
14 15 'include/Visualization/VisualizationTabWidget.h',
15 16 'include/Visualization/VisualizationWidget.h',
16 17 'include/Visualization/VisualizationZoneWidget.h',
17 18 'include/Visualization/VisualizationDragDropContainer.h',
18 19 'include/Visualization/VisualizationDragWidget.h'
19 20 ]
20 21
21 22 gui_ui_files = [
22 23 'ui/DataSource/DataSourceWidget.ui',
23 24 'ui/Settings/SqpSettingsDialog.ui',
24 25 'ui/Settings/SqpSettingsGeneralWidget.ui',
25 26 'ui/SidePane/SqpSidePane.ui',
26 27 'ui/TimeWidget/TimeWidget.ui',
27 28 'ui/Variable/VariableInspectorWidget.ui',
28 29 'ui/Variable/RenameVariableDialog.ui',
29 30 'ui/Variable/VariableMenuHeaderWidget.ui',
30 31 'ui/Visualization/VisualizationGraphWidget.ui',
31 32 'ui/Visualization/VisualizationTabWidget.ui',
32 33 'ui/Visualization/VisualizationWidget.ui',
33 34 'ui/Visualization/VisualizationZoneWidget.ui'
34 35 ]
35 36
36 37 gui_qresources = ['resources/sqpguiresources.qrc']
37 38
38 39 gui_moc_files = qt5.preprocess(moc_headers : gui_moc_headers,
39 40 ui_files : gui_ui_files,
40 41 qresources : gui_qresources)
41 42
42 43 gui_sources = [
43 44 'src/SqpApplication.cpp',
44 45 'src/DragDropHelper.cpp',
45 46 'src/Common/ColorUtils.cpp',
46 47 'src/Common/VisualizationDef.cpp',
47 48 'src/DataSource/DataSourceTreeWidgetItem.cpp',
48 49 'src/DataSource/DataSourceTreeWidgetHelper.cpp',
49 50 'src/DataSource/DataSourceWidget.cpp',
50 51 'src/Settings/SqpSettingsDialog.cpp',
51 52 'src/Settings/SqpSettingsGeneralWidget.cpp',
52 53 'src/SidePane/SqpSidePane.cpp',
53 54 'src/TimeWidget/TimeWidget.cpp',
54 55 'src/Variable/VariableInspectorWidget.cpp',
56 'src/Variable/VariableInspectorTableView.cpp',
55 57 'src/Variable/VariableMenuHeaderWidget.cpp',
56 58 'src/Variable/RenameVariableDialog.cpp',
57 59 'src/Visualization/VisualizationGraphHelper.cpp',
58 60 'src/Visualization/VisualizationGraphRenderingDelegate.cpp',
59 61 'src/Visualization/VisualizationGraphWidget.cpp',
60 62 'src/Visualization/VisualizationTabWidget.cpp',
61 63 'src/Visualization/VisualizationWidget.cpp',
62 64 'src/Visualization/VisualizationZoneWidget.cpp',
63 65 'src/Visualization/qcustomplot.cpp',
64 66 'src/Visualization/QCustomPlotSynchronizer.cpp',
65 67 'src/Visualization/operations/FindVariableOperation.cpp',
66 68 'src/Visualization/operations/GenerateVariableMenuOperation.cpp',
67 69 'src/Visualization/operations/MenuBuilder.cpp',
68 70 'src/Visualization/operations/RemoveVariableOperation.cpp',
69 71 'src/Visualization/operations/RescaleAxeOperation.cpp',
70 72 'src/Visualization/VisualizationDragDropContainer.cpp',
71 73 'src/Visualization/VisualizationDragWidget.cpp'
72 74 ]
73 75
74 76 gui_inc = include_directories(['include'])
75 77
76 78 sciqlop_gui_lib = library('sciqlopgui',
77 79 gui_sources,
78 80 gui_moc_files,
79 81 include_directories : [gui_inc],
80 82 dependencies : [ qt5printsupport, qt5gui, qt5widgets, qt5svg, sciqlop_core],
81 83 install : true
82 84 )
83 85
84 86 sciqlop_gui = declare_dependency(link_with : sciqlop_gui_lib,
85 87 include_directories : gui_inc,
86 88 dependencies : [qt5printsupport, qt5gui, qt5widgets, qt5svg, sciqlop_core])
87 89
@@ -1,37 +1,45
1 1 #include "DataSource/DataSourceTreeWidget.h"
2 2 #include "Common/MimeTypesDef.h"
3 3 #include "DataSource/DataSourceController.h"
4 4 #include "DataSource/DataSourceItem.h"
5 5 #include "DataSource/DataSourceTreeWidgetItem.h"
6 6
7 #include "DragDropHelper.h"
7 8 #include "SqpApplication.h"
8 9
9 10 #include <QMimeData>
10 11
11 12 DataSourceTreeWidget::DataSourceTreeWidget(QWidget *parent) : QTreeWidget(parent) {}
12 13
13 14 QMimeData *DataSourceTreeWidget::mimeData(const QList<QTreeWidgetItem *> items) const
14 15 {
15 16 auto mimeData = new QMimeData;
16 17
17 18 // Basic check to ensure the item are correctly typed
18 19 Q_ASSERT(items.isEmpty() || dynamic_cast<DataSourceTreeWidgetItem *>(items.first()) != nullptr);
19 20
20 21 QVariantList productData;
21 22
22 23 for (auto item : items) {
23 24 auto dataSourceTreeItem = static_cast<DataSourceTreeWidgetItem *>(item);
24 25 auto dataSource = dataSourceTreeItem->data();
25 26
26 27 if (dataSource->type() == DataSourceItemType::COMPONENT
27 28 || dataSource->type() == DataSourceItemType::PRODUCT) {
28 29 auto metaData = dataSource->data();
29 30 productData << metaData;
30 31 }
31 32 }
32 33
33 34 auto encodedData = sqpApp->dataSourceController().mimeDataForProductsData(productData);
34 35 mimeData->setData(MIME_TYPE_PRODUCT_LIST, encodedData);
35 36
36 37 return mimeData;
37 38 }
39
40 void DataSourceTreeWidget::startDrag(Qt::DropActions supportedActions)
41 {
42 // Resets the drag&drop operations before it's starting
43 sqpApp->dragDropHelper().resetDragAndDrop();
44 QTreeWidget::startDrag(supportedActions);
45 }
@@ -1,245 +1,240
1 1 #include <Variable/RenameVariableDialog.h>
2 2 #include <Variable/Variable.h>
3 3 #include <Variable/VariableController.h>
4 4 #include <Variable/VariableInspectorWidget.h>
5 5 #include <Variable/VariableMenuHeaderWidget.h>
6 6 #include <Variable/VariableModel.h>
7 7
8 8 #include <ui_VariableInspectorWidget.h>
9 9
10 10 #include <QMouseEvent>
11 11 #include <QSortFilterProxyModel>
12 12 #include <QStyledItemDelegate>
13 13 #include <QWidgetAction>
14 14
15 15 #include <DragDropHelper.h>
16 16 #include <SqpApplication.h>
17 17
18 18 Q_LOGGING_CATEGORY(LOG_VariableInspectorWidget, "VariableInspectorWidget")
19 19
20 20
21 21 class QProgressBarItemDelegate : public QStyledItemDelegate {
22 22
23 23 public:
24 24 QProgressBarItemDelegate(QObject *parent) : QStyledItemDelegate{parent} {}
25 25
26 26 void paint(QPainter *painter, const QStyleOptionViewItem &option,
27 27 const QModelIndex &index) const
28 28 {
29 29 auto data = index.data(Qt::DisplayRole);
30 30 auto progressData = index.data(VariableRoles::ProgressRole);
31 31 if (data.isValid() && progressData.isValid()) {
32 32 auto name = data.value<QString>();
33 33 auto progress = progressData.value<double>();
34 34 if (progress > 0) {
35 35 auto cancelButtonWidth = 20;
36 36 auto progressBarOption = QStyleOptionProgressBar{};
37 37 auto progressRect = option.rect;
38 38 progressRect.setWidth(progressRect.width() - cancelButtonWidth);
39 39 progressBarOption.rect = progressRect;
40 40 progressBarOption.minimum = 0;
41 41 progressBarOption.maximum = 100;
42 42 progressBarOption.progress = progress;
43 43 progressBarOption.text
44 44 = QString("%1 %2").arg(name).arg(QString::number(progress, 'f', 2) + "%");
45 45 progressBarOption.textVisible = true;
46 46 progressBarOption.textAlignment = Qt::AlignCenter;
47 47
48 48
49 49 QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption,
50 50 painter);
51 51
52 52 // Cancel button
53 53 auto buttonRect = QRect(progressRect.right(), option.rect.top(), cancelButtonWidth,
54 54 option.rect.height());
55 55 auto buttonOption = QStyleOptionButton{};
56 56 buttonOption.rect = buttonRect;
57 57 buttonOption.text = "X";
58 58
59 59 QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter);
60 60 }
61 61 else {
62 62 QStyledItemDelegate::paint(painter, option, index);
63 63 }
64 64 }
65 65 else {
66 66 QStyledItemDelegate::paint(painter, option, index);
67 67 }
68 68 }
69 69
70 70 bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option,
71 71 const QModelIndex &index)
72 72 {
73 73 if (event->type() == QEvent::MouseButtonRelease) {
74 74 auto data = index.data(Qt::DisplayRole);
75 75 auto progressData = index.data(VariableRoles::ProgressRole);
76 76 if (data.isValid() && progressData.isValid()) {
77 77 auto cancelButtonWidth = 20;
78 78 auto progressRect = option.rect;
79 79 progressRect.setWidth(progressRect.width() - cancelButtonWidth);
80 80 // Cancel button
81 81 auto buttonRect = QRect(progressRect.right(), option.rect.top(), cancelButtonWidth,
82 82 option.rect.height());
83 83
84 84 auto e = (QMouseEvent *)event;
85 85 auto clickX = e->x();
86 86 auto clickY = e->y();
87 87
88 88 auto x = buttonRect.left(); // the X coordinate
89 89 auto y = buttonRect.top(); // the Y coordinate
90 90 auto w = buttonRect.width(); // button width
91 91 auto h = buttonRect.height(); // button height
92 92
93 93 if (clickX > x && clickX < x + w) {
94 94 if (clickY > y && clickY < y + h) {
95 95 auto variableModel = sqpApp->variableController().variableModel();
96 96 variableModel->abortProgress(index);
97 97 }
98 98 return true;
99 99 }
100 100 else {
101 101 return QStyledItemDelegate::editorEvent(event, model, option, index);
102 102 }
103 103 }
104 104 else {
105 105 return QStyledItemDelegate::editorEvent(event, model, option, index);
106 106 }
107 107 }
108 108 else {
109 109 return QStyledItemDelegate::editorEvent(event, model, option, index);
110 110 }
111 111
112 112
113 113 return QStyledItemDelegate::editorEvent(event, model, option, index);
114 114 }
115 115 };
116 116
117 117 VariableInspectorWidget::VariableInspectorWidget(QWidget *parent)
118 118 : QWidget{parent},
119 119 ui{new Ui::VariableInspectorWidget},
120 120 m_ProgressBarItemDelegate{new QProgressBarItemDelegate{this}}
121 121 {
122 122 ui->setupUi(this);
123 123
124 124 // Sets model for table
125 125 // auto sortFilterModel = new QSortFilterProxyModel{this};
126 126 // sortFilterModel->setSourceModel(sqpApp->variableController().variableModel());
127 127
128 128 auto variableModel = sqpApp->variableController().variableModel();
129 129 ui->tableView->setModel(variableModel);
130 130
131 131 // Adds extra signal/slot between view and model, so the view can be updated instantly when
132 132 // there is a change of data in the model
133 133 connect(variableModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this,
134 134 SLOT(refresh()));
135 135
136 136 ui->tableView->setSelectionModel(sqpApp->variableController().variableSelectionModel());
137 137 ui->tableView->setItemDelegateForColumn(0, m_ProgressBarItemDelegate);
138 138
139 139 // Fixes column sizes
140 140 auto model = ui->tableView->model();
141 141 const auto count = model->columnCount();
142 142 for (auto i = 0; i < count; ++i) {
143 143 ui->tableView->setColumnWidth(
144 144 i, model->headerData(i, Qt::Horizontal, Qt::SizeHintRole).toSize().width());
145 145 }
146 146
147 147 // Sets selection options
148 148 ui->tableView->setSelectionBehavior(QTableView::SelectRows);
149 149 ui->tableView->setSelectionMode(QTableView::ExtendedSelection);
150 150
151 151 // Connection to show a menu when right clicking on the tree
152 152 ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
153 153 connect(ui->tableView, &QTableView::customContextMenuRequested, this,
154 154 &VariableInspectorWidget::onTableMenuRequested);
155
156 // Resets the drag&drop operation on a left-click (the drag&drop is also started by a left
157 // click).
158 connect(ui->tableView, &QTableView::clicked,
159 [](const auto &modelIndex) { sqpApp->dragDropHelper().resetDragAndDrop(); });
160 155 }
161 156
162 157 VariableInspectorWidget::~VariableInspectorWidget()
163 158 {
164 159 delete ui;
165 160 }
166 161
167 162 void VariableInspectorWidget::onTableMenuRequested(const QPoint &pos) noexcept
168 163 {
169 164 auto selectedRows = ui->tableView->selectionModel()->selectedRows();
170 165
171 166 // Gets the model to retrieve the underlying selected variables
172 167 auto model = sqpApp->variableController().variableModel();
173 168 auto selectedVariables = QVector<std::shared_ptr<Variable> >{};
174 169 for (const auto &selectedRow : qAsConst(selectedRows)) {
175 170 if (auto selectedVariable = model->variable(selectedRow.row())) {
176 171 selectedVariables.push_back(selectedVariable);
177 172 }
178 173 }
179 174
180 175 QMenu tableMenu{};
181 176
182 177 // Emits a signal so that potential receivers can populate the menu before displaying it
183 178 emit tableMenuAboutToBeDisplayed(&tableMenu, selectedVariables);
184 179
185 180 // Adds menu-specific actions
186 181 if (!selectedVariables.isEmpty()) {
187 182 tableMenu.addSeparator();
188 183
189 184 // 'Rename' and 'Duplicate' actions (only if one variable selected)
190 185 if (selectedVariables.size() == 1) {
191 186 auto selectedVariable = selectedVariables.front();
192 187
193 188 auto duplicateFun = [varW = std::weak_ptr<Variable>(selectedVariable)]()
194 189 {
195 190 if (auto var = varW.lock()) {
196 191 sqpApp->variableController().cloneVariable(var);
197 192 }
198 193 };
199 194
200 195 tableMenu.addAction(tr("Duplicate"), duplicateFun);
201 196
202 197 auto renameFun = [ varW = std::weak_ptr<Variable>(selectedVariable), &model, this ]()
203 198 {
204 199 if (auto var = varW.lock()) {
205 200 // Generates forbidden names (names associated to existing variables)
206 201 auto allVariables = model->variables();
207 202 auto forbiddenNames = QVector<QString>(allVariables.size());
208 203 std::transform(allVariables.cbegin(), allVariables.cend(),
209 204 forbiddenNames.begin(),
210 205 [](const auto &variable) { return variable->name(); });
211 206
212 207 RenameVariableDialog dialog{var->name(), forbiddenNames, this};
213 208 if (dialog.exec() == QDialog::Accepted) {
214 209 var->setName(dialog.name());
215 210 }
216 211 }
217 212 };
218 213
219 214 tableMenu.addAction(tr("Rename..."), renameFun);
220 215 }
221 216
222 217 // 'Delete' action
223 218 auto deleteFun = [&selectedVariables]() {
224 219 sqpApp->variableController().deleteVariables(selectedVariables);
225 220 };
226 221
227 222 tableMenu.addAction(QIcon{":/icones/delete.png"}, tr("Delete"), deleteFun);
228 223 }
229 224
230 225 if (!tableMenu.isEmpty()) {
231 226 // Generates menu header (inserted before first action)
232 227 auto firstAction = tableMenu.actions().first();
233 228 auto headerAction = new QWidgetAction{&tableMenu};
234 229 headerAction->setDefaultWidget(new VariableMenuHeaderWidget{selectedVariables, &tableMenu});
235 230 tableMenu.insertAction(firstAction, headerAction);
236 231
237 232 // Displays menu
238 233 tableMenu.exec(QCursor::pos());
239 234 }
240 235 }
241 236
242 237 void VariableInspectorWidget::refresh() noexcept
243 238 {
244 239 ui->tableView->viewport()->update();
245 240 }
@@ -1,40 +1,47
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <ui version="4.0">
3 3 <class>VariableInspectorWidget</class>
4 4 <widget class="QWidget" name="VariableInspectorWidget">
5 5 <property name="geometry">
6 6 <rect>
7 7 <x>0</x>
8 8 <y>0</y>
9 9 <width>400</width>
10 10 <height>300</height>
11 11 </rect>
12 12 </property>
13 13 <property name="windowTitle">
14 14 <string>Variables</string>
15 15 </property>
16 16 <layout class="QGridLayout" name="gridLayout">
17 17 <item row="0" column="0">
18 <widget class="QTableView" name="tableView">
18 <widget class="VariableInspectorTableView" name="tableView">
19 19 <property name="acceptDrops">
20 20 <bool>true</bool>
21 21 </property>
22 22 <property name="dragEnabled">
23 23 <bool>true</bool>
24 24 </property>
25 25 <property name="dragDropMode">
26 26 <enum>QAbstractItemView::DragDrop</enum>
27 27 </property>
28 28 <property name="sortingEnabled">
29 29 <bool>true</bool>
30 30 </property>
31 31 <attribute name="horizontalHeaderStretchLastSection">
32 32 <bool>true</bool>
33 33 </attribute>
34 34 </widget>
35 35 </item>
36 36 </layout>
37 37 </widget>
38 <customwidgets>
39 <customwidget>
40 <class>VariableInspectorTableView</class>
41 <extends>QTableView</extends>
42 <header>Variable/VariableInspectorTableView.h</header>
43 </customwidget>
44 </customwidgets>
38 45 <resources/>
39 46 <connections/>
40 47 </ui>
General Comments 3
Under Review
author

Pull request updated. Auto status change to "Under Review"

Changed commits:
  * 1 added
  * 0 removed

Changed files:
  * A core/tests/meson.build
You need to be logged in to leave comments. Login now