1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Designer of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29#ifndef DEFAULT_CONTAINER_H
30#define DEFAULT_CONTAINER_H
31
32#include <QtDesigner/container.h>
33#include <QtDesigner/extension.h>
34#include <extensionfactory_p.h>
35
36#include <QtWidgets/qstackedwidget.h>
37#include <QtWidgets/qtabwidget.h>
38#include <QtWidgets/qtoolbox.h>
39#include <QtWidgets/qscrollarea.h>
40#include <QtWidgets/qdockwidget.h>
41
42QT_BEGIN_NAMESPACE
43
44namespace qdesigner_internal {
45
46// ------------ QStackedWidgetContainer
47class QStackedWidgetContainer: public QObject, public QDesignerContainerExtension
48{
49 Q_OBJECT
50 Q_INTERFACES(QDesignerContainerExtension)
51public:
52 explicit QStackedWidgetContainer(QStackedWidget *widget, QObject *parent = nullptr);
53
54 int count() const override { return m_widget->count(); }
55 QWidget *widget(int index) const override { return m_widget->widget(index); }
56
57 int currentIndex() const override { return m_widget->currentIndex(); }
58 void setCurrentIndex(int index) override;
59
60 void addWidget(QWidget *widget) override;
61 void insertWidget(int index, QWidget *widget) override;
62 void remove(int index) override;
63
64private:
65 QStackedWidget *m_widget;
66};
67
68// ------------ QTabWidgetContainer
69class QTabWidgetContainer: public QObject, public QDesignerContainerExtension
70{
71 Q_OBJECT
72 Q_INTERFACES(QDesignerContainerExtension)
73public:
74 explicit QTabWidgetContainer(QTabWidget *widget, QObject *parent = nullptr);
75
76 int count() const override { return m_widget->count(); }
77 QWidget *widget(int index) const override { return m_widget->widget(index); }
78
79 int currentIndex() const override { return m_widget->currentIndex(); }
80 void setCurrentIndex(int index) override;
81
82 void addWidget(QWidget *widget) override;
83 void insertWidget(int index, QWidget *widget) override;
84 void remove(int index) override;
85
86private:
87 QTabWidget *m_widget;
88};
89
90// ------------ QToolBoxContainer
91class QToolBoxContainer: public QObject, public QDesignerContainerExtension
92{
93 Q_OBJECT
94 Q_INTERFACES(QDesignerContainerExtension)
95public:
96 explicit QToolBoxContainer(QToolBox *widget, QObject *parent = nullptr);
97
98 int count() const override { return m_widget->count(); }
99 QWidget *widget(int index) const override { return m_widget->widget(index); }
100
101 int currentIndex() const override { return m_widget->currentIndex(); }
102 void setCurrentIndex(int index) override;
103
104 void addWidget(QWidget *widget) override;
105 void insertWidget(int index, QWidget *widget) override;
106 void remove(int index) override;
107
108private:
109 QToolBox *m_widget;
110};
111
112// ------------ SingleChildContainer:
113// Template for containers that have a single child widget using widget()/setWidget().
114
115template <class Container>
116class SingleChildContainer: public QDesignerContainerExtension
117{
118protected:
119 explicit SingleChildContainer(Container *widget, bool active = true);
120public:
121 int count() const override;
122 QWidget *widget(int index) const override;
123 int currentIndex() const override;
124 void setCurrentIndex(int /*index*/) override {}
125 void addWidget(QWidget *widget) override;
126 void insertWidget(int index, QWidget *widget) override;
127 void remove(int /*index*/) override {}
128
129 bool canAddWidget() const override { return false; }
130 bool canRemove(int) const override { return false; }
131
132private:
133 const bool m_active;
134 Container *m_container;
135};
136
137template <class Container>
138SingleChildContainer<Container>::SingleChildContainer(Container *widget, bool active) :
139 m_active(active),
140 m_container(widget)
141{
142}
143
144template <class Container>
145int SingleChildContainer<Container>::count() const
146{
147 return m_active && m_container->widget() ? 1 : 0;
148}
149
150template <class Container>
151QWidget *SingleChildContainer<Container>::widget(int /* index */) const
152{
153 return m_container->widget();
154}
155
156template <class Container>
157int SingleChildContainer<Container>::currentIndex() const
158{
159 return m_active && m_container->widget() ? 0 : -1;
160}
161
162template <class Container>
163void SingleChildContainer<Container>::addWidget(QWidget *widget)
164{
165 Q_ASSERT(m_container->widget() == nullptr);
166 widget->setParent(m_container);
167 m_container->setWidget(widget);
168}
169
170template <class Container>
171void SingleChildContainer<Container>::insertWidget(int /* index */, QWidget *widget)
172{
173 addWidget(widget);
174}
175
176// ------------ QScrollAreaContainer
177class QScrollAreaContainer: public QObject, public SingleChildContainer<QScrollArea>
178{
179 Q_OBJECT
180 Q_INTERFACES(QDesignerContainerExtension)
181public:
182 explicit QScrollAreaContainer(QScrollArea *widget, QObject *parent = nullptr);
183};
184
185// --------------- QDockWidgetContainer
186class QDockWidgetContainer: public QObject, public SingleChildContainer<QDockWidget>
187{
188 Q_OBJECT
189 Q_INTERFACES(QDesignerContainerExtension)
190public:
191 explicit QDockWidgetContainer(QDockWidget *widget, QObject *parent = nullptr);
192};
193
194using QDesignerStackedWidgetContainerFactory = ExtensionFactory<QDesignerContainerExtension, QStackedWidget, QStackedWidgetContainer>;
195using QDesignerTabWidgetContainerFactory = ExtensionFactory<QDesignerContainerExtension, QTabWidget, QTabWidgetContainer>;
196using QDesignerToolBoxContainerFactory = ExtensionFactory<QDesignerContainerExtension, QToolBox, QToolBoxContainer>;
197using QScrollAreaContainerFactory = ExtensionFactory<QDesignerContainerExtension, QScrollArea, QScrollAreaContainer>;
198using QDockWidgetContainerFactory = ExtensionFactory<QDesignerContainerExtension, QDockWidget, QDockWidgetContainer>;
199} // namespace qdesigner_internal
200
201QT_END_NAMESPACE
202
203#endif // DEFAULT_CONTAINER_H
204

source code of qttools/src/designer/src/components/formeditor/default_container.h