##// END OF EJS Templates
Merge branch 'feature/MacScrollbars' into develop
Thibaud Rabillard -
r930:72e367e25206 merge
parent child
Show More
@@ -0,0 +1,18
1 #ifndef SCIQLOP_MACSCROLLBARSTYLE_H
2 #define SCIQLOP_MACSCROLLBARSTYLE_H
3
4 #include <QProxyStyle>
5
6 /**
7 * @brief Special style to always display the scrollbars on MAC.
8 */
9 class MacScrollBarStyle : public QProxyStyle {
10
11 public:
12 int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
13 QStyleHintReturn *returnData) const;
14
15 void selfInstallOn(QWidget *widget, bool installOnSubWidgets);
16 };
17
18 #endif // SCIQLOP_MACSCROLLBARSTYLE_H
@@ -0,0 +1,40
1 #include "Visualization/MacScrollBarStyle.h"
2
3 #include <QWidget>
4
5 int MacScrollBarStyle::styleHint(QStyle::StyleHint hint, const QStyleOption *option,
6 const QWidget *widget, QStyleHintReturn *returnData) const
7 {
8 switch (hint) {
9 case SH_ScrollBar_Transient:
10 return false; // Makes the scrollbar always visible
11 case SH_ScrollView_FrameOnlyAroundContents:
12 return true; // Avoid that the scrollbar is drawn on top of the widget
13 default:
14 break;
15 }
16
17 return QProxyStyle::styleHint(hint, option, widget, returnData);
18 }
19
20 void MacScrollBarStyle::selfInstallOn(QWidget *widget, bool installOnSubWidgets)
21 {
22 // Note: a style can be installed on a particular widget but it is not automatically applied its
23 // children widgets.
24
25 QList<QWidget *> widgetsToStyle{widget};
26 while (!widgetsToStyle.isEmpty()) {
27
28 auto widget = widgetsToStyle.takeFirst();
29 widget->setStyle(this);
30
31 if (installOnSubWidgets) {
32 for (auto child : widget->children()) {
33 auto childWidget = qobject_cast<QWidget *>(child);
34 if (childWidget) {
35 widgetsToStyle << childWidget;
36 }
37 }
38 }
39 }
40 }
@@ -1,97 +1,98
1
1
2 gui_moc_headers = [
2 gui_moc_headers = [
3 'include/DataSource/DataSourceWidget.h',
3 'include/DataSource/DataSourceWidget.h',
4 'include/DataSource/DataSourceTreeWidget.h',
4 'include/DataSource/DataSourceTreeWidget.h',
5 'include/Settings/SqpSettingsDialog.h',
5 'include/Settings/SqpSettingsDialog.h',
6 'include/Settings/SqpSettingsGeneralWidget.h',
6 'include/Settings/SqpSettingsGeneralWidget.h',
7 'include/SidePane/SqpSidePane.h',
7 'include/SidePane/SqpSidePane.h',
8 'include/SqpApplication.h',
8 'include/SqpApplication.h',
9 'include/DragAndDrop/DragDropHelper.h',
9 'include/DragAndDrop/DragDropHelper.h',
10 'include/DragAndDrop/DragDropScroller.h',
10 'include/DragAndDrop/DragDropScroller.h',
11 'include/DragAndDrop/DragDropTabSwitcher.h',
11 'include/DragAndDrop/DragDropTabSwitcher.h',
12 'include/TimeWidget/TimeWidget.h',
12 'include/TimeWidget/TimeWidget.h',
13 'include/Variable/VariableInspectorWidget.h',
13 'include/Variable/VariableInspectorWidget.h',
14 'include/Variable/VariableInspectorTableView.h',
14 'include/Variable/VariableInspectorTableView.h',
15 'include/Variable/RenameVariableDialog.h',
15 'include/Variable/RenameVariableDialog.h',
16 'include/Visualization/qcustomplot.h',
16 'include/Visualization/qcustomplot.h',
17 'include/Visualization/VisualizationGraphWidget.h',
17 'include/Visualization/VisualizationGraphWidget.h',
18 'include/Visualization/VisualizationTabWidget.h',
18 'include/Visualization/VisualizationTabWidget.h',
19 'include/Visualization/VisualizationWidget.h',
19 'include/Visualization/VisualizationWidget.h',
20 'include/Visualization/VisualizationZoneWidget.h',
20 'include/Visualization/VisualizationZoneWidget.h',
21 'include/Visualization/VisualizationDragDropContainer.h',
21 'include/Visualization/VisualizationDragDropContainer.h',
22 'include/Visualization/VisualizationDragWidget.h'
22 'include/Visualization/VisualizationDragWidget.h'
23 ]
23 ]
24
24
25 gui_ui_files = [
25 gui_ui_files = [
26 'ui/DataSource/DataSourceWidget.ui',
26 'ui/DataSource/DataSourceWidget.ui',
27 'ui/Settings/SqpSettingsDialog.ui',
27 'ui/Settings/SqpSettingsDialog.ui',
28 'ui/Settings/SqpSettingsGeneralWidget.ui',
28 'ui/Settings/SqpSettingsGeneralWidget.ui',
29 'ui/SidePane/SqpSidePane.ui',
29 'ui/SidePane/SqpSidePane.ui',
30 'ui/TimeWidget/TimeWidget.ui',
30 'ui/TimeWidget/TimeWidget.ui',
31 'ui/Variable/VariableInspectorWidget.ui',
31 'ui/Variable/VariableInspectorWidget.ui',
32 'ui/Variable/RenameVariableDialog.ui',
32 'ui/Variable/RenameVariableDialog.ui',
33 'ui/Variable/VariableMenuHeaderWidget.ui',
33 'ui/Variable/VariableMenuHeaderWidget.ui',
34 'ui/Visualization/VisualizationGraphWidget.ui',
34 'ui/Visualization/VisualizationGraphWidget.ui',
35 'ui/Visualization/VisualizationTabWidget.ui',
35 'ui/Visualization/VisualizationTabWidget.ui',
36 'ui/Visualization/VisualizationWidget.ui',
36 'ui/Visualization/VisualizationWidget.ui',
37 'ui/Visualization/VisualizationZoneWidget.ui'
37 'ui/Visualization/VisualizationZoneWidget.ui'
38 ]
38 ]
39
39
40 gui_qresources = ['resources/sqpguiresources.qrc']
40 gui_qresources = ['resources/sqpguiresources.qrc']
41
41
42 gui_moc_files = qt5.preprocess(moc_headers : gui_moc_headers,
42 gui_moc_files = qt5.preprocess(moc_headers : gui_moc_headers,
43 ui_files : gui_ui_files,
43 ui_files : gui_ui_files,
44 qresources : gui_qresources)
44 qresources : gui_qresources)
45
45
46 gui_sources = [
46 gui_sources = [
47 'src/SqpApplication.cpp',
47 'src/SqpApplication.cpp',
48 'src/DragAndDrop/DragDropHelper.cpp',
48 'src/DragAndDrop/DragDropHelper.cpp',
49 'src/DragAndDrop/DragDropScroller.cpp',
49 'src/DragAndDrop/DragDropScroller.cpp',
50 'src/DragAndDrop/DragDropTabSwitcher.cpp',
50 'src/DragAndDrop/DragDropTabSwitcher.cpp',
51 'src/Common/ColorUtils.cpp',
51 'src/Common/ColorUtils.cpp',
52 'src/Common/VisualizationDef.cpp',
52 'src/Common/VisualizationDef.cpp',
53 'src/DataSource/DataSourceTreeWidgetItem.cpp',
53 'src/DataSource/DataSourceTreeWidgetItem.cpp',
54 'src/DataSource/DataSourceTreeWidgetHelper.cpp',
54 'src/DataSource/DataSourceTreeWidgetHelper.cpp',
55 'src/DataSource/DataSourceWidget.cpp',
55 'src/DataSource/DataSourceWidget.cpp',
56 'src/DataSource/DataSourceTreeWidget.cpp',
56 'src/DataSource/DataSourceTreeWidget.cpp',
57 'src/Settings/SqpSettingsDialog.cpp',
57 'src/Settings/SqpSettingsDialog.cpp',
58 'src/Settings/SqpSettingsGeneralWidget.cpp',
58 'src/Settings/SqpSettingsGeneralWidget.cpp',
59 'src/SidePane/SqpSidePane.cpp',
59 'src/SidePane/SqpSidePane.cpp',
60 'src/TimeWidget/TimeWidget.cpp',
60 'src/TimeWidget/TimeWidget.cpp',
61 'src/Variable/VariableInspectorWidget.cpp',
61 'src/Variable/VariableInspectorWidget.cpp',
62 'src/Variable/VariableInspectorTableView.cpp',
62 'src/Variable/VariableInspectorTableView.cpp',
63 'src/Variable/VariableMenuHeaderWidget.cpp',
63 'src/Variable/VariableMenuHeaderWidget.cpp',
64 'src/Variable/RenameVariableDialog.cpp',
64 'src/Variable/RenameVariableDialog.cpp',
65 'src/Visualization/VisualizationGraphHelper.cpp',
65 'src/Visualization/VisualizationGraphHelper.cpp',
66 'src/Visualization/VisualizationGraphRenderingDelegate.cpp',
66 'src/Visualization/VisualizationGraphRenderingDelegate.cpp',
67 'src/Visualization/VisualizationGraphWidget.cpp',
67 'src/Visualization/VisualizationGraphWidget.cpp',
68 'src/Visualization/VisualizationTabWidget.cpp',
68 'src/Visualization/VisualizationTabWidget.cpp',
69 'src/Visualization/VisualizationWidget.cpp',
69 'src/Visualization/VisualizationWidget.cpp',
70 'src/Visualization/VisualizationZoneWidget.cpp',
70 'src/Visualization/VisualizationZoneWidget.cpp',
71 'src/Visualization/qcustomplot.cpp',
71 'src/Visualization/qcustomplot.cpp',
72 'src/Visualization/QCustomPlotSynchronizer.cpp',
72 'src/Visualization/QCustomPlotSynchronizer.cpp',
73 'src/Visualization/operations/FindVariableOperation.cpp',
73 'src/Visualization/operations/FindVariableOperation.cpp',
74 'src/Visualization/operations/GenerateVariableMenuOperation.cpp',
74 'src/Visualization/operations/GenerateVariableMenuOperation.cpp',
75 'src/Visualization/operations/MenuBuilder.cpp',
75 'src/Visualization/operations/MenuBuilder.cpp',
76 'src/Visualization/operations/RemoveVariableOperation.cpp',
76 'src/Visualization/operations/RemoveVariableOperation.cpp',
77 'src/Visualization/operations/RescaleAxeOperation.cpp',
77 'src/Visualization/operations/RescaleAxeOperation.cpp',
78 'src/Visualization/VisualizationDragDropContainer.cpp',
78 'src/Visualization/VisualizationDragDropContainer.cpp',
79 'src/Visualization/VisualizationDragWidget.cpp',
79 'src/Visualization/VisualizationDragWidget.cpp',
80 'src/Visualization/AxisRenderingUtils.cpp',
80 'src/Visualization/AxisRenderingUtils.cpp',
81 'src/Visualization/PlottablesRenderingUtils.cpp'
81 'src/Visualization/PlottablesRenderingUtils.cpp',
82 'src/Visualization/MacScrollBarStyle.cpp'
82 ]
83 ]
83
84
84 gui_inc = include_directories(['include'])
85 gui_inc = include_directories(['include'])
85
86
86 sciqlop_gui_lib = library('sciqlopgui',
87 sciqlop_gui_lib = library('sciqlopgui',
87 gui_sources,
88 gui_sources,
88 gui_moc_files,
89 gui_moc_files,
89 include_directories : [gui_inc],
90 include_directories : [gui_inc],
90 dependencies : [ qt5printsupport, qt5gui, qt5widgets, qt5svg, sciqlop_core],
91 dependencies : [ qt5printsupport, qt5gui, qt5widgets, qt5svg, sciqlop_core],
91 install : true
92 install : true
92 )
93 )
93
94
94 sciqlop_gui = declare_dependency(link_with : sciqlop_gui_lib,
95 sciqlop_gui = declare_dependency(link_with : sciqlop_gui_lib,
95 include_directories : gui_inc,
96 include_directories : gui_inc,
96 dependencies : [qt5printsupport, qt5gui, qt5widgets, qt5svg, sciqlop_core])
97 dependencies : [qt5printsupport, qt5gui, qt5widgets, qt5svg, sciqlop_core])
97
98
@@ -1,309 +1,319
1 #include "Visualization/VisualizationTabWidget.h"
1 #include "Visualization/VisualizationTabWidget.h"
2 #include "Visualization/IVisualizationWidgetVisitor.h"
2 #include "Visualization/IVisualizationWidgetVisitor.h"
3 #include "ui_VisualizationTabWidget.h"
3 #include "ui_VisualizationTabWidget.h"
4
4
5 #include "Visualization/VisualizationGraphWidget.h"
5 #include "Visualization/VisualizationGraphWidget.h"
6 #include "Visualization/VisualizationZoneWidget.h"
6 #include "Visualization/VisualizationZoneWidget.h"
7
7
8 #include "Visualization/MacScrollBarStyle.h"
9
8 #include "Variable/VariableController.h"
10 #include "Variable/VariableController.h"
9
11
10 #include "Common/MimeTypesDef.h"
12 #include "Common/MimeTypesDef.h"
11
13
12 #include "DragAndDrop/DragDropHelper.h"
14 #include "DragAndDrop/DragDropHelper.h"
13 #include "SqpApplication.h"
15 #include "SqpApplication.h"
14
16
15 Q_LOGGING_CATEGORY(LOG_VisualizationTabWidget, "VisualizationTabWidget")
17 Q_LOGGING_CATEGORY(LOG_VisualizationTabWidget, "VisualizationTabWidget")
16
18
17 namespace {
19 namespace {
18
20
19 /// Generates a default name for a new zone, according to the number of zones already displayed in
21 /// Generates a default name for a new zone, according to the number of zones already displayed in
20 /// the tab
22 /// the tab
21 QString defaultZoneName(const QLayout &layout)
23 QString defaultZoneName(const QLayout &layout)
22 {
24 {
23 auto count = 0;
25 auto count = 0;
24 for (auto i = 0; i < layout.count(); ++i) {
26 for (auto i = 0; i < layout.count(); ++i) {
25 if (dynamic_cast<VisualizationZoneWidget *>(layout.itemAt(i)->widget())) {
27 if (dynamic_cast<VisualizationZoneWidget *>(layout.itemAt(i)->widget())) {
26 count++;
28 count++;
27 }
29 }
28 }
30 }
29
31
30 return QObject::tr("Zone %1").arg(count + 1);
32 return QObject::tr("Zone %1").arg(count + 1);
31 }
33 }
32
34
33 /**
35 /**
34 * Applies a function to all zones of the tab represented by its layout
36 * Applies a function to all zones of the tab represented by its layout
35 * @param layout the layout that contains zones
37 * @param layout the layout that contains zones
36 * @param fun the function to apply to each zone
38 * @param fun the function to apply to each zone
37 */
39 */
38 template <typename Fun>
40 template <typename Fun>
39 void processZones(QLayout &layout, Fun fun)
41 void processZones(QLayout &layout, Fun fun)
40 {
42 {
41 for (auto i = 0; i < layout.count(); ++i) {
43 for (auto i = 0; i < layout.count(); ++i) {
42 if (auto item = layout.itemAt(i)) {
44 if (auto item = layout.itemAt(i)) {
43 if (auto visualizationZoneWidget
45 if (auto visualizationZoneWidget
44 = dynamic_cast<VisualizationZoneWidget *>(item->widget())) {
46 = dynamic_cast<VisualizationZoneWidget *>(item->widget())) {
45 fun(*visualizationZoneWidget);
47 fun(*visualizationZoneWidget);
46 }
48 }
47 }
49 }
48 }
50 }
49 }
51 }
50
52
51 } // namespace
53 } // namespace
52
54
53 struct VisualizationTabWidget::VisualizationTabWidgetPrivate {
55 struct VisualizationTabWidget::VisualizationTabWidgetPrivate {
54 explicit VisualizationTabWidgetPrivate(const QString &name) : m_Name{name} {}
56 explicit VisualizationTabWidgetPrivate(const QString &name) : m_Name{name} {}
55
57
56 QString m_Name;
58 QString m_Name;
57
59
60 #ifdef Q_OS_MAC
61 std::unique_ptr<MacScrollBarStyle> m_MacScrollBarStyle = std::make_unique<MacScrollBarStyle>();
62 #endif
63
58 void dropGraph(int index, VisualizationTabWidget *tabWidget);
64 void dropGraph(int index, VisualizationTabWidget *tabWidget);
59 void dropZone(int index, VisualizationTabWidget *tabWidget);
65 void dropZone(int index, VisualizationTabWidget *tabWidget);
60 void dropVariables(const QList<std::shared_ptr<Variable> > &variables, int index,
66 void dropVariables(const QList<std::shared_ptr<Variable> > &variables, int index,
61 VisualizationTabWidget *tabWidget);
67 VisualizationTabWidget *tabWidget);
62 };
68 };
63
69
64 VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *parent)
70 VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *parent)
65 : QWidget{parent},
71 : QWidget{parent},
66 ui{new Ui::VisualizationTabWidget},
72 ui{new Ui::VisualizationTabWidget},
67 impl{spimpl::make_unique_impl<VisualizationTabWidgetPrivate>(name)}
73 impl{spimpl::make_unique_impl<VisualizationTabWidgetPrivate>(name)}
68 {
74 {
69 ui->setupUi(this);
75 ui->setupUi(this);
70
76
77 #ifdef Q_OS_MAC
78 impl->m_MacScrollBarStyle->selfInstallOn(ui->scrollArea, true);
79 #endif
80
71 ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone");
81 ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone");
72 ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 5);
82 ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 5);
73 ui->dragDropContainer->addAcceptedMimeType(
83 ui->dragDropContainer->addAcceptedMimeType(
74 MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted);
84 MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted);
75 ui->dragDropContainer->addAcceptedMimeType(
85 ui->dragDropContainer->addAcceptedMimeType(
76 MIME_TYPE_ZONE, VisualizationDragDropContainer::DropBehavior::Inserted);
86 MIME_TYPE_ZONE, VisualizationDragDropContainer::DropBehavior::Inserted);
77 ui->dragDropContainer->addAcceptedMimeType(
87 ui->dragDropContainer->addAcceptedMimeType(
78 MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::Inserted);
88 MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::Inserted);
79
89
80 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
90 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
81 return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
91 return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
82 ui->dragDropContainer);
92 ui->dragDropContainer);
83 });
93 });
84
94
85 connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredInContainer, this,
95 connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredInContainer, this,
86 &VisualizationTabWidget::dropMimeData);
96 &VisualizationTabWidget::dropMimeData);
87
97
88 sqpApp->dragDropHelper().addDragDropScrollArea(ui->scrollArea);
98 sqpApp->dragDropHelper().addDragDropScrollArea(ui->scrollArea);
89
99
90 // Widget is deleted when closed
100 // Widget is deleted when closed
91 setAttribute(Qt::WA_DeleteOnClose);
101 setAttribute(Qt::WA_DeleteOnClose);
92 }
102 }
93
103
94 VisualizationTabWidget::~VisualizationTabWidget()
104 VisualizationTabWidget::~VisualizationTabWidget()
95 {
105 {
96 sqpApp->dragDropHelper().removeDragDropScrollArea(ui->scrollArea);
106 sqpApp->dragDropHelper().removeDragDropScrollArea(ui->scrollArea);
97 delete ui;
107 delete ui;
98 }
108 }
99
109
100 void VisualizationTabWidget::addZone(VisualizationZoneWidget *zoneWidget)
110 void VisualizationTabWidget::addZone(VisualizationZoneWidget *zoneWidget)
101 {
111 {
102 ui->dragDropContainer->addDragWidget(zoneWidget);
112 ui->dragDropContainer->addDragWidget(zoneWidget);
103 }
113 }
104
114
105 void VisualizationTabWidget::insertZone(int index, VisualizationZoneWidget *zoneWidget)
115 void VisualizationTabWidget::insertZone(int index, VisualizationZoneWidget *zoneWidget)
106 {
116 {
107 ui->dragDropContainer->insertDragWidget(index, zoneWidget);
117 ui->dragDropContainer->insertDragWidget(index, zoneWidget);
108 }
118 }
109
119
110 VisualizationZoneWidget *VisualizationTabWidget::createZone(std::shared_ptr<Variable> variable)
120 VisualizationZoneWidget *VisualizationTabWidget::createZone(std::shared_ptr<Variable> variable)
111 {
121 {
112 return createZone({variable}, -1);
122 return createZone({variable}, -1);
113 }
123 }
114
124
115 VisualizationZoneWidget *
125 VisualizationZoneWidget *
116 VisualizationTabWidget::createZone(const QList<std::shared_ptr<Variable> > &variables, int index)
126 VisualizationTabWidget::createZone(const QList<std::shared_ptr<Variable> > &variables, int index)
117 {
127 {
118 auto zoneWidget = createEmptyZone(index);
128 auto zoneWidget = createEmptyZone(index);
119
129
120 // Creates a new graph into the zone
130 // Creates a new graph into the zone
121 zoneWidget->createGraph(variables, index);
131 zoneWidget->createGraph(variables, index);
122
132
123 return zoneWidget;
133 return zoneWidget;
124 }
134 }
125
135
126 VisualizationZoneWidget *VisualizationTabWidget::createEmptyZone(int index)
136 VisualizationZoneWidget *VisualizationTabWidget::createEmptyZone(int index)
127 {
137 {
128 auto zoneWidget
138 auto zoneWidget
129 = new VisualizationZoneWidget{defaultZoneName(*ui->dragDropContainer->layout()), this};
139 = new VisualizationZoneWidget{defaultZoneName(*ui->dragDropContainer->layout()), this};
130 this->insertZone(index, zoneWidget);
140 this->insertZone(index, zoneWidget);
131
141
132 return zoneWidget;
142 return zoneWidget;
133 }
143 }
134
144
135 void VisualizationTabWidget::accept(IVisualizationWidgetVisitor *visitor)
145 void VisualizationTabWidget::accept(IVisualizationWidgetVisitor *visitor)
136 {
146 {
137 if (visitor) {
147 if (visitor) {
138 visitor->visitEnter(this);
148 visitor->visitEnter(this);
139
149
140 // Apply visitor to zone children: widgets different from zones are not visited (no action)
150 // Apply visitor to zone children: widgets different from zones are not visited (no action)
141 processZones(tabLayout(), [visitor](VisualizationZoneWidget &zoneWidget) {
151 processZones(tabLayout(), [visitor](VisualizationZoneWidget &zoneWidget) {
142 zoneWidget.accept(visitor);
152 zoneWidget.accept(visitor);
143 });
153 });
144
154
145 visitor->visitLeave(this);
155 visitor->visitLeave(this);
146 }
156 }
147 else {
157 else {
148 qCCritical(LOG_VisualizationTabWidget()) << tr("Can't visit widget : the visitor is null");
158 qCCritical(LOG_VisualizationTabWidget()) << tr("Can't visit widget : the visitor is null");
149 }
159 }
150 }
160 }
151
161
152 bool VisualizationTabWidget::canDrop(const Variable &variable) const
162 bool VisualizationTabWidget::canDrop(const Variable &variable) const
153 {
163 {
154 // A tab can always accomodate a variable
164 // A tab can always accomodate a variable
155 Q_UNUSED(variable);
165 Q_UNUSED(variable);
156 return true;
166 return true;
157 }
167 }
158
168
159 bool VisualizationTabWidget::contains(const Variable &variable) const
169 bool VisualizationTabWidget::contains(const Variable &variable) const
160 {
170 {
161 Q_UNUSED(variable);
171 Q_UNUSED(variable);
162 return false;
172 return false;
163 }
173 }
164
174
165 QString VisualizationTabWidget::name() const
175 QString VisualizationTabWidget::name() const
166 {
176 {
167 return impl->m_Name;
177 return impl->m_Name;
168 }
178 }
169
179
170 void VisualizationTabWidget::closeEvent(QCloseEvent *event)
180 void VisualizationTabWidget::closeEvent(QCloseEvent *event)
171 {
181 {
172 // Closes zones in the tab
182 // Closes zones in the tab
173 processZones(tabLayout(), [](VisualizationZoneWidget &zoneWidget) { zoneWidget.close(); });
183 processZones(tabLayout(), [](VisualizationZoneWidget &zoneWidget) { zoneWidget.close(); });
174
184
175 QWidget::closeEvent(event);
185 QWidget::closeEvent(event);
176 }
186 }
177
187
178 QLayout &VisualizationTabWidget::tabLayout() const noexcept
188 QLayout &VisualizationTabWidget::tabLayout() const noexcept
179 {
189 {
180 return *ui->dragDropContainer->layout();
190 return *ui->dragDropContainer->layout();
181 }
191 }
182
192
183 void VisualizationTabWidget::dropMimeData(int index, const QMimeData *mimeData)
193 void VisualizationTabWidget::dropMimeData(int index, const QMimeData *mimeData)
184 {
194 {
185 if (mimeData->hasFormat(MIME_TYPE_GRAPH)) {
195 if (mimeData->hasFormat(MIME_TYPE_GRAPH)) {
186 impl->dropGraph(index, this);
196 impl->dropGraph(index, this);
187 }
197 }
188 else if (mimeData->hasFormat(MIME_TYPE_ZONE)) {
198 else if (mimeData->hasFormat(MIME_TYPE_ZONE)) {
189 impl->dropZone(index, this);
199 impl->dropZone(index, this);
190 }
200 }
191 else if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) {
201 else if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) {
192 auto variables = sqpApp->variableController().variablesForMimeData(
202 auto variables = sqpApp->variableController().variablesForMimeData(
193 mimeData->data(MIME_TYPE_VARIABLE_LIST));
203 mimeData->data(MIME_TYPE_VARIABLE_LIST));
194 impl->dropVariables(variables, index, this);
204 impl->dropVariables(variables, index, this);
195 }
205 }
196 else {
206 else {
197 qCWarning(LOG_VisualizationZoneWidget())
207 qCWarning(LOG_VisualizationZoneWidget())
198 << tr("VisualizationTabWidget::dropMimeData, unknown MIME data received.");
208 << tr("VisualizationTabWidget::dropMimeData, unknown MIME data received.");
199 }
209 }
200 }
210 }
201
211
202 void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropGraph(
212 void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropGraph(
203 int index, VisualizationTabWidget *tabWidget)
213 int index, VisualizationTabWidget *tabWidget)
204 {
214 {
205 auto &helper = sqpApp->dragDropHelper();
215 auto &helper = sqpApp->dragDropHelper();
206
216
207 auto graphWidget = qobject_cast<VisualizationGraphWidget *>(helper.getCurrentDragWidget());
217 auto graphWidget = qobject_cast<VisualizationGraphWidget *>(helper.getCurrentDragWidget());
208 if (!graphWidget) {
218 if (!graphWidget) {
209 qCWarning(LOG_VisualizationZoneWidget())
219 qCWarning(LOG_VisualizationZoneWidget())
210 << tr("VisualizationTabWidget::dropGraph, drop aborted, the dropped graph is not "
220 << tr("VisualizationTabWidget::dropGraph, drop aborted, the dropped graph is not "
211 "found or invalid.");
221 "found or invalid.");
212 Q_ASSERT(false);
222 Q_ASSERT(false);
213 return;
223 return;
214 }
224 }
215
225
216 auto parentDragDropContainer
226 auto parentDragDropContainer
217 = qobject_cast<VisualizationDragDropContainer *>(graphWidget->parentWidget());
227 = qobject_cast<VisualizationDragDropContainer *>(graphWidget->parentWidget());
218 if (!parentDragDropContainer) {
228 if (!parentDragDropContainer) {
219 qCWarning(LOG_VisualizationZoneWidget())
229 qCWarning(LOG_VisualizationZoneWidget())
220 << tr("VisualizationTabWidget::dropGraph, drop aborted, the parent container of "
230 << tr("VisualizationTabWidget::dropGraph, drop aborted, the parent container of "
221 "the dropped graph is not found.");
231 "the dropped graph is not found.");
222 Q_ASSERT(false);
232 Q_ASSERT(false);
223 return;
233 return;
224 }
234 }
225
235
226 auto nbGraph = parentDragDropContainer->countDragWidget();
236 auto nbGraph = parentDragDropContainer->countDragWidget();
227
237
228 const auto &variables = graphWidget->variables();
238 const auto &variables = graphWidget->variables();
229
239
230 if (!variables.isEmpty()) {
240 if (!variables.isEmpty()) {
231 // Abort the requests for the variables (if any)
241 // Abort the requests for the variables (if any)
232 // Commented, because it's not sure if it's needed or not
242 // Commented, because it's not sure if it's needed or not
233 // for (const auto& var : variables)
243 // for (const auto& var : variables)
234 //{
244 //{
235 // sqpApp->variableController().onAbortProgressRequested(var);
245 // sqpApp->variableController().onAbortProgressRequested(var);
236 //}
246 //}
237
247
238 if (nbGraph == 1) {
248 if (nbGraph == 1) {
239 // This is the only graph in the previous zone, close the zone
249 // This is the only graph in the previous zone, close the zone
240 helper.delayedCloseWidget(graphWidget->parentZoneWidget());
250 helper.delayedCloseWidget(graphWidget->parentZoneWidget());
241 }
251 }
242 else {
252 else {
243 // Close the graph
253 // Close the graph
244 helper.delayedCloseWidget(graphWidget);
254 helper.delayedCloseWidget(graphWidget);
245 }
255 }
246
256
247 tabWidget->createZone(variables, index);
257 tabWidget->createZone(variables, index);
248 }
258 }
249 else {
259 else {
250 // The graph is empty, create an empty zone and move the graph inside
260 // The graph is empty, create an empty zone and move the graph inside
251
261
252 auto parentZoneWidget = graphWidget->parentZoneWidget();
262 auto parentZoneWidget = graphWidget->parentZoneWidget();
253
263
254 parentDragDropContainer->layout()->removeWidget(graphWidget);
264 parentDragDropContainer->layout()->removeWidget(graphWidget);
255
265
256 auto zoneWidget = tabWidget->createEmptyZone(index);
266 auto zoneWidget = tabWidget->createEmptyZone(index);
257 zoneWidget->addGraph(graphWidget);
267 zoneWidget->addGraph(graphWidget);
258
268
259 // Close the old zone if it was the only graph inside
269 // Close the old zone if it was the only graph inside
260 if (nbGraph == 1) {
270 if (nbGraph == 1) {
261 helper.delayedCloseWidget(parentZoneWidget);
271 helper.delayedCloseWidget(parentZoneWidget);
262 }
272 }
263 }
273 }
264 }
274 }
265
275
266 void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropZone(
276 void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropZone(
267 int index, VisualizationTabWidget *tabWidget)
277 int index, VisualizationTabWidget *tabWidget)
268 {
278 {
269 auto &helper = sqpApp->dragDropHelper();
279 auto &helper = sqpApp->dragDropHelper();
270
280
271 auto zoneWidget = qobject_cast<VisualizationZoneWidget *>(helper.getCurrentDragWidget());
281 auto zoneWidget = qobject_cast<VisualizationZoneWidget *>(helper.getCurrentDragWidget());
272 if (!zoneWidget) {
282 if (!zoneWidget) {
273 qCWarning(LOG_VisualizationZoneWidget())
283 qCWarning(LOG_VisualizationZoneWidget())
274 << tr("VisualizationTabWidget::dropZone, drop aborted, the dropped zone is not "
284 << tr("VisualizationTabWidget::dropZone, drop aborted, the dropped zone is not "
275 "found or invalid.");
285 "found or invalid.");
276 Q_ASSERT(false);
286 Q_ASSERT(false);
277 return;
287 return;
278 }
288 }
279
289
280 auto parentDragDropContainer
290 auto parentDragDropContainer
281 = qobject_cast<VisualizationDragDropContainer *>(zoneWidget->parentWidget());
291 = qobject_cast<VisualizationDragDropContainer *>(zoneWidget->parentWidget());
282 if (!parentDragDropContainer) {
292 if (!parentDragDropContainer) {
283 qCWarning(LOG_VisualizationZoneWidget())
293 qCWarning(LOG_VisualizationZoneWidget())
284 << tr("VisualizationTabWidget::dropZone, drop aborted, the parent container of "
294 << tr("VisualizationTabWidget::dropZone, drop aborted, the parent container of "
285 "the dropped zone is not found.");
295 "the dropped zone is not found.");
286 Q_ASSERT(false);
296 Q_ASSERT(false);
287 return;
297 return;
288 }
298 }
289
299
290 // Simple move of the zone, no variable operation associated
300 // Simple move of the zone, no variable operation associated
291 parentDragDropContainer->layout()->removeWidget(zoneWidget);
301 parentDragDropContainer->layout()->removeWidget(zoneWidget);
292 tabWidget->ui->dragDropContainer->insertDragWidget(index, zoneWidget);
302 tabWidget->ui->dragDropContainer->insertDragWidget(index, zoneWidget);
293 }
303 }
294
304
295 void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropVariables(
305 void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropVariables(
296 const QList<std::shared_ptr<Variable> > &variables, int index,
306 const QList<std::shared_ptr<Variable> > &variables, int index,
297 VisualizationTabWidget *tabWidget)
307 VisualizationTabWidget *tabWidget)
298 {
308 {
299 // Note: the AcceptMimeDataFunction (set on the drop container) ensure there is a single and
309 // Note: the AcceptMimeDataFunction (set on the drop container) ensure there is a single and
300 // compatible variable here
310 // compatible variable here
301 if (variables.count() > 1) {
311 if (variables.count() > 1) {
302 qCWarning(LOG_VisualizationZoneWidget())
312 qCWarning(LOG_VisualizationZoneWidget())
303 << tr("VisualizationTabWidget::dropVariables, dropping multiple variables, operation "
313 << tr("VisualizationTabWidget::dropVariables, dropping multiple variables, operation "
304 "aborted.");
314 "aborted.");
305 return;
315 return;
306 }
316 }
307
317
308 tabWidget->createZone(variables, index);
318 tabWidget->createZone(variables, index);
309 }
319 }
General Comments 1
Under Review
author

Auto status change to "Under Review"

You need to be logged in to leave comments. Login now