Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qmdiarea_container.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
// Qt-Security score:significant reason:default
4
5
#
include
"qmdiarea_container.h"
6
7
#
include
<
QtDesigner
/
qextensionmanager
.
h
>
8
#
include
<
QtDesigner
/
abstractformeditor
.
h
>
9
10
#
include
<
QtWidgets
/
qmdiarea
.
h
>
11
#
include
<
QtWidgets
/
qmdisubwindow
.
h
>
12
#
include
<
QtWidgets
/
qapplication
.
h
>
13
#
include
<
QtCore
/
qdebug
.
h
>
14
#
include
<
QtCore
/
qhash
.
h
>
15
16
QT_BEGIN_NAMESPACE
17
18
using
namespace
Qt::StringLiterals;
19
20
namespace
qdesigner_internal
{
21
22
QMdiAreaContainer
::QMdiAreaContainer(QMdiArea *widget, QObject *parent)
23
: QObject(parent),
24
m_mdiArea(widget)
25
{
26
}
27
28
int
QMdiAreaContainer
::
count
()
const
29
{
30
return
m_mdiArea->subWindowList(QMdiArea::CreationOrder).size();
31
}
32
33
QWidget
*
QMdiAreaContainer
::
widget
(
int
index)
const
34
{
35
if
(index < 0)
36
return
nullptr
;
37
return
m_mdiArea->subWindowList(QMdiArea::CreationOrder).at(index)->widget();
38
}
39
40
int
QMdiAreaContainer
::
currentIndex
()
const
41
{
42
if
(QMdiSubWindow *sub = m_mdiArea->activeSubWindow())
43
return
m_mdiArea->subWindowList(QMdiArea::CreationOrder).indexOf(sub);
44
return
-1;
45
}
46
47
void
QMdiAreaContainer
::
setCurrentIndex
(
int
index)
48
{
49
if
(index < 0) {
50
qDebug() <<
"** WARNING Attempt to QMdiAreaContainer::setCurrentIndex(-1)"
;
51
return
;
52
}
53
QMdiSubWindow *frame = m_mdiArea->subWindowList(QMdiArea::CreationOrder).at(index);
54
m_mdiArea->setActiveSubWindow(frame);
55
}
56
57
void
QMdiAreaContainer
::
addWidget
(QWidget *widget)
58
{
59
QMdiSubWindow *frame = m_mdiArea->addSubWindow(widget, Qt::Window);
60
frame->show();
61
m_mdiArea->cascadeSubWindows();
62
positionNewMdiChild(m_mdiArea, frame);
63
}
64
65
// Semi-smart positioning of new windows: Make child fill the whole MDI window below
66
// cascaded other windows
67
void
QMdiAreaContainer
::positionNewMdiChild(
const
QWidget *area, QWidget *mdiChild)
68
{
69
enum
{ MinSize = 20 };
70
const
QPoint pos = mdiChild->pos();
71
const
QSize areaSize = area->size();
72
switch
(QApplication::layoutDirection()) {
73
case
Qt::LayoutDirectionAuto:
74
case
Qt::LeftToRight: {
75
const
QSize fullSize = QSize(areaSize.width() - pos.x(), areaSize.height() - pos.y());
76
if
(fullSize.width() > MinSize && fullSize.height() > MinSize)
77
mdiChild->resize(fullSize);
78
}
79
break
;
80
case
Qt::RightToLeft: {
81
const
QSize fullSize = QSize(pos.x() + mdiChild->width(), areaSize.height() - pos.y());
82
if
(fullSize.width() > MinSize && fullSize.height() > MinSize) {
83
mdiChild->move(0, pos.y());
84
mdiChild->resize(fullSize);
85
}
86
}
87
break
;
88
}
89
}
90
91
void
QMdiAreaContainer
::
insertWidget
(
int
, QWidget *widget)
92
{
93
addWidget(widget);
94
}
95
96
void
QMdiAreaContainer
::
remove
(
int
index)
97
{
98
auto
subWins = m_mdiArea->subWindowList(QMdiArea::CreationOrder);
99
if
(index >= 0 && index < subWins.size()) {
100
QMdiSubWindow *f = subWins.at(index);
101
m_mdiArea->removeSubWindow(f->widget());
102
delete
f;
103
}
104
}
105
106
// ---------- MdiAreaPropertySheet, creates fake properties:
107
// 1) window name (object name of child)
108
// 2) title (windowTitle of child).
109
110
static
constexpr
auto
subWindowTitleC
=
"activeSubWindowTitle"_L1
;
111
static
constexpr
auto
subWindowNameC
=
"activeSubWindowName"_L1
;
112
113
QMdiAreaPropertySheet
::QMdiAreaPropertySheet(QWidget *mdiArea, QObject *parent) :
114
QDesignerPropertySheet(mdiArea, parent),
115
m_windowTitleProperty(u"windowTitle"_s)
116
{
117
createFakeProperty(subWindowNameC, QString());
118
createFakeProperty(subWindowTitleC, QString());
119
}
120
121
QMdiAreaPropertySheet
::MdiAreaProperty
QMdiAreaPropertySheet
::mdiAreaProperty(
const
QString &name)
122
{
123
static
const
QHash<QString, MdiAreaProperty> mdiAreaPropertyHash = {
124
{subWindowNameC, MdiAreaSubWindowName},
125
{subWindowTitleC, MdiAreaSubWindowTitle}
126
};
127
return
mdiAreaPropertyHash.value(name, MdiAreaNone);
128
}
129
130
void
QMdiAreaPropertySheet
::
setProperty
(
int
index,
const
QVariant &value)
131
{
132
switch
(mdiAreaProperty(propertyName(index))) {
133
case
MdiAreaSubWindowName:
134
if
(QWidget *w = currentWindow())
135
w->setObjectName(value.toString());
136
break
;
137
case
MdiAreaSubWindowTitle:
// Forward to window title of subwindow
138
if
(QDesignerPropertySheetExtension *cws = currentWindowSheet()) {
139
const
int
index = cws->indexOf(m_windowTitleProperty);
140
cws->setProperty(index, value);
141
cws->setChanged(index,
true
);
142
}
143
break
;
144
default
:
145
QDesignerPropertySheet::setProperty(index, value);
146
break
;
147
}
148
}
149
150
bool
QMdiAreaPropertySheet
::
reset
(
int
index)
151
{
152
bool
rc =
true
;
153
switch
(mdiAreaProperty(propertyName(index))) {
154
case
MdiAreaSubWindowName:
155
setProperty(index, QVariant(QString()));
156
setChanged(index,
false
);
157
break
;
158
case
MdiAreaSubWindowTitle:
// Forward to window title of subwindow
159
if
(QDesignerPropertySheetExtension *cws = currentWindowSheet()) {
160
const
int
index = cws->indexOf(m_windowTitleProperty);
161
rc = cws->reset(index);
162
}
163
break
;
164
default
:
165
rc = QDesignerPropertySheet::reset(index);
166
break
;
167
}
168
return
rc;
169
}
170
171
QVariant
QMdiAreaPropertySheet
::
property
(
int
index)
const
172
{
173
switch
(mdiAreaProperty(propertyName(index))) {
174
case
MdiAreaSubWindowName:
175
if
(QWidget *w = currentWindow())
176
return
w->objectName();
177
return
QVariant(QString());
178
case
MdiAreaSubWindowTitle:
179
if
(QWidget *w = currentWindow())
180
return
w->windowTitle();
181
return
QVariant(QString());
182
case
MdiAreaNone:
183
break
;
184
}
185
return
QDesignerPropertySheet::property(index);
186
}
187
188
bool
QMdiAreaPropertySheet
::
isEnabled
(
int
index)
const
189
{
190
switch
(mdiAreaProperty(propertyName(index))) {
191
case
MdiAreaSubWindowName:
192
case
MdiAreaSubWindowTitle:
193
return
currentWindow() !=
nullptr
;
194
case
MdiAreaNone:
195
break
;
196
}
197
return
QDesignerPropertySheet::isEnabled(index);
198
}
199
200
bool
QMdiAreaPropertySheet
::
isChanged
(
int
index)
const
201
{
202
bool
rc =
false
;
203
switch
(mdiAreaProperty(propertyName(index))) {
204
case
MdiAreaSubWindowName:
205
rc = currentWindow() !=
nullptr
;
206
break
;
207
case
MdiAreaSubWindowTitle:
208
if
(QDesignerPropertySheetExtension *cws = currentWindowSheet()) {
209
const
int
index = cws->indexOf(m_windowTitleProperty);
210
rc = cws->isChanged(index);
211
}
212
break
;
213
default
:
214
rc = QDesignerPropertySheet::isChanged(index);
215
break
;
216
}
217
return
rc;
218
}
219
220
QWidget *
QMdiAreaPropertySheet
::currentWindow()
const
221
{
222
if
(
const
QDesignerContainerExtension *c = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), object())) {
223
const
int
ci = c->currentIndex();
224
if
(ci < 0)
225
return
nullptr
;
226
return
c->widget(ci);
227
}
228
return
nullptr
;
229
}
230
231
QDesignerPropertySheetExtension *
QMdiAreaPropertySheet
::currentWindowSheet()
const
232
{
233
QWidget *cw = currentWindow();
234
if
(cw ==
nullptr
)
235
return
nullptr
;
236
return
qt_extension<QDesignerPropertySheetExtension*>(core()->extensionManager(), cw);
237
}
238
239
bool
QMdiAreaPropertySheet
::
checkProperty
(
const
QString &propertyName)
240
{
241
return
mdiAreaProperty(propertyName) == MdiAreaNone;
242
}
243
}
244
QT_END_NAMESPACE
qdesigner_internal::QMdiAreaContainer
Definition
qmdiarea_container.h:22
qdesigner_internal::QMdiAreaContainer::addWidget
void addWidget(QWidget *widget) override
Definition
qmdiarea_container.cpp:57
qdesigner_internal::QMdiAreaContainer::count
int count() const override
Definition
qmdiarea_container.cpp:28
qdesigner_internal::QMdiAreaContainer::remove
void remove(int index) override
Definition
qmdiarea_container.cpp:96
qdesigner_internal::QMdiAreaContainer::currentIndex
int currentIndex() const override
Definition
qmdiarea_container.cpp:40
qdesigner_internal::QMdiAreaContainer::widget
QWidget * widget(int index) const override
Definition
qmdiarea_container.cpp:33
qdesigner_internal::QMdiAreaContainer::insertWidget
void insertWidget(int index, QWidget *widget) override
Definition
qmdiarea_container.cpp:91
qdesigner_internal::QMdiAreaContainer::setCurrentIndex
void setCurrentIndex(int index) override
Definition
qmdiarea_container.cpp:47
qdesigner_internal::QMdiAreaPropertySheet
Definition
qmdiarea_container.h:48
qdesigner_internal::QMdiAreaPropertySheet::isChanged
bool isChanged(int index) const override
Definition
qmdiarea_container.cpp:200
qdesigner_internal::QMdiAreaPropertySheet::setProperty
void setProperty(int index, const QVariant &value) override
Definition
qmdiarea_container.cpp:130
qdesigner_internal::QMdiAreaPropertySheet::checkProperty
static bool checkProperty(const QString &propertyName)
Definition
qmdiarea_container.cpp:239
qdesigner_internal::QMdiAreaPropertySheet::isEnabled
bool isEnabled(int index) const override
Definition
qmdiarea_container.cpp:188
qdesigner_internal::QMdiAreaPropertySheet::reset
bool reset(int index) override
Definition
qmdiarea_container.cpp:150
qdesigner_internal::QMdiAreaPropertySheet::property
QVariant property(int index) const override
Definition
qmdiarea_container.cpp:171
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
qdesigner_internal
Auxiliary methods to store/retrieve settings.
Definition
buddyeditor.cpp:67
qdesigner_internal::subWindowTitleC
static constexpr auto subWindowTitleC
Definition
qmdiarea_container.cpp:110
qdesigner_internal::subWindowNameC
static constexpr auto subWindowNameC
Definition
qmdiarea_container.cpp:111
qttools
src
designer
src
components
formeditor
qmdiarea_container.cpp
Generated on
for Qt by
1.18.0