##// END OF EJS Templates
Adds scrollbar to tabs
Alexandre Leroux -
r307:a48a71ab1c8a
parent child
Show More
@@ -1,50 +1,53
1 1 #ifndef SCIQLOP_VISUALIZATIONTABWIDGET_H
2 2 #define SCIQLOP_VISUALIZATIONTABWIDGET_H
3 3
4 4 #include "Visualization/IVisualizationWidget.h"
5 5
6 6 #include <Common/spimpl.h>
7 7
8 8 #include <QLoggingCategory>
9 9 #include <QWidget>
10 10
11 11 Q_DECLARE_LOGGING_CATEGORY(LOG_VisualizationTabWidget)
12 12
13 13 class Variable;
14 14 class VisualizationZoneWidget;
15 15
16 16 namespace Ui {
17 17 class VisualizationTabWidget;
18 18 } // namespace Ui
19 19
20 20 class VisualizationTabWidget : public QWidget, public IVisualizationWidget {
21 21 Q_OBJECT
22 22
23 23 public:
24 24 explicit VisualizationTabWidget(const QString &name = {}, QWidget *parent = 0);
25 25 virtual ~VisualizationTabWidget();
26 26
27 27 /// Add a zone widget
28 28 void addZone(VisualizationZoneWidget *zoneWidget);
29 29
30 30 /**
31 31 * Creates a zone using a variable. The variable will be displayed in a new graph of the new
32 32 * zone.
33 33 * @param variable the variable for which to create the zone
34 34 * @return the pointer to the created zone
35 35 */
36 36 VisualizationZoneWidget *createZone(std::shared_ptr<Variable> variable);
37 37
38 38 // IVisualizationWidget interface
39 39 void accept(IVisualizationWidgetVisitor *visitor) override;
40 40 bool canDrop(const Variable &variable) const override;
41 41 QString name() const override;
42 42
43 43 private:
44 /// @return the layout of tab in which zones are added
45 QLayout &tabLayout() const noexcept;
46
44 47 Ui::VisualizationTabWidget *ui;
45 48
46 49 class VisualizationTabWidgetPrivate;
47 50 spimpl::unique_impl_ptr<VisualizationTabWidgetPrivate> impl;
48 51 };
49 52
50 53 #endif // SCIQLOP_VISUALIZATIONTABWIDGET_H
@@ -1,98 +1,104
1 1 #include "Visualization/VisualizationTabWidget.h"
2 2 #include "Visualization/IVisualizationWidgetVisitor.h"
3 3 #include "ui_VisualizationTabWidget.h"
4 4
5 5 #include "Visualization/VisualizationZoneWidget.h"
6 6
7 7 Q_LOGGING_CATEGORY(LOG_VisualizationTabWidget, "VisualizationTabWidget")
8 8
9 9 namespace {
10 10
11 11 /// Generates a default name for a new zone, according to the number of zones already displayed in
12 12 /// the tab
13 13 QString defaultZoneName(const QLayout &layout)
14 14 {
15 15 auto count = 0;
16 16 for (auto i = 0; i < layout.count(); ++i) {
17 17 if (dynamic_cast<VisualizationZoneWidget *>(layout.itemAt(i)->widget())) {
18 18 count++;
19 19 }
20 20 }
21 21
22 22 return QObject::tr("Zone %1").arg(count + 1);
23 23 }
24 24
25 25 } // namespace
26 26
27 27 struct VisualizationTabWidget::VisualizationTabWidgetPrivate {
28 28 explicit VisualizationTabWidgetPrivate(const QString &name) : m_Name{name} {}
29 29
30 30 QString m_Name;
31 31 };
32 32
33 33 VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *parent)
34 34 : QWidget{parent},
35 35 ui{new Ui::VisualizationTabWidget},
36 36 impl{spimpl::make_unique_impl<VisualizationTabWidgetPrivate>(name)}
37 37 {
38 38 ui->setupUi(this);
39 39
40 40 // Widget is deleted when closed
41 41 setAttribute(Qt::WA_DeleteOnClose);
42 42 }
43 43
44 44 VisualizationTabWidget::~VisualizationTabWidget()
45 45 {
46 46 delete ui;
47 47 }
48 48
49 49 void VisualizationTabWidget::addZone(VisualizationZoneWidget *zoneWidget)
50 50 {
51 this->layout()->addWidget(zoneWidget);
51 tabLayout().addWidget(zoneWidget);
52 52 }
53 53
54 54 VisualizationZoneWidget *VisualizationTabWidget::createZone(std::shared_ptr<Variable> variable)
55 55 {
56 auto zoneWidget = new VisualizationZoneWidget{defaultZoneName(*layout()), this};
56 auto zoneWidget = new VisualizationZoneWidget{defaultZoneName(tabLayout()), this};
57 57 this->addZone(zoneWidget);
58 58
59 59 // Creates a new graph into the zone
60 60 zoneWidget->createGraph(variable);
61 61
62 62 return zoneWidget;
63 63 }
64 64
65 65 void VisualizationTabWidget::accept(IVisualizationWidgetVisitor *visitor)
66 66 {
67 67 if (visitor) {
68 68 visitor->visitEnter(this);
69 69
70 70 // Apply visitor to zone children
71 for (auto i = 0; i < layout()->count(); ++i) {
72 if (auto item = layout()->itemAt(i)) {
71 auto &layout = tabLayout();
72 for (auto i = 0; i < layout.count(); ++i) {
73 if (auto item = layout.itemAt(i)) {
73 74 // Widgets different from zones are not visited (no action)
74 75 if (auto visualizationZoneWidget
75 76 = dynamic_cast<VisualizationZoneWidget *>(item->widget())) {
76 77 visualizationZoneWidget->accept(visitor);
77 78 }
78 79 }
79 80 }
80 81
81 82 visitor->visitLeave(this);
82 83 }
83 84 else {
84 85 qCCritical(LOG_VisualizationTabWidget()) << tr("Can't visit widget : the visitor is null");
85 86 }
86 87 }
87 88
88 89 bool VisualizationTabWidget::canDrop(const Variable &variable) const
89 90 {
90 91 // A tab can always accomodate a variable
91 92 Q_UNUSED(variable);
92 93 return true;
93 94 }
94 95
95 96 QString VisualizationTabWidget::name() const
96 97 {
97 98 return impl->m_Name;
98 99 }
100
101 QLayout &VisualizationTabWidget::tabLayout() const noexcept
102 {
103 return *ui->scrollAreaWidgetContents->layout();
104 }
@@ -1,97 +1,105
1 1 #include "Visualization/VisualizationZoneWidget.h"
2 2 #include "Visualization/IVisualizationWidgetVisitor.h"
3 3 #include "ui_VisualizationZoneWidget.h"
4 4
5 5 #include "Visualization/VisualizationGraphWidget.h"
6 6
7 7 #include <SqpApplication.h>
8 8
9 9 Q_LOGGING_CATEGORY(LOG_VisualizationZoneWidget, "VisualizationZoneWidget")
10 10
11 11 namespace {
12 12
13 /// Minimum height for graph added in zones (in pixels)
14 const auto GRAPH_MINIMUM_HEIGHT = 300;
15
13 16 /// Generates a default name for a new graph, according to the number of graphs already displayed in
14 17 /// the zone
15 18 QString defaultGraphName(const QLayout &layout)
16 19 {
17 20 auto count = 0;
18 21 for (auto i = 0; i < layout.count(); ++i) {
19 22 if (dynamic_cast<VisualizationGraphWidget *>(layout.itemAt(i)->widget())) {
20 23 count++;
21 24 }
22 25 }
23 26
24 27 return QObject::tr("Graph %1").arg(count + 1);
25 28 }
26 29
27 30 } // namespace
28 31
29 32 VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *parent)
30 33 : QWidget{parent}, ui{new Ui::VisualizationZoneWidget}
31 34 {
32 35 ui->setupUi(this);
33 36
34 37 ui->zoneNameLabel->setText(name);
35 38
36 39 // 'Close' options : widget is deleted when closed
37 40 setAttribute(Qt::WA_DeleteOnClose);
38 41 connect(ui->closeButton, &QToolButton::clicked, this, &VisualizationZoneWidget::close);
39 42 ui->closeButton->setIcon(sqpApp->style()->standardIcon(QStyle::SP_TitleBarCloseButton));
40 43 }
41 44
42 45 VisualizationZoneWidget::~VisualizationZoneWidget()
43 46 {
44 47 delete ui;
45 48 }
46 49
47 50 void VisualizationZoneWidget::addGraph(VisualizationGraphWidget *graphWidget)
48 51 {
49 52 ui->visualizationZoneFrame->layout()->addWidget(graphWidget);
50 53 }
51 54
52 55 VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptr<Variable> variable)
53 56 {
54 57 auto graphWidget = new VisualizationGraphWidget{
55 58 defaultGraphName(*ui->visualizationZoneFrame->layout()), this};
59
60 // Set graph properties
61 graphWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
62 graphWidget->setMinimumHeight(GRAPH_MINIMUM_HEIGHT);
63
56 64 this->addGraph(graphWidget);
57 65
58 66 graphWidget->addVariable(variable);
59 67
60 68 return graphWidget;
61 69 }
62 70
63 71 void VisualizationZoneWidget::accept(IVisualizationWidgetVisitor *visitor)
64 72 {
65 73 if (visitor) {
66 74 visitor->visitEnter(this);
67 75
68 76 // Apply visitor to graph children
69 77 auto layout = ui->visualizationZoneFrame->layout();
70 78 for (auto i = 0; i < layout->count(); ++i) {
71 79 if (auto item = layout->itemAt(i)) {
72 80 // Widgets different from graphs are not visited (no action)
73 81 if (auto visualizationGraphWidget
74 82 = dynamic_cast<VisualizationGraphWidget *>(item->widget())) {
75 83 visualizationGraphWidget->accept(visitor);
76 84 }
77 85 }
78 86 }
79 87
80 88 visitor->visitLeave(this);
81 89 }
82 90 else {
83 91 qCCritical(LOG_VisualizationZoneWidget()) << tr("Can't visit widget : the visitor is null");
84 92 }
85 93 }
86 94
87 95 bool VisualizationZoneWidget::canDrop(const Variable &variable) const
88 96 {
89 97 // A tab can always accomodate a variable
90 98 Q_UNUSED(variable);
91 99 return true;
92 100 }
93 101
94 102 QString VisualizationZoneWidget::name() const
95 103 {
96 104 return ui->zoneNameLabel->text();
97 105 }
@@ -1,20 +1,60
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <ui version="4.0">
3 3 <class>VisualizationTabWidget</class>
4 4 <widget class="QWidget" name="VisualizationTabWidget">
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>Form</string>
15 15 </property>
16 <layout class="QVBoxLayout" name="verticalLayout"/>
16 <layout class="QVBoxLayout" name="verticalLayout">
17 <property name="leftMargin">
18 <number>0</number>
19 </property>
20 <property name="topMargin">
21 <number>0</number>
22 </property>
23 <property name="rightMargin">
24 <number>0</number>
25 </property>
26 <property name="bottomMargin">
27 <number>0</number>
28 </property>
29 <item>
30 <widget class="QScrollArea" name="scrollArea">
31 <property name="styleSheet">
32 <string notr="true">background-color: transparent;</string>
33 </property>
34 <property name="frameShape">
35 <enum>QFrame::NoFrame</enum>
36 </property>
37 <property name="frameShadow">
38 <enum>QFrame::Sunken</enum>
39 </property>
40 <property name="widgetResizable">
41 <bool>true</bool>
42 </property>
43 <widget class="QWidget" name="scrollAreaWidgetContents">
44 <property name="geometry">
45 <rect>
46 <x>0</x>
47 <y>0</y>
48 <width>400</width>
49 <height>300</height>
50 </rect>
51 </property>
52 <layout class="QVBoxLayout" name="verticalLayout_3"/>
53 </widget>
54 </widget>
55 </item>
56 </layout>
17 57 </widget>
18 58 <resources/>
19 59 <connections/>
20 60 </ui>
General Comments 0
You need to be logged in to leave comments. Login now