##// END OF EJS Templates
Fixed Drag&Drop issue on some platforms and made more consistent plugin install path with Meson...
jeandet -
r1397:348e733132e4
parent child
Show More
@@ -28,9 +28,10 else
28 endif
28 endif
29
29
30 app_libs = []
30 app_libs = []
31
31 cpp_args = []
32 if 'static' == get_option('default_library')
32 if 'static' == get_option('default_library')
33 app_libs = [ sciqlop_amdaplugin, sciqlop_mockplugin]
33 app_libs = [ sciqlop_amdaplugin, sciqlop_mockplugin]
34 cpp_args += ['-DQT_STATICPLUGIN']
34 endif
35 endif
35
36
36 sciqlop_app = executable('sciqlop',
37 sciqlop_app = executable('sciqlop',
@@ -39,7 +40,7 sciqlop_app = executable('sciqlop',
39 rc,
40 rc,
40 include_directories : [ app_inc],
41 include_directories : [ app_inc],
41 link_with: app_libs,
42 link_with: app_libs,
43 cpp_args: cpp_args,
42 dependencies : [sciqlop_gui, sciqlop_core],
44 dependencies : [sciqlop_gui, sciqlop_core],
43 install : true
45 install : true
44 )
46 )
45
@@ -5,7 +5,6 meson --prefix=/usr ..
5 ninja
5 ninja
6 DESTDIR=AppDir ninja install
6 DESTDIR=AppDir ninja install
7 mv AppDir/usr/lib64 AppDir/usr/lib
7 mv AppDir/usr/lib64 AppDir/usr/lib
8 mv AppDir/usr/lib/*plugin.so AppDir/usr/bin/
9 wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
8 wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
10 chmod +x linuxdeployqt-continuous-x86_64.AppImage && ./linuxdeployqt-continuous-x86_64.AppImage --appimage-extract
9 chmod +x linuxdeployqt-continuous-x86_64.AppImage && ./linuxdeployqt-continuous-x86_64.AppImage --appimage-extract
11 LD_LIBRARY_PATH=AppDir/usr/lib64/ ./squashfs-root/AppRun AppDir/usr/share/applications/*.desktop -appimage
10 LD_LIBRARY_PATH=AppDir/usr/lib64/ ./squashfs-root/AppRun AppDir/usr/share/applications/*.desktop -appimage
This diff has been collapsed as it changes many lines, (1050 lines changed) Show them Hide them
@@ -1,496 +1,554
1 #include "Visualization/VisualizationDragDropContainer.h"
1 #include "Visualization/VisualizationDragDropContainer.h"
2 #include "DragAndDrop/DragDropGuiController.h"
2 #include "DragAndDrop/DragDropGuiController.h"
3 #include "SqpApplication.h"
3 #include "SqpApplication.h"
4 #include "Visualization/VisualizationDragWidget.h"
4 #include "Visualization/VisualizationDragWidget.h"
5
5
6 #include "Common/VisualizationDef.h"
6 #include "Common/VisualizationDef.h"
7
7
8 #include <QDrag>
8 #include <QDrag>
9 #include <QDragEnterEvent>
9 #include <QDragEnterEvent>
10 #include <QVBoxLayout>
10 #include <QVBoxLayout>
11
11
12 #include <cmath>
12 #include <cmath>
13 #include <memory>
13 #include <memory>
14
14
15 Q_LOGGING_CATEGORY(LOG_VisualizationDragDropContainer, "VisualizationDragDropContainer")
15 Q_LOGGING_CATEGORY(LOG_VisualizationDragDropContainer, "VisualizationDragDropContainer")
16
16
17 auto DRAGGED_MINIATURE_WIDTH = 200; // in pixels
17 auto DRAGGED_MINIATURE_WIDTH = 200; // in pixels
18
18
19 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate {
19 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate
20
20 {
21 QVBoxLayout *m_Layout;
21
22 QHash<QString, VisualizationDragDropContainer::DropBehavior> m_AcceptedMimeTypes;
22 QVBoxLayout* m_Layout;
23 QString m_PlaceHolderText;
23 QHash<QString, VisualizationDragDropContainer::DropBehavior> m_AcceptedMimeTypes;
24 DragDropGuiController::PlaceHolderType m_PlaceHolderType;
24 QString m_PlaceHolderText;
25
25 DragDropGuiController::PlaceHolderType m_PlaceHolderType;
26 VisualizationDragDropContainer::AcceptMimeDataFunction m_AcceptMimeDataFun
26
27 = [](auto mimeData) { return true; };
27 VisualizationDragDropContainer::AcceptMimeDataFunction m_AcceptMimeDataFun
28 VisualizationDragDropContainer::AcceptDragWidgetFunction m_AcceptDragWidgetFun
28 = [](auto mimeData) { return true; };
29 = [](auto dragWidget, auto mimeData) { return true; };
29 VisualizationDragDropContainer::AcceptDragWidgetFunction m_AcceptDragWidgetFun
30
30 = [](auto dragWidget, auto mimeData) { return true; };
31 int m_MinContainerHeight = 0;
31
32
32 int m_MinContainerHeight = 0;
33 explicit VisualizationDragDropContainerPrivate(QWidget *widget)
33
34 : m_PlaceHolderType(DragDropGuiController::PlaceHolderType::Graph)
34 explicit VisualizationDragDropContainerPrivate(QWidget* widget)
35 {
35 : m_PlaceHolderType(DragDropGuiController::PlaceHolderType::Graph)
36 m_Layout = new QVBoxLayout(widget);
36 {
37 m_Layout->setContentsMargins(0, 0, 0, 0);
37 m_Layout = new QVBoxLayout(widget);
38 }
38 m_Layout->setContentsMargins(0, 0, 0, 0);
39
39 }
40 bool acceptMimeData(const QMimeData *data) const
40
41 {
41 bool acceptMimeData(const QMimeData* data) const
42 auto accepted = false;
42 {
43 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd();
43 auto accepted = false;
44 ++it) {
44 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); ++it)
45 const auto &type = it.key();
45 {
46 const auto &behavior = it.value();
46 const auto& type = it.key();
47
47 const auto& behavior = it.value();
48 if (data->hasFormat(type)) {
48
49 if (behavior != DropBehavior::Forbidden) {
49 if (data->hasFormat(type))
50 accepted = true;
50 {
51 }
51 if (behavior != DropBehavior::Forbidden)
52 else {
52 {
53 accepted = false;
53 accepted = true;
54 break;
54 }
55 }
55 else
56 }
56 {
57 }
57 accepted = false;
58
58 break;
59 if (accepted) {
59 }
60 accepted = m_AcceptMimeDataFun(data);
60 }
61 }
61 }
62
62
63 return accepted;
63 if (accepted)
64 }
64 {
65
65 accepted = m_AcceptMimeDataFun(data);
66 bool allowMergeForMimeData(const QMimeData *data) const
66 }
67 {
67
68 auto result = false;
68 return accepted;
69 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd();
69 }
70 ++it) {
70
71
71 bool allowMergeForMimeData(const QMimeData* data) const
72 if (data->hasFormat(it.key())
72 {
73 && (it.value() == VisualizationDragDropContainer::DropBehavior::Merged
73 auto result = false;
74 || it.value()
74 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); ++it)
75 == VisualizationDragDropContainer::DropBehavior::InsertedAndMerged)) {
75 {
76 result = true;
76
77 }
77 if (data->hasFormat(it.key())
78 else if (data->hasFormat(it.key())
78 && (it.value() == VisualizationDragDropContainer::DropBehavior::Merged
79 && it.value() == VisualizationDragDropContainer::DropBehavior::Inserted) {
79 || it.value()
80 // Merge is forbidden if the mime data contain an acceptable type which cannot be
80 == VisualizationDragDropContainer::DropBehavior::InsertedAndMerged))
81 // merged
81 {
82 result = false;
82 result = true;
83 break;
83 }
84 }
84 else if (data->hasFormat(it.key())
85 }
85 && it.value() == VisualizationDragDropContainer::DropBehavior::Inserted)
86
86 {
87 return result;
87 // Merge is forbidden if the mime data contain an acceptable type which cannot be
88 }
88 // merged
89
89 result = false;
90 bool allowInsertForMimeData(const QMimeData *data) const
90 break;
91 {
91 }
92 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd();
92 }
93 ++it) {
93
94 if (data->hasFormat(it.key())
94 return result;
95 && (it.value() == VisualizationDragDropContainer::DropBehavior::Inserted
95 }
96 || it.value()
96
97 == VisualizationDragDropContainer::DropBehavior::InsertedAndMerged)) {
97 bool allowInsertForMimeData(const QMimeData* data) const
98 return true;
98 {
99 }
99 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); ++it)
100 }
100 {
101
101 if (data->hasFormat(it.key())
102 return false;
102 && (it.value() == VisualizationDragDropContainer::DropBehavior::Inserted
103 }
103 || it.value()
104
104 == VisualizationDragDropContainer::DropBehavior::InsertedAndMerged))
105 bool hasPlaceHolder() const
105 {
106 {
106 return true;
107 return sqpApp->dragDropGuiController().placeHolder().parentWidget()
107 }
108 == m_Layout->parentWidget();
108 }
109 }
109
110
110 return false;
111 VisualizationDragWidget *getChildDragWidgetAt(const QWidget *parent, const QPoint &pos) const
111 }
112 {
112
113 VisualizationDragWidget *dragWidget = nullptr;
113 bool hasPlaceHolder() const
114
114 {
115 for (auto child : parent->children()) {
115 return sqpApp->dragDropGuiController().placeHolder().parentWidget()
116 auto widget = qobject_cast<VisualizationDragWidget *>(child);
116 == m_Layout->parentWidget();
117 if (widget && widget->isVisible()) {
117 }
118 if (widget->frameGeometry().contains(pos)) {
118
119 dragWidget = widget;
119 VisualizationDragWidget* getChildDragWidgetAt(const QWidget* parent, const QPoint& pos) const
120 break;
120 {
121 }
121 VisualizationDragWidget* dragWidget = nullptr;
122 }
122
123 }
123 for (auto child : parent->children())
124
124 {
125 return dragWidget;
125 auto widget = qobject_cast<VisualizationDragWidget*>(child);
126 }
126 if (widget && widget->isVisible())
127
127 {
128 bool cursorIsInContainer(QWidget *container) const
128 if (widget->frameGeometry().contains(pos))
129 {
129 {
130 auto widgetUnderMouse = sqpApp->widgetAt(QCursor::pos());
130 dragWidget = widget;
131 return container->isAncestorOf(widgetUnderMouse) && widgetUnderMouse != container
131 break;
132 && sqpApp->dragDropGuiController().placeHolder().isAncestorOf(widgetUnderMouse);
132 }
133 }
133 }
134
134 }
135 int countDragWidget(const QWidget *parent, bool onlyVisible = false) const
135
136 {
136 return dragWidget;
137 auto nbGraph = 0;
137 }
138 for (auto child : parent->children()) {
138
139 if (qobject_cast<VisualizationDragWidget *>(child)) {
139 bool cursorIsInContainer(QWidget* container) const
140 if (!onlyVisible || qobject_cast<VisualizationDragWidget *>(child)->isVisible()) {
140 {
141 nbGraph += 1;
141 auto widgetUnderMouse = sqpApp->widgetAt(QCursor::pos());
142 }
142 return container->isAncestorOf(widgetUnderMouse) && widgetUnderMouse != container
143 }
143 && sqpApp->dragDropGuiController().placeHolder().isAncestorOf(widgetUnderMouse);
144 }
144 }
145
145
146 return nbGraph;
146 int countDragWidget(const QWidget* parent, bool onlyVisible = false) const
147 }
147 {
148
148 auto nbGraph = 0;
149 bool findPlaceHolderPosition(const QPoint &pos, const QMimeData *mimeData, bool canInsert,
149 for (auto child : parent->children())
150 bool canMerge, const VisualizationDragDropContainer *container);
150 {
151 };
151 if (qobject_cast<VisualizationDragWidget*>(child))
152
152 {
153 VisualizationDragDropContainer::VisualizationDragDropContainer(QWidget *parent)
153 if (!onlyVisible || qobject_cast<VisualizationDragWidget*>(child)->isVisible())
154 : QFrame{parent},
154 {
155 impl{spimpl::make_unique_impl<VisualizationDragDropContainerPrivate>(this)}
155 nbGraph += 1;
156 {
156 }
157 setAcceptDrops(true);
157 }
158 }
158 }
159
159
160 void VisualizationDragDropContainer::addDragWidget(VisualizationDragWidget *dragWidget)
160 return nbGraph;
161 {
161 }
162 impl->m_Layout->addWidget(dragWidget);
162
163 disconnect(dragWidget, &VisualizationDragWidget::dragDetected, nullptr, nullptr);
163 bool findPlaceHolderPosition(const QPoint& pos, const QMimeData* mimeData, bool canInsert,
164 connect(dragWidget, &VisualizationDragWidget::dragDetected, this,
164 bool canMerge, const VisualizationDragDropContainer* container);
165 &VisualizationDragDropContainer::startDrag);
165 };
166 }
166
167
167 VisualizationDragDropContainer::VisualizationDragDropContainer(QWidget* parent)
168 void VisualizationDragDropContainer::insertDragWidget(int index,
168 : QFrame { parent }
169 VisualizationDragWidget *dragWidget)
169 , impl { spimpl::make_unique_impl<VisualizationDragDropContainerPrivate>(this) }
170 {
170 {
171 impl->m_Layout->insertWidget(index, dragWidget);
171 setAcceptDrops(true);
172 disconnect(dragWidget, &VisualizationDragWidget::dragDetected, nullptr, nullptr);
172 }
173 connect(dragWidget, &VisualizationDragWidget::dragDetected, this,
173
174 &VisualizationDragDropContainer::startDrag);
174 void VisualizationDragDropContainer::addDragWidget(VisualizationDragWidget* dragWidget)
175 }
175 {
176
176 impl->m_Layout->addWidget(dragWidget);
177 void VisualizationDragDropContainer::setMimeType(
177 disconnect(dragWidget, &VisualizationDragWidget::dragDetected, nullptr, nullptr);
178 const QString &mimeType, VisualizationDragDropContainer::DropBehavior behavior)
178 connect(dragWidget, &VisualizationDragWidget::dragDetected, this,
179 {
179 &VisualizationDragDropContainer::startDrag);
180 impl->m_AcceptedMimeTypes[mimeType] = behavior;
180 }
181 }
181
182
182 void VisualizationDragDropContainer::insertDragWidget(
183 int VisualizationDragDropContainer::countDragWidget() const
183 int index, VisualizationDragWidget* dragWidget)
184 {
184 {
185 return impl->countDragWidget(this);
185 impl->m_Layout->insertWidget(index, dragWidget);
186 }
186 disconnect(dragWidget, &VisualizationDragWidget::dragDetected, nullptr, nullptr);
187
187 connect(dragWidget, &VisualizationDragWidget::dragDetected, this,
188 void VisualizationDragDropContainer::setAcceptMimeDataFunction(
188 &VisualizationDragDropContainer::startDrag);
189 VisualizationDragDropContainer::AcceptMimeDataFunction fun)
189 }
190 {
190
191 impl->m_AcceptMimeDataFun = fun;
191 void VisualizationDragDropContainer::setMimeType(
192 }
192 const QString& mimeType, VisualizationDragDropContainer::DropBehavior behavior)
193
193 {
194 void VisualizationDragDropContainer::setAcceptDragWidgetFunction(
194 impl->m_AcceptedMimeTypes[mimeType] = behavior;
195 VisualizationDragDropContainer::AcceptDragWidgetFunction fun)
195 }
196 {
196
197 impl->m_AcceptDragWidgetFun = fun;
197 int VisualizationDragDropContainer::countDragWidget() const
198 }
198 {
199
199 return impl->countDragWidget(this);
200 void VisualizationDragDropContainer::setPlaceHolderType(DragDropGuiController::PlaceHolderType type,
200 }
201 const QString &placeHolderText)
201
202 {
202 void VisualizationDragDropContainer::setAcceptMimeDataFunction(
203 impl->m_PlaceHolderType = type;
203 VisualizationDragDropContainer::AcceptMimeDataFunction fun)
204 impl->m_PlaceHolderText = placeHolderText;
204 {
205 }
205 impl->m_AcceptMimeDataFun = fun;
206
206 }
207 void VisualizationDragDropContainer::startDrag(VisualizationDragWidget *dragWidget,
207
208 const QPoint &dragPosition)
208 void VisualizationDragDropContainer::setAcceptDragWidgetFunction(
209 {
209 VisualizationDragDropContainer::AcceptDragWidgetFunction fun)
210 auto &helper = sqpApp->dragDropGuiController();
210 {
211 helper.resetDragAndDrop();
211 impl->m_AcceptDragWidgetFun = fun;
212
212 }
213 // Note: The management of the drag object is done by Qt
213
214 auto drag = new QDrag{dragWidget};
214 void VisualizationDragDropContainer::setPlaceHolderType(
215
215 DragDropGuiController::PlaceHolderType type, const QString& placeHolderText)
216 auto mimeData = dragWidget->mimeData(dragPosition);
216 {
217 drag->setMimeData(mimeData);
217 impl->m_PlaceHolderType = type;
218
218 impl->m_PlaceHolderText = placeHolderText;
219 auto pixmap = dragWidget->customDragPixmap(dragPosition);
219 }
220 if (pixmap.isNull()) {
220
221 pixmap = QPixmap{dragWidget->size()};
221 void VisualizationDragDropContainer::startDrag(
222 dragWidget->render(&pixmap);
222 VisualizationDragWidget* dragWidget, const QPoint& dragPosition)
223 }
223 {
224
224 auto& helper = sqpApp->dragDropGuiController();
225 drag->setPixmap(pixmap.scaled(DRAGGED_MINIATURE_WIDTH, DRAGGED_MINIATURE_WIDTH,
225 helper.resetDragAndDrop();
226 Qt::KeepAspectRatio, Qt::SmoothTransformation));
226
227
227 // Note: The management of the drag object is done by Qt
228 auto image = pixmap.toImage();
228 auto drag = new QDrag { dragWidget };
229 mimeData->setImageData(image);
229
230 mimeData->setUrls({helper.imageTemporaryUrl(image)});
230 auto mimeData = dragWidget->mimeData(dragPosition);
231
231 drag->setMimeData(mimeData);
232 if (impl->m_Layout->indexOf(dragWidget) >= 0) {
232
233
233 auto pixmap = dragWidget->customDragPixmap(dragPosition);
234 if (impl->acceptMimeData(mimeData) && impl->allowInsertForMimeData(mimeData)) {
234 if (pixmap.isNull())
235 helper.setCurrentDragWidget(dragWidget);
235 {
236
236 pixmap = QPixmap { dragWidget->size() };
237 if (impl->cursorIsInContainer(this)) {
237 dragWidget->render(&pixmap);
238 auto dragWidgetIndex = impl->m_Layout->indexOf(dragWidget);
238 }
239 helper.insertPlaceHolder(impl->m_Layout, dragWidgetIndex, impl->m_PlaceHolderType,
239
240 impl->m_PlaceHolderText);
240 drag->setPixmap(pixmap.scaled(DRAGGED_MINIATURE_WIDTH, DRAGGED_MINIATURE_WIDTH,
241 dragWidget->setVisible(false);
241 Qt::KeepAspectRatio, Qt::SmoothTransformation));
242 }
242
243 else {
243 auto image = pixmap.toImage();
244 // The drag starts directly outside the drop zone
244 mimeData->setImageData(image);
245 // do not add the placeHolder
245 mimeData->setUrls({ helper.imageTemporaryUrl(image) });
246 }
246
247 }
247 if (impl->m_Layout->indexOf(dragWidget) >= 0)
248
248 {
249 drag->exec(Qt::MoveAction | Qt::CopyAction, Qt::MoveAction);
249
250
250 if (impl->acceptMimeData(mimeData) && impl->allowInsertForMimeData(mimeData))
251 helper.doCloseWidgets();
251 {
252 }
252 helper.setCurrentDragWidget(dragWidget);
253 else {
253
254 qCWarning(LOG_VisualizationDragDropContainer())
254 if (impl->cursorIsInContainer(this))
255 << tr("VisualizationDragDropContainer::startDrag, drag aborted, the specified "
255 {
256 "VisualizationDragWidget is not found in this container.");
256 auto dragWidgetIndex = impl->m_Layout->indexOf(dragWidget);
257 }
257 helper.insertPlaceHolder(impl->m_Layout, dragWidgetIndex, impl->m_PlaceHolderType,
258 }
258 impl->m_PlaceHolderText);
259
259 dragWidget->setVisible(false);
260 void VisualizationDragDropContainer::dragEnterEvent(QDragEnterEvent *event)
260 }
261 {
261 else
262 if (impl->acceptMimeData(event->mimeData())) {
262 {
263 event->acceptProposedAction();
263 // The drag starts directly outside the drop zone
264
264 // do not add the placeHolder
265 auto &helper = sqpApp->dragDropGuiController();
265 }
266
266 }
267 if (!impl->hasPlaceHolder()) {
267
268 auto dragWidget = helper.getCurrentDragWidget();
268 drag->exec(Qt::MoveAction | Qt::CopyAction, Qt::MoveAction);
269
269
270 if (dragWidget) {
270 helper.doCloseWidgets();
271 // If the drag&drop is internal to the visualization, entering the container hide
271 }
272 // the dragWidget which was made visible by the dragLeaveEvent
272 else
273 auto parentWidget
273 {
274 = qobject_cast<VisualizationDragDropContainer *>(dragWidget->parentWidget());
274 qCWarning(LOG_VisualizationDragDropContainer())
275 if (parentWidget) {
275 << tr("VisualizationDragDropContainer::startDrag, drag aborted, the specified "
276 dragWidget->setVisible(false);
276 "VisualizationDragWidget is not found in this container.");
277 }
277 }
278 }
278 }
279
279
280 auto canMerge = impl->allowMergeForMimeData(event->mimeData());
280 void VisualizationDragDropContainer::dragEnterEvent(QDragEnterEvent* event)
281 auto canInsert = impl->allowInsertForMimeData(event->mimeData());
281 {
282 if (!impl->findPlaceHolderPosition(event->pos(), event->mimeData(), canInsert, canMerge,
282 if (impl->acceptMimeData(event->mimeData()))
283 this)) {
283 {
284 event->ignore();
284 event->acceptProposedAction();
285 }
285
286 }
286 auto& helper = sqpApp->dragDropGuiController();
287 else {
287
288 // do nothing
288 if (!impl->hasPlaceHolder())
289 }
289 {
290 }
290 auto dragWidget = helper.getCurrentDragWidget();
291 else {
291
292 event->ignore();
292 if (dragWidget)
293 }
293 {
294
294 // If the drag&drop is internal to the visualization, entering the container hide
295 QWidget::dragEnterEvent(event);
295 // the dragWidget which was made visible by the dragLeaveEvent
296 }
296 auto parentWidget
297
297 = qobject_cast<VisualizationDragDropContainer*>(dragWidget->parentWidget());
298 void VisualizationDragDropContainer::dragLeaveEvent(QDragLeaveEvent *event)
298 if (parentWidget)
299 {
299 {
300 Q_UNUSED(event);
300 dragWidget->setVisible(false);
301
301 }
302 auto &helper = sqpApp->dragDropGuiController();
302 }
303
303
304 if (!impl->cursorIsInContainer(this)) {
304 auto canMerge = impl->allowMergeForMimeData(event->mimeData());
305 helper.removePlaceHolder();
305 auto canInsert = impl->allowInsertForMimeData(event->mimeData());
306 helper.setHightlightedDragWidget(nullptr);
306 if (!impl->findPlaceHolderPosition(
307 impl->m_MinContainerHeight = 0;
307 event->pos(), event->mimeData(), canInsert, canMerge, this))
308
308 {
309 auto dragWidget = helper.getCurrentDragWidget();
309 event->ignore();
310 if (dragWidget) {
310 }
311 // dragWidget has a value only if the drag is started from the visualization
311 }
312 // In that case, shows the drag widget at its original place
312 else
313 // So the drag widget doesn't stay hidden if the drop occurs outside the visualization
313 {
314 // drop zone (It is not possible to catch a drop event outside of the application)
314 // do nothing
315
315 }
316 if (dragWidget) {
316 }
317 dragWidget->setVisible(true);
317 else
318 }
318 {
319 }
319 event->ignore();
320 }
320 }
321 else {
321
322 // Leave event probably received for a child widget.
322 QWidget::dragEnterEvent(event);
323 // Do nothing.
323 }
324 // Note: The DragLeave event, doesn't have any mean to determine who sent it.
324
325 }
325 void VisualizationDragDropContainer::dragLeaveEvent(QDragLeaveEvent* event)
326
326 {
327 QWidget::dragLeaveEvent(event);
327 Q_UNUSED(event);
328 }
328
329
329 auto& helper = sqpApp->dragDropGuiController();
330 void VisualizationDragDropContainer::dragMoveEvent(QDragMoveEvent *event)
330
331 {
331 if (!impl->cursorIsInContainer(this))
332 if (impl->acceptMimeData(event->mimeData())) {
332 {
333 auto canMerge = impl->allowMergeForMimeData(event->mimeData());
333 helper.removePlaceHolder();
334 auto canInsert = impl->allowInsertForMimeData(event->mimeData());
334 helper.setHightlightedDragWidget(nullptr);
335 impl->findPlaceHolderPosition(event->pos(), event->mimeData(), canInsert, canMerge, this);
335 impl->m_MinContainerHeight = 0;
336 }
336
337 else {
337 auto dragWidget = helper.getCurrentDragWidget();
338 event->ignore();
338 if (dragWidget)
339 }
339 {
340
340 // dragWidget has a value only if the drag is started from the visualization
341 QWidget::dragMoveEvent(event);
341 // In that case, shows the drag widget at its original place
342 }
342 // So the drag widget doesn't stay hidden if the drop occurs outside the visualization
343
343 // drop zone (It is not possible to catch a drop event outside of the application)
344 void VisualizationDragDropContainer::dropEvent(QDropEvent *event)
344
345 {
345 if (dragWidget)
346 auto &helper = sqpApp->dragDropGuiController();
346 {
347
347 dragWidget->setVisible(true);
348 if (impl->acceptMimeData(event->mimeData())) {
348 }
349 auto dragWidget = helper.getCurrentDragWidget();
349 }
350 if (impl->hasPlaceHolder()) {
350 }
351 // drop where the placeHolder is located
351 else
352
352 {
353 auto canInsert = impl->allowInsertForMimeData(event->mimeData());
353 // Leave event probably received for a child widget.
354 if (canInsert) {
354 // Do nothing.
355 auto droppedIndex = impl->m_Layout->indexOf(&helper.placeHolder());
355 // Note: The DragLeave event, doesn't have any mean to determine who sent it.
356
356 }
357 if (dragWidget) {
357
358 auto dragWidgetIndex = impl->m_Layout->indexOf(dragWidget);
358 QWidget::dragLeaveEvent(event);
359 if (dragWidgetIndex >= 0 && dragWidgetIndex < droppedIndex) {
359 }
360 // Correction of the index if the drop occurs in the same container
360
361 // and if the drag is started from the visualization (in that case, the
361 void VisualizationDragDropContainer::dragMoveEvent(QDragMoveEvent* event)
362 // dragWidget is hidden)
362 {
363 droppedIndex -= 1;
363 if (impl->acceptMimeData(event->mimeData()))
364 }
364 {
365
365 event->acceptProposedAction();
366 dragWidget->setVisible(true);
366 auto canMerge = impl->allowMergeForMimeData(event->mimeData());
367 }
367 auto canInsert = impl->allowInsertForMimeData(event->mimeData());
368
368 impl->findPlaceHolderPosition(event->pos(), event->mimeData(), canInsert, canMerge, this);
369 event->acceptProposedAction();
369 }
370
370 else
371 helper.removePlaceHolder();
371 {
372
372 event->ignore();
373 emit dropOccuredInContainer(droppedIndex, event->mimeData());
373 }
374 }
374
375 else {
375 QWidget::dragMoveEvent(event);
376 qCWarning(LOG_VisualizationDragDropContainer()) << tr(
376 }
377 "VisualizationDragDropContainer::dropEvent, dropping on the placeHolder, but "
377
378 "the insertion is forbidden.");
378 void VisualizationDragDropContainer::dropEvent(QDropEvent* event)
379 Q_ASSERT(false);
379 {
380 }
380 auto& helper = sqpApp->dragDropGuiController();
381 }
381
382 else if (helper.getHightlightedDragWidget()) {
382 if (impl->acceptMimeData(event->mimeData()))
383 // drop on the highlighted widget
383 {
384
384 auto dragWidget = helper.getCurrentDragWidget();
385 auto canMerge = impl->allowMergeForMimeData(event->mimeData());
385 if (impl->hasPlaceHolder())
386 if (canMerge) {
386 {
387 event->acceptProposedAction();
387 // drop where the placeHolder is located
388 emit dropOccuredOnWidget(helper.getHightlightedDragWidget(), event->mimeData());
388
389 }
389 auto canInsert = impl->allowInsertForMimeData(event->mimeData());
390 else {
390 if (canInsert)
391 qCWarning(LOG_VisualizationDragDropContainer())
391 {
392 << tr("VisualizationDragDropContainer::dropEvent, dropping on a widget, but "
392 auto droppedIndex = impl->m_Layout->indexOf(&helper.placeHolder());
393 "the merge is forbidden.");
393
394 Q_ASSERT(false);
394 if (dragWidget)
395 }
395 {
396 }
396 auto dragWidgetIndex = impl->m_Layout->indexOf(dragWidget);
397 }
397 if (dragWidgetIndex >= 0 && dragWidgetIndex < droppedIndex)
398 else {
398 {
399 event->ignore();
399 // Correction of the index if the drop occurs in the same container
400 }
400 // and if the drag is started from the visualization (in that case, the
401
401 // dragWidget is hidden)
402 sqpApp->dragDropGuiController().setHightlightedDragWidget(nullptr);
402 droppedIndex -= 1;
403 impl->m_MinContainerHeight = 0;
403 }
404
404
405 QWidget::dropEvent(event);
405 dragWidget->setVisible(true);
406 }
406 }
407
407
408
408 event->acceptProposedAction();
409 bool VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::findPlaceHolderPosition(
409
410 const QPoint &pos, const QMimeData *mimeData, bool canInsert, bool canMerge,
410 helper.removePlaceHolder();
411 const VisualizationDragDropContainer *container)
411
412 {
412 emit dropOccuredInContainer(droppedIndex, event->mimeData());
413 auto &helper = sqpApp->dragDropGuiController();
413 }
414
414 else
415 auto absPos = container->mapToGlobal(pos);
415 {
416 auto isOnPlaceHolder = helper.placeHolder().isAncestorOf(sqpApp->widgetAt(absPos));
416 qCWarning(LOG_VisualizationDragDropContainer()) << tr(
417
417 "VisualizationDragDropContainer::dropEvent, dropping on the placeHolder, but "
418 if (countDragWidget(container, true) == 0) {
418 "the insertion is forbidden.");
419 // Drop on an empty container, just add the placeHolder at the top
419 Q_ASSERT(false);
420 helper.insertPlaceHolder(m_Layout, 0, m_PlaceHolderType, m_PlaceHolderText);
420 }
421 }
421 }
422 else if (!isOnPlaceHolder) {
422 else if (helper.getHightlightedDragWidget())
423 auto nbDragWidget = countDragWidget(container);
423 {
424 if (nbDragWidget > 0) {
424 // drop on the highlighted widget
425
425
426 if (m_MinContainerHeight == 0) {
426 auto canMerge = impl->allowMergeForMimeData(event->mimeData());
427 m_MinContainerHeight = container->size().height();
427 if (canMerge)
428 }
428 {
429
429 event->acceptProposedAction();
430 m_MinContainerHeight = qMin(m_MinContainerHeight, container->size().height());
430 emit dropOccuredOnWidget(helper.getHightlightedDragWidget(), event->mimeData());
431 auto graphHeight = qMax(m_MinContainerHeight / nbDragWidget, GRAPH_MINIMUM_HEIGHT);
431 }
432
432 else
433 auto posY = pos.y();
433 {
434 auto dropIndex = floor(posY / graphHeight);
434 qCWarning(LOG_VisualizationDragDropContainer())
435 auto zoneSize = graphHeight / 4.0;
435 << tr("VisualizationDragDropContainer::dropEvent, dropping on a widget, but "
436
436 "the merge is forbidden.");
437
437 Q_ASSERT(false);
438 auto isOnTop = posY < dropIndex * graphHeight + zoneSize;
438 }
439 auto isOnBottom = posY > (dropIndex + 1) * graphHeight - zoneSize;
439 }
440
440 }
441 auto placeHolderIndex = m_Layout->indexOf(&(helper.placeHolder()));
441 else
442
442 {
443 auto dragWidgetHovered = getChildDragWidgetAt(container, pos);
443 event->ignore();
444
444 }
445 auto acceptMerge = m_AcceptDragWidgetFun(dragWidgetHovered, mimeData);
445
446
446 sqpApp->dragDropGuiController().setHightlightedDragWidget(nullptr);
447 if (canInsert && (isOnTop || isOnBottom || !canMerge || !acceptMerge)) {
447 impl->m_MinContainerHeight = 0;
448 if (posY > (dropIndex + 1) * graphHeight - graphHeight / 2.0) {
448
449 dropIndex += 1;
449 QWidget::dropEvent(event);
450 }
450 }
451
451
452 if (helper.getCurrentDragWidget()) {
452
453 auto dragWidgetIndex = m_Layout->indexOf(helper.getCurrentDragWidget());
453 bool VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::findPlaceHolderPosition(
454 if (dragWidgetIndex >= 0 && dragWidgetIndex <= dropIndex) {
454 const QPoint& pos, const QMimeData* mimeData, bool canInsert, bool canMerge,
455 // Correction of the index if the drop occurs in the same container
455 const VisualizationDragDropContainer* container)
456 // and if the drag is started from the visualization (in that case, the
456 {
457 // dragWidget is hidden)
457 auto& helper = sqpApp->dragDropGuiController();
458 dropIndex += 1;
458
459 }
459 auto absPos = container->mapToGlobal(pos);
460 }
460 auto isOnPlaceHolder = helper.placeHolder().isAncestorOf(sqpApp->widgetAt(absPos));
461
461
462 if (dropIndex != placeHolderIndex) {
462 if (countDragWidget(container, true) == 0)
463 helper.insertPlaceHolder(m_Layout, dropIndex, m_PlaceHolderType,
463 {
464 m_PlaceHolderText);
464 // Drop on an empty container, just add the placeHolder at the top
465 }
465 helper.insertPlaceHolder(m_Layout, 0, m_PlaceHolderType, m_PlaceHolderText);
466
466 }
467 helper.setHightlightedDragWidget(nullptr);
467 else if (!isOnPlaceHolder)
468 }
468 {
469 else if (canMerge && dragWidgetHovered) {
469 auto nbDragWidget = countDragWidget(container);
470 // drop on the middle -> merge
470 if (nbDragWidget > 0)
471 if (hasPlaceHolder()) {
471 {
472 helper.removePlaceHolder();
472
473 }
473 if (m_MinContainerHeight == 0)
474
474 {
475 helper.setHightlightedDragWidget(dragWidgetHovered);
475 m_MinContainerHeight = container->size().height();
476 }
476 }
477 else {
477
478 qCWarning(LOG_VisualizationDragDropContainer())
478 m_MinContainerHeight = qMin(m_MinContainerHeight, container->size().height());
479 << tr("VisualizationDragDropContainer::findPlaceHolderPosition, no valid drop "
479 auto graphHeight = qMax(m_MinContainerHeight / nbDragWidget, GRAPH_MINIMUM_HEIGHT);
480 "action.");
480
481 }
481 auto posY = pos.y();
482 }
482 auto dropIndex = floor(posY / graphHeight);
483 else {
483 auto zoneSize = graphHeight / 4.0;
484 qCInfo(LOG_VisualizationDragDropContainer())
484
485 << tr("VisualizationDragDropContainer::findPlaceHolderPosition, no widget "
485
486 "found in the "
486 auto isOnTop = posY < dropIndex * graphHeight + zoneSize;
487 "container");
487 auto isOnBottom = posY > (dropIndex + 1) * graphHeight - zoneSize;
488 }
488
489 }
489 auto placeHolderIndex = m_Layout->indexOf(&(helper.placeHolder()));
490 else {
490
491 // the mouse is hover the placeHolder
491 auto dragWidgetHovered = getChildDragWidgetAt(container, pos);
492 // Do nothing
492
493 }
493 auto acceptMerge = m_AcceptDragWidgetFun(dragWidgetHovered, mimeData);
494
494
495 return true;
495 if (canInsert && (isOnTop || isOnBottom || !canMerge || !acceptMerge))
496 }
496 {
497 if (posY > (dropIndex + 1) * graphHeight - graphHeight / 2.0)
498 {
499 dropIndex += 1;
500 }
501
502 if (helper.getCurrentDragWidget())
503 {
504 auto dragWidgetIndex = m_Layout->indexOf(helper.getCurrentDragWidget());
505 if (dragWidgetIndex >= 0 && dragWidgetIndex <= dropIndex)
506 {
507 // Correction of the index if the drop occurs in the same container
508 // and if the drag is started from the visualization (in that case, the
509 // dragWidget is hidden)
510 dropIndex += 1;
511 }
512 }
513
514 if (dropIndex != placeHolderIndex)
515 {
516 helper.insertPlaceHolder(
517 m_Layout, dropIndex, m_PlaceHolderType, m_PlaceHolderText);
518 }
519
520 helper.setHightlightedDragWidget(nullptr);
521 }
522 else if (canMerge && dragWidgetHovered)
523 {
524 // drop on the middle -> merge
525 if (hasPlaceHolder())
526 {
527 helper.removePlaceHolder();
528 }
529
530 helper.setHightlightedDragWidget(dragWidgetHovered);
531 }
532 else
533 {
534 qCWarning(LOG_VisualizationDragDropContainer())
535 << tr("VisualizationDragDropContainer::findPlaceHolderPosition, no valid drop "
536 "action.");
537 }
538 }
539 else
540 {
541 qCInfo(LOG_VisualizationDragDropContainer())
542 << tr("VisualizationDragDropContainer::findPlaceHolderPosition, no widget "
543 "found in the "
544 "container");
545 }
546 }
547 else
548 {
549 // the mouse is hover the placeHolder
550 // Do nothing
551 }
552
553 return true;
554 }
@@ -47,4 +47,4 if cppcheck.found()
47 command : [cppcheck, '--enable=all',
47 command : [cppcheck, '--enable=all',
48 '--project=' + join_paths(meson.build_root(), 'compile_commands.json')]
48 '--project=' + join_paths(meson.build_root(), 'compile_commands.json')]
49 )
49 )
50 endif
50 endif No newline at end of file
@@ -30,13 +30,21 amdaplugin_prep_files = qt5.preprocess(moc_headers : amdaplugin_moc_headers,
30 qresources : amdaplugin_resources_files,
30 qresources : amdaplugin_resources_files,
31 ui_files : amdaplugin_ui_files)
31 ui_files : amdaplugin_ui_files)
32
32
33 cpp_args = ['-DAMDA_LIB','-DQT_PLUGIN']
34 message('======================='+get_option('default_library')+'==========================')
35 if(get_option('default_library') == 'static')
36 message('building amda plugin as static lib')
37 cpp_args += ['-DQT_STATICPLUGIN']
38 endif
39
33 sciqlop_amdaplugin = library('amdaplugin',
40 sciqlop_amdaplugin = library('amdaplugin',
34 amdaplugin_sources,
41 amdaplugin_sources,
35 amdaplugin_prep_files,
42 amdaplugin_prep_files,
36 cpp_args : ['-DAMDA_LIB','-DQT_PLUGIN'],
43 cpp_args : cpp_args,
37 include_directories : [amdaplugin_inc],
44 include_directories : [amdaplugin_inc],
38 dependencies : [sciqlop_core, sciqlop_gui],
45 dependencies : [sciqlop_core, sciqlop_gui],
39 install : true
46 install : true,
47 install_dir : join_paths(get_option('libdir'), 'SciQLop')
40 )
48 )
41
49
42
50
@@ -22,11 +22,17 gen = generator(moc,
22
22
23 mockplugin_moc_files = gen.process(mockplugin_moc_headers)
23 mockplugin_moc_files = gen.process(mockplugin_moc_headers)
24
24
25 cpp_args = ['-DMOCKPLUGIN_LIB','-DQT_PLUGIN']
26 if(get_option('default_library')=='static')
27 cpp_args += ['-DQT_STATICPLUGIN']
28 endif
29
25 sciqlop_mockplugin = library('mockplugin',
30 sciqlop_mockplugin = library('mockplugin',
26 mockplugin_sources,
31 mockplugin_sources,
27 mockplugin_moc_files,
32 mockplugin_moc_files,
28 cpp_args : '-DMOCKPLUGIN_LIB',
33 cpp_args : cpp_args,
29 include_directories : [mockplugin_inc],
34 include_directories : [mockplugin_inc],
30 dependencies : [sciqlop_core, sciqlop_gui],
35 dependencies : [sciqlop_core, sciqlop_gui],
31 install : true
36 install : true,
37 install_dir : join_paths(get_option('libdir'), 'SciQLop')
32 )
38 )
General Comments 0
You need to be logged in to leave comments. Login now