Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
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
6#include "ui_previewconfigurationwidget.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
29QT_BEGIN_NAMESPACE
30
31using namespace Qt::StringLiterals;
32
33static constexpr auto skinResourcePathC = ":/skins/"_L1;
34static constexpr auto skinExtensionC = "skin"_L1;
35
36// Pair of skin name, path
37using SkinNamePath = std::pair<QString, QString>;
38using Skins = QList<SkinNamePath>;
39enum { SkinComboNoneIndex = 0 };
40
41// find default skins (resources)
42static 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
55namespace qdesigner_internal {
56
57// ------------- PreviewConfigurationWidgetPrivate
59public:
60 PreviewConfigurationWidgetPrivate(QDesignerFormEditorInterface *core, QGroupBox *g);
61
64 void slotSkinChanged(int index);
65
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
75private:
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
95 m_core(core),
97 m_parent(g),
101{
102 m_ui.setupUi(g);
103 // styles
108
109 // sheet
114
116 "editdelete.png"_L1));
117 // skins: find default skins (resources)
121
122 for (const auto &skin : std::as_const(skins))
126
129
131}
132
134{
136}
137
139{
141 for (int i = m_firstUserSkinIndex; i < m_browseSkinIndex; i++)
143 return rc;
144}
145
147{
148 if (files.isEmpty())
149 return;
150 for (const auto &f : files) {
151 const QFileInfo fi(f);
152 if (fi.isDir() && fi.isReadable())
154 else
155 qWarning() << "Unable to access the skin directory '" << f << "'.";
156 }
157}
158
160{
163 if (style == m_defaultStyle)
164 style.clear();
166 // Figure out skin. 0 is None by definition..
167 const int skinIndex = m_ui.m_skinCombo->currentIndex();
171
173}
174
176{
178 if (styleIndex == -1)
182 // find skin by file name. 0 is "none"
185 if (skinIndex == -1) {
186 qWarning() << "Unable to find skin '" << deviceSkin << "'.";
187 skinIndex = 0;
188 }
190}
191
199
209
220
228
236
238{
242 const QString title = tr("Load Custom Device Skin");
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
252 if (directories.size() != 1)
253 break;
254
255 // check: 1) name already there
260 const QString msgTitle = tr("%1 - Duplicate Skin").arg(title);
261 const QString msg = tr("The skin '%1' already exists.").arg(name);
263 break;
264 }
265 // check: 2) can read
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")
279 } while (true);
280 return rc;
281}
282
283// ------------- PreviewConfigurationWidget
284PreviewConfigurationWidget::PreviewConfigurationWidget(QDesignerFormEditorInterface *core,
285 QWidget *parent) :
286 QGroupBox(parent),
287 m_impl(new PreviewConfigurationWidgetPrivate(core, this))
288{
289 connect(m_impl->appStyleSheetChangeButton(), &QAbstractButton::clicked,
291 connect(m_impl->skinRemoveButton(), &QAbstractButton::clicked,
293 connect(m_impl->skinCombo(), &QComboBox::currentIndexChanged,
295
296 m_impl->retrieveSettings();
297}
298
299PreviewConfigurationWidget::~PreviewConfigurationWidget()
300{
301 delete m_impl;
302}
303
305{
306 m_impl->storeSettings();
307}
308
310{
311 m_impl->slotEditAppStyleSheet();
312}
313
315{
316 m_impl->slotDeleteSkinEntry();
317}
318
320{
321 m_impl->slotSkinChanged(index);
322}
323
324}
325
326QT_END_NAMESPACE
friend class QWidget
Definition qpainter.h:432
Auxiliary methods to store/retrieve settings.
static constexpr auto skinResourcePathC
static constexpr auto skinExtensionC
static const Skins & defaultSkins()
std::pair< QString, QString > SkinNamePath