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
previewconfigurationwidget.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
"previewconfigurationwidget_p.h"
6
#
include
"ui_previewconfigurationwidget.h"
7
#
include
"previewmanager_p.h"
8
#
include
"shared_settings_p.h"
9
10
#
include
<
iconloader_p
.
h
>
11
#
include
<
stylesheeteditor_p
.
h
>
12
13
#
include
<
deviceskin_p
.
h
>
14
15
#
include
<
QtDesigner
/
abstractsettings
.
h
>
16
17
#
include
<
QtWidgets
/
qfiledialog
.
h
>
18
#
include
<
QtWidgets
/
qstylefactory
.
h
>
19
#
include
<
QtWidgets
/
qfiledialog
.
h
>
20
#
include
<
QtWidgets
/
qmessagebox
.
h
>
21
22
#
include
<
QtCore
/
qlist
.
h
>
23
#
include
<
QtCore
/
qdebug
.
h
>
24
#
include
<
QtCore
/
qfileinfo
.
h
>
25
#
include
<
QtCore
/
qshareddata
.
h
>
26
27
#
include
<
utility
>
28
29
QT_BEGIN_NAMESPACE
30
31
using
namespace
Qt::StringLiterals;
32
33
static
constexpr
auto
skinResourcePathC
=
":/skins/"_L1
;
34
static
constexpr
auto
skinExtensionC
=
"skin"_L1
;
35
36
// Pair of skin name, path
37
using
SkinNamePath
=
std
::pair<QString, QString>;
38
using
Skins = QList<SkinNamePath>;
39
enum
{
SkinComboNoneIndex
= 0 };
40
41
// find default skins (resources)
42
static
const
Skins
&
defaultSkins
() {
43
static
Skins rc;
44
if
(rc.isEmpty()) {
45
const
QDir dir(skinResourcePathC,
"*."_L1
+ skinExtensionC);
46
const
QFileInfoList list = dir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot, QDir::Name);
47
if
(list.isEmpty())
48
return
rc;
49
for
(
const
auto
&fi : list)
50
rc.append(SkinNamePath(fi.baseName(), fi.filePath()));
51
}
52
return
rc;
53
}
54
55
namespace
qdesigner_internal
{
56
57
// ------------- PreviewConfigurationWidgetPrivate
58
class
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
{
59
public
:
60
PreviewConfigurationWidgetPrivate
(QDesignerFormEditorInterface *core, QGroupBox *g);
61
62
void
slotEditAppStyleSheet
();
63
void
slotDeleteSkinEntry
();
64
void
slotSkinChanged
(
int
index);
65
66
void
retrieveSettings
();
67
void
storeSettings
()
const
;
68
69
QAbstractButton
*
appStyleSheetChangeButton
()
const
{
return
m_ui.m_appStyleSheetChangeButton; }
70
QAbstractButton
*
skinRemoveButton
()
const
{
return
m_ui.m_skinRemoveButton; }
71
QComboBox
*
skinCombo
()
const
{
return
m_ui.m_skinCombo; }
72
73
QDesignerFormEditorInterface *
m_core
;
74
75
private
:
76
PreviewConfiguration previewConfiguration()
const
;
77
void
setPreviewConfiguration(
const
PreviewConfiguration &pc);
78
79
QStringList userSkins()
const
;
80
void
addUserSkins(
const
QStringList &files);
81
bool
canRemoveSkin(
int
index)
const
;
82
int
browseSkin();
83
84
const
QString m_defaultStyle;
85
QGroupBox *m_parent;
86
QT_PREPEND_NAMESPACE(Ui)::
PreviewConfigurationWidget
m_ui
;
87
88
int
m_firstUserSkinIndex;
89
int
m_browseSkinIndex;
90
int
m_lastSkinIndex;
// required in case browse fails
91
};
92
93
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
PreviewConfigurationWidgetPrivate
(
94
QDesignerFormEditorInterface
*
core
,
QGroupBox
*
g
) :
95
m_core
(
core
),
96
m_defaultStyle
(
PreviewConfigurationWidget
::
tr
(
"Default"
)),
97
m_parent
(
g
),
98
m_firstUserSkinIndex
(0),
99
m_browseSkinIndex
(0),
100
m_lastSkinIndex
(0)
101
{
102
m_ui
.
setupUi
(
g
);
103
// styles
104
m_ui
.
m_styleCombo
->
setEditable
(
false
);
105
QStringList
styleItems
(
m_defaultStyle
);
106
styleItems
+=
QStyleFactory
::
keys
();
107
m_ui
.
m_styleCombo
->
addItems
(
styleItems
);
108
109
// sheet
110
m_ui
.
m_appStyleSheetLineEdit
->
setTextPropertyValidationMode
(
qdesigner_internal
::
ValidationStyleSheet
);
111
m_ui
.
m_appStyleSheetClearButton
->
setIcon
(
qdesigner_internal
::
createIconSet
(
"resetproperty.png"_L1
));
112
QObject
::
connect
(
m_ui
.
m_appStyleSheetClearButton
, &
QAbstractButton
::
clicked
,
113
m_ui
.
m_appStyleSheetLineEdit
, &
qdesigner_internal
::
TextPropertyEditor
::
clear
);
114
115
m_ui
.
m_skinRemoveButton
->
setIcon
(
qdesigner_internal
::
createIconSet
(
QIcon
::
ThemeIcon
::
EditDelete
,
116
"editdelete.png"_L1
));
117
// skins: find default skins (resources)
118
m_ui
.
m_skinRemoveButton
->
setEnabled
(
false
);
119
Skins
skins
=
defaultSkins
();
120
skins
.
push_front
(
SkinNamePath
(
PreviewConfigurationWidget
::
tr
(
"None"
),
QString
()));
121
122
for
(
const
auto
&
skin
:
std
::
as_const
(
skins
))
123
m_ui
.
m_skinCombo
->
addItem
(
skin
.
first
,
QVariant
(
skin
.
second
));
124
m_browseSkinIndex
=
m_firstUserSkinIndex
=
skins
.
size
();
125
m_ui
.
m_skinCombo
->
addItem
(
PreviewConfigurationWidget
::
tr
(
"Browse..."
),
QString
());
126
127
m_ui
.
m_skinCombo
->
setMaxVisibleItems
(
qMax
(15, 2 *
m_browseSkinIndex
));
128
m_ui
.
m_skinCombo
->
setEditable
(
false
);
129
130
retrieveSettings
();
131
}
132
133
bool
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
canRemoveSkin
(
int
index
)
const
134
{
135
return
index
>=
m_firstUserSkinIndex
&&
index
!=
m_browseSkinIndex
;
136
}
137
138
QStringList
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
userSkins
()
const
139
{
140
QStringList
rc
;
141
for
(
int
i
=
m_firstUserSkinIndex
;
i
<
m_browseSkinIndex
;
i
++)
142
rc
.
push_back
(
m_ui
.
m_skinCombo
->
itemData
(
i
).
toString
());
143
return
rc
;
144
}
145
146
void
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
addUserSkins
(
const
QStringList
&
files
)
147
{
148
if
(
files
.
isEmpty
())
149
return
;
150
for
(
const
auto
&
f
:
files
) {
151
const
QFileInfo
fi
(
f
);
152
if
(
fi
.
isDir
() &&
fi
.
isReadable
())
153
m_ui
.
m_skinCombo
->
insertItem
(
m_browseSkinIndex
++,
fi
.
baseName
(),
QVariant
(
f
));
154
else
155
qWarning
() <<
"Unable to access the skin directory '"
<<
f
<<
"'."
;
156
}
157
}
158
159
PreviewConfiguration
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
previewConfiguration
()
const
160
{
161
PreviewConfiguration
rc
;
162
QString
style
=
m_ui
.
m_styleCombo
->
currentText
();
163
if
(
style
==
m_defaultStyle
)
164
style
.
clear
();
165
const
QString
applicationStyleSheet
=
m_ui
.
m_appStyleSheetLineEdit
->
text
();
166
// Figure out skin. 0 is None by definition..
167
const
int
skinIndex
=
m_ui
.
m_skinCombo
->
currentIndex
();
168
QString
deviceSkin
;
169
if
(
skinIndex
!=
SkinComboNoneIndex
&&
skinIndex
!=
m_browseSkinIndex
)
170
deviceSkin
=
m_ui
.
m_skinCombo
->
itemData
(
skinIndex
).
toString
();
171
172
return
PreviewConfiguration
(
style
,
applicationStyleSheet
,
deviceSkin
);
173
}
174
175
void
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
setPreviewConfiguration
(
const
PreviewConfiguration
&
pc
)
176
{
177
int
styleIndex
=
m_ui
.
m_styleCombo
->
findText
(
pc
.
style
());
178
if
(
styleIndex
== -1)
179
styleIndex
=
m_ui
.
m_styleCombo
->
findText
(
m_defaultStyle
);
180
m_ui
.
m_styleCombo
->
setCurrentIndex
(
styleIndex
);
181
m_ui
.
m_appStyleSheetLineEdit
->
setText
(
pc
.
applicationStyleSheet
());
182
// find skin by file name. 0 is "none"
183
const
QString
deviceSkin
=
pc
.
deviceSkin
();
184
int
skinIndex
=
deviceSkin
.
isEmpty
() ? 0 :
m_ui
.
m_skinCombo
->
findData
(
QVariant
(
deviceSkin
));
185
if
(
skinIndex
== -1) {
186
qWarning
() <<
"Unable to find skin '"
<<
deviceSkin
<<
"'."
;
187
skinIndex
= 0;
188
}
189
m_ui
.
m_skinCombo
->
setCurrentIndex
(
skinIndex
);
190
}
191
192
void
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
slotEditAppStyleSheet
()
193
{
194
StyleSheetEditorDialog
dlg
(
m_core
,
m_parent
,
StyleSheetEditorDialog
::
ModeGlobal
);
195
dlg
.
setText
(
m_ui
.
m_appStyleSheetLineEdit
->
text
());
196
if
(
dlg
.
exec
() ==
QDialog
::
Accepted
)
197
m_ui
.
m_appStyleSheetLineEdit
->
setText
(
dlg
.
text
());
198
}
199
200
void
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
slotDeleteSkinEntry
()
201
{
202
const
int
index
=
m_ui
.
m_skinCombo
->
currentIndex
();
203
if
(
canRemoveSkin
(
index
)) {
204
m_ui
.
m_skinCombo
->
setCurrentIndex
(
SkinComboNoneIndex
);
205
m_ui
.
m_skinCombo
->
removeItem
(
index
);
206
m_browseSkinIndex
--;
207
}
208
}
209
210
void
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
slotSkinChanged
(
int
index
)
211
{
212
if
(
index
==
m_browseSkinIndex
) {
213
m_ui
.
m_skinCombo
->
setCurrentIndex
(
browseSkin
());
214
}
else
{
215
m_lastSkinIndex
=
index
;
216
m_ui
.
m_skinRemoveButton
->
setEnabled
(
canRemoveSkin
(
index
));
217
m_ui
.
m_skinCombo
->
setToolTip
(
index
!=
SkinComboNoneIndex
?
m_ui
.
m_skinCombo
->
itemData
(
index
).
toString
() :
QString
());
218
}
219
}
220
221
void
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
retrieveSettings
()
222
{
223
QDesignerSharedSettings
settings
(
m_core
);
224
m_parent
->
setChecked
(
settings
.
isCustomPreviewConfigurationEnabled
());
225
setPreviewConfiguration
(
settings
.
customPreviewConfiguration
());
226
addUserSkins
(
settings
.
userDeviceSkins
());
227
}
228
229
void
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
storeSettings
()
const
230
{
231
QDesignerSharedSettings
settings
(
m_core
);
232
settings
.
setCustomPreviewConfigurationEnabled
(
m_parent
->
isChecked
());
233
settings
.
setCustomPreviewConfiguration
(
previewConfiguration
());
234
settings
.
setUserDeviceSkins
(
userSkins
());
235
}
236
237
int
PreviewConfigurationWidget
::
PreviewConfigurationWidgetPrivate
::
browseSkin
()
238
{
239
QFileDialog
dlg
(
m_parent
);
240
dlg
.
setFileMode
(
QFileDialog
::
Directory
);
241
dlg
.
setOption
(
QFileDialog
::
ShowDirsOnly
);
242
const
QString
title
=
tr
(
"Load Custom Device Skin"
);
243
dlg
.
setWindowTitle
(
title
);
244
dlg
.
setNameFilter
(
tr
(
"All QVFB Skins (*.%1)"
).
arg
(
skinExtensionC
));
245
246
int
rc
=
m_lastSkinIndex
;
247
do
{
248
if
(!
dlg
.
exec
())
249
break
;
250
251
const
QStringList
directories
=
dlg
.
selectedFiles
();
252
if
(
directories
.
size
() != 1)
253
break
;
254
255
// check: 1) name already there
256
const
QString
directory
=
directories
.
constFirst
();
257
const
QString
name
=
QFileInfo
(
directory
).
baseName
();
258
const
int
existingIndex
=
m_ui
.
m_skinCombo
->
findText
(
name
);
259
if
(
existingIndex
!= -1 &&
existingIndex
!=
SkinComboNoneIndex
&&
existingIndex
!=
m_browseSkinIndex
) {
260
const
QString
msgTitle
=
tr
(
"%1 - Duplicate Skin"
).
arg
(
title
);
261
const
QString
msg
=
tr
(
"The skin '%1' already exists."
).
arg
(
name
);
262
QMessageBox
::
information
(
m_parent
,
msgTitle
,
msg
);
263
break
;
264
}
265
// check: 2) can read
266
DeviceSkinParameters
parameters
;
267
QString
readError
;
268
if
(
parameters
.
read
(
directory
,
DeviceSkinParameters
::
ReadSizeOnly
, &
readError
)) {
269
const
QString
name
=
QFileInfo
(
directory
).
baseName
();
270
m_ui
.
m_skinCombo
->
insertItem
(
m_browseSkinIndex
,
name
,
QVariant
(
directory
));
271
rc
=
m_browseSkinIndex
++;
272
273
break
;
274
}
275
const
QString
msgTitle
=
tr
(
"%1 - Error"
).
arg
(
title
);
276
const
QString
msg
=
tr
(
"%1 is not a valid skin directory:\n%2"
)
277
.
arg
(
directory
,
readError
);
278
QMessageBox
::
warning
(
m_parent
,
msgTitle
,
msg
);
279
}
while
(
true
);
280
return
rc
;
281
}
282
283
// ------------- PreviewConfigurationWidget
284
PreviewConfigurationWidget
::PreviewConfigurationWidget(QDesignerFormEditorInterface *core,
285
QWidget
*parent) :
286
QGroupBox(parent),
287
m_impl(
new
PreviewConfigurationWidgetPrivate(core,
this
))
288
{
289
connect(m_impl->appStyleSheetChangeButton(), &QAbstractButton::clicked,
290
this
, &
PreviewConfigurationWidget
::
slotEditAppStyleSheet
);
291
connect(m_impl->skinRemoveButton(), &QAbstractButton::clicked,
292
this
, &
PreviewConfigurationWidget
::
slotDeleteSkinEntry
);
293
connect(m_impl->skinCombo(), &QComboBox::currentIndexChanged,
294
this
, &
PreviewConfigurationWidget
::
slotSkinChanged
);
295
296
m_impl->retrieveSettings();
297
}
298
299
PreviewConfigurationWidget
::~PreviewConfigurationWidget()
300
{
301
delete
m_impl;
302
}
303
304
void
PreviewConfigurationWidget
::saveState()
305
{
306
m_impl->storeSettings();
307
}
308
309
void
PreviewConfigurationWidget
::
slotEditAppStyleSheet
()
310
{
311
m_impl->slotEditAppStyleSheet();
312
}
313
314
void
PreviewConfigurationWidget
::
slotDeleteSkinEntry
()
315
{
316
m_impl->slotDeleteSkinEntry();
317
}
318
319
void
PreviewConfigurationWidget
::
slotSkinChanged
(
int
index)
320
{
321
m_impl->slotSkinChanged(index);
322
}
323
324
}
325
326
QT_END_NAMESPACE
QPainter::QWidget
friend class QWidget
Definition
qpainter.h:432
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate
Definition
previewconfigurationwidget.cpp:58
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::m_core
QDesignerFormEditorInterface * m_core
Definition
previewconfigurationwidget.cpp:73
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::storeSettings
void storeSettings() const
Definition
previewconfigurationwidget.cpp:229
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::retrieveSettings
void retrieveSettings()
Definition
previewconfigurationwidget.cpp:221
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::skinCombo
QComboBox * skinCombo() const
Definition
previewconfigurationwidget.cpp:71
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::slotSkinChanged
void slotSkinChanged(int index)
Definition
previewconfigurationwidget.cpp:210
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::slotDeleteSkinEntry
void slotDeleteSkinEntry()
Definition
previewconfigurationwidget.cpp:200
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::slotEditAppStyleSheet
void slotEditAppStyleSheet()
Definition
previewconfigurationwidget.cpp:192
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::appStyleSheetChangeButton
QAbstractButton * appStyleSheetChangeButton() const
Definition
previewconfigurationwidget.cpp:69
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::skinRemoveButton
QAbstractButton * skinRemoveButton() const
Definition
previewconfigurationwidget.cpp:70
qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate::PreviewConfigurationWidgetPrivate
PreviewConfigurationWidgetPrivate(QDesignerFormEditorInterface *core, QGroupBox *g)
Definition
previewconfigurationwidget.cpp:93
qdesigner_internal
Auxiliary methods to store/retrieve settings.
Definition
buddyeditor.cpp:67
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
skinResourcePathC
static constexpr auto skinResourcePathC
Definition
previewconfigurationwidget.cpp:33
skinExtensionC
static constexpr auto skinExtensionC
Definition
previewconfigurationwidget.cpp:34
defaultSkins
static const Skins & defaultSkins()
Definition
previewconfigurationwidget.cpp:42
SkinComboNoneIndex
@ SkinComboNoneIndex
Definition
previewconfigurationwidget.cpp:39
SkinNamePath
std::pair< QString, QString > SkinNamePath
Definition
previewconfigurationwidget.cpp:37
qttools
src
designer
src
lib
shared
previewconfigurationwidget.cpp
Generated on
for Qt by
1.18.0