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
5#include "ui_previewconfigurationwidget.h"
8
9#include <iconloader_p.h>
10#include <stylesheeteditor_p.h>
11
12#include <deviceskin_p.h>
13
14#include <QtDesigner/abstractsettings.h>
15
16#include <QtWidgets/qfiledialog.h>
17#include <QtWidgets/qstylefactory.h>
18#include <QtWidgets/qfiledialog.h>
19#include <QtWidgets/qmessagebox.h>
20#include <QtCore/qpair.h>
21#include <QtCore/qlist.h>
22#include <QtCore/qdebug.h>
23#include <QtCore/qfileinfo.h>
24#include <QtCore/qshareddata.h>
25
27
28using namespace Qt::StringLiterals;
29
30static constexpr auto skinResourcePathC = ":/skins/"_L1;
31static constexpr auto skinExtensionC = "skin"_L1;
32
33// Pair of skin name, path
34using SkinNamePath = std::pair<QString, QString>;
35using Skins = QList<SkinNamePath>;
36enum { SkinComboNoneIndex = 0 };
37
38// find default skins (resources)
39static const Skins &defaultSkins() {
40 static Skins rc;
41 if (rc.isEmpty()) {
42 const QDir dir(skinResourcePathC, "*."_L1 + skinExtensionC);
43 const QFileInfoList list = dir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot, QDir::Name);
44 if (list.isEmpty())
45 return rc;
46 for (const auto &fi : list)
47 rc.append(SkinNamePath(fi.baseName(), fi.filePath()));
48 }
49 return rc;
50}
51
52namespace qdesigner_internal {
53
54// ------------- PreviewConfigurationWidgetPrivate
56public:
57 PreviewConfigurationWidgetPrivate(QDesignerFormEditorInterface *core, QGroupBox *g);
58
61 void slotSkinChanged(int index);
62
64 void storeSettings() const;
65
66 QAbstractButton *appStyleSheetChangeButton() const { return m_ui.m_appStyleSheetChangeButton; }
67 QAbstractButton *skinRemoveButton() const { return m_ui.m_skinRemoveButton; }
68 QComboBox *skinCombo() const { return m_ui.m_skinCombo; }
69
70 QDesignerFormEditorInterface *m_core;
71
72private:
73 PreviewConfiguration previewConfiguration() const;
74 void setPreviewConfiguration(const PreviewConfiguration &pc);
75
76 QStringList userSkins() const;
77 void addUserSkins(const QStringList &files);
78 bool canRemoveSkin(int index) const;
79 int browseSkin();
80
81 const QString m_defaultStyle;
82 QGroupBox *m_parent;
83 QT_PREPEND_NAMESPACE(Ui)::PreviewConfigurationWidget m_ui;
84
85 int m_firstUserSkinIndex;
86 int m_browseSkinIndex;
87 int m_lastSkinIndex; // required in case browse fails
88};
89
92 m_core(core),
94 m_parent(g),
98{
99 m_ui.setupUi(g);
100 // styles
105
106 // sheet
111
113 "editdelete.png"_L1));
114 // skins: find default skins (resources)
118
119 for (const auto &skin : std::as_const(skins))
123
126
128}
129
131{
133}
134
136{
138 for (int i = m_firstUserSkinIndex; i < m_browseSkinIndex; i++)
140 return rc;
141}
142
144{
145 if (files.isEmpty())
146 return;
147 for (const auto &f : files) {
148 const QFileInfo fi(f);
149 if (fi.isDir() && fi.isReadable())
151 else
152 qWarning() << "Unable to access the skin directory '" << f << "'.";
153 }
154}
155
157{
160 if (style == m_defaultStyle)
161 style.clear();
163 // Figure out skin. 0 is None by definition..
164 const int skinIndex = m_ui.m_skinCombo->currentIndex();
168
170}
171
173{
175 if (styleIndex == -1)
179 // find skin by file name. 0 is "none"
182 if (skinIndex == -1) {
183 qWarning() << "Unable to find skin '" << deviceSkin << "'.";
184 skinIndex = 0;
185 }
187}
188
196
206
217
225
233
235{
239 const QString title = tr("Load Custom Device Skin");
241 dlg.setNameFilter(tr("All QVFB Skins (*.%1)").arg(skinExtensionC));
242
243 int rc = m_lastSkinIndex;
244 do {
245 if (!dlg.exec())
246 break;
247
249 if (directories.size() != 1)
250 break;
251
252 // check: 1) name already there
257 const QString msgTitle = tr("%1 - Duplicate Skin").arg(title);
258 const QString msg = tr("The skin '%1' already exists.").arg(name);
260 break;
261 }
262 // check: 2) can read
269
270 break;
271 }
272 const QString msgTitle = tr("%1 - Error").arg(title);
273 const QString msg = tr("%1 is not a valid skin directory:\n%2")
276 } while (true);
277 return rc;
278}
279
280// ------------- PreviewConfigurationWidget
281PreviewConfigurationWidget::PreviewConfigurationWidget(QDesignerFormEditorInterface *core,
282 QWidget *parent) :
283 QGroupBox(parent),
284 m_impl(new PreviewConfigurationWidgetPrivate(core, this))
285{
286 connect(m_impl->appStyleSheetChangeButton(), &QAbstractButton::clicked,
287 this, &PreviewConfigurationWidget::slotEditAppStyleSheet);
288 connect(m_impl->skinRemoveButton(), &QAbstractButton::clicked,
289 this, &PreviewConfigurationWidget::slotDeleteSkinEntry);
290 connect(m_impl->skinCombo(), &QComboBox::currentIndexChanged,
291 this, &PreviewConfigurationWidget::slotSkinChanged);
292
293 m_impl->retrieveSettings();
294}
295
296PreviewConfigurationWidget::~PreviewConfigurationWidget()
297{
298 delete m_impl;
299}
300
302{
303 m_impl->storeSettings();
304}
305
307{
308 m_impl->slotEditAppStyleSheet();
309}
310
312{
313 m_impl->slotDeleteSkinEntry();
314}
315
317{
318 m_impl->slotSkinChanged(index);
319}
320
321}
322
323QT_END_NAMESPACE
friend class QWidget
Definition qpainter.h:421
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static constexpr auto skinResourcePathC
static constexpr auto skinExtensionC
static const Skins & defaultSkins()