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#include "previewactiongroup.h"
30
31#include <deviceprofile_p.h>
32#include <shared_settings_p.h>
33
34#include <QtWidgets/qstylefactory.h>
35#include <QtCore/qvariant.h>
36
37QT_BEGIN_NAMESPACE
38
39enum { MaxDeviceActions = 20 };
40
41namespace qdesigner_internal {
42
43PreviewActionGroup::PreviewActionGroup(QDesignerFormEditorInterface *core, QObject *parent) :
44 QActionGroup(parent),
45 m_core(core)
46{
47 /* Create a list of up to MaxDeviceActions invisible actions to be
48 * populated with device profiles (actiondata: index) followed by the
49 * standard style actions (actiondata: style name). */
50 connect(sender: this, signal: &PreviewActionGroup::triggered, receiver: this, slot: &PreviewActionGroup::slotTriggered);
51 setExclusive(true);
52
53 const QString objNamePostfix = QStringLiteral("_action");
54 // Create invisible actions for devices. Set index as action data.
55 QString objNamePrefix = QStringLiteral("__qt_designer_device_");
56 for (int i = 0; i < MaxDeviceActions; i++) {
57 QAction *a = new QAction(this);
58 QString objName = objNamePrefix;
59 objName += QString::number(i);
60 objName += objNamePostfix;
61 a->setObjectName(objName);
62 a->setVisible(false);
63 a->setData(i);
64 addAction(a);
65 }
66 // Create separator at index MaxDeviceActions
67 QAction *sep = new QAction(this);
68 sep->setObjectName(QStringLiteral("__qt_designer_deviceseparator"));
69 sep->setSeparator(true);
70 sep->setVisible(false);
71 addAction(a: sep);
72 // Populate devices
73 updateDeviceProfiles();
74
75 // Add style actions
76 const QStringList styles = QStyleFactory::keys();
77 const QStringList::const_iterator cend = styles.constEnd();
78 // Make sure ObjectName is unique in case toolbar solution is used.
79 objNamePrefix = QStringLiteral("__qt_designer_style_");
80 // Create styles. Set style name string as action data.
81 for (QStringList::const_iterator it = styles.constBegin(); it != cend ;++it) {
82 QAction *a = new QAction(tr(s: "%1 Style").arg(a: *it), this);
83 QString objName = objNamePrefix;
84 objName += *it;
85 objName += objNamePostfix;
86 a->setObjectName(objName);
87 a->setData(*it);
88 addAction(a);
89 }
90}
91
92void PreviewActionGroup::updateDeviceProfiles()
93{
94 const QDesignerSharedSettings settings(m_core);
95 const auto profiles = settings.deviceProfiles();
96 const auto al = actions();
97 // Separator?
98 const bool hasProfiles = !profiles.isEmpty();
99 al.at(i: MaxDeviceActions)->setVisible(hasProfiles);
100 int index = 0;
101 if (hasProfiles) {
102 // Make actions visible
103 const int maxIndex = qMin(a: static_cast<int>(MaxDeviceActions), b: profiles.size());
104 for (; index < maxIndex; index++) {
105 const QString name = profiles.at(i: index).name();
106 al.at(i: index)->setText(name);
107 al.at(i: index)->setVisible(true);
108 }
109 }
110 // Hide rest
111 for ( ; index < MaxDeviceActions; index++)
112 al.at(i: index)->setVisible(false);
113}
114
115void PreviewActionGroup::slotTriggered(QAction *a)
116{
117 // Device or style according to data.
118 const QVariant data = a->data();
119 switch (data.type()) {
120 case QVariant::String:
121 emit preview(style: data.toString(), deviceProfileIndex: -1);
122 break;
123 case QVariant::Int:
124 emit preview(style: QString(), deviceProfileIndex: data.toInt());
125 break;
126 default:
127 break;
128 }
129}
130
131}
132
133QT_END_NAMESPACE
134

source code of qttools/src/designer/src/components/formeditor/previewactiongroup.cpp