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
qdesigner_membersheet.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
7
8#include <QtDesigner/abstractformeditor.h>
9#include <abstractintrospection_p.h>
10
11#include <QtWidgets/qwidget.h>
12
14
15using namespace Qt::StringLiterals;
16
17static QByteArrayList stringListToByteArray(const QStringList &l)
18{
19 QByteArrayList rc;
20 for (const auto &s : l)
21 rc += s.toUtf8();
22 return rc;
23}
24
25// ------------ QDesignerMemberSheetPrivate
27public:
28 explicit QDesignerMemberSheetPrivate(QObject *object, QObject *sheetParent);
29
30 QDesignerFormEditorInterface *m_core;
32
33 class Info {
34 public:
35 QString group;
36 bool visible{true};
37 };
38
39 Info &ensureInfo(int index);
40
42};
43
49
51{
52 auto it = m_info.find(index);
53 if (it == m_info.end())
54 it = m_info.insert(index, Info());
55 return it.value();
56}
57
58// --------- QDesignerMemberSheet
59
60QDesignerMemberSheet::QDesignerMemberSheet(QObject *object, QObject *parent) :
61 QObject(parent),
62 d(new QDesignerMemberSheetPrivate(object, parent))
63{
64}
65
66QDesignerMemberSheet::~QDesignerMemberSheet()
67{
68 delete d;
69}
70
71int QDesignerMemberSheet::count() const
72{
73 return d->m_meta->methodCount();
74}
75
76int QDesignerMemberSheet::indexOf(const QString &name) const
77{
78 return d->m_meta->indexOfMethod(name);
79}
80
81QString QDesignerMemberSheet::memberName(int index) const
82{
83 return d->m_meta->method(index)->tag();
84}
85
86QString QDesignerMemberSheet::declaredInClass(int index) const
87{
88 const QString member = d->m_meta->method(index)->signature();
89
90 // Find class whose superclass does not contain the method.
91 const QDesignerMetaObjectInterface *meta_obj = d->m_meta;
92
93 for (;;) {
94 const QDesignerMetaObjectInterface *tmp = meta_obj->superClass();
95 if (tmp == nullptr)
96 break;
97 if (tmp->indexOfMethod(member) == -1)
98 break;
99 meta_obj = tmp;
100 }
101 return meta_obj->className();
102}
103
104QString QDesignerMemberSheet::memberGroup(int index) const
105{
106 return d->m_info.value(index).group;
107}
108
109void QDesignerMemberSheet::setMemberGroup(int index, const QString &group)
110{
111 d->ensureInfo(index).group = group;
112}
113
114QString QDesignerMemberSheet::signature(int index) const
115{
116 return d->m_meta->method(index)->normalizedSignature();
117}
118
119bool QDesignerMemberSheet::isVisible(int index) const
120{
121 const auto it = d->m_info.constFind(index);
122 if (it != d->m_info.constEnd())
123 return it.value().visible;
124
125 return d->m_meta->method(index)->methodType() == QDesignerMetaMethodInterface::Signal
126 || d->m_meta->method(index)->access() == QDesignerMetaMethodInterface::Public;
127}
128
129void QDesignerMemberSheet::setVisible(int index, bool visible)
130{
131 d->ensureInfo(index).visible = visible;
132}
133
134bool QDesignerMemberSheet::isSignal(int index) const
135{
136 return d->m_meta->method(index)->methodType() == QDesignerMetaMethodInterface::Signal;
137}
138
139bool QDesignerMemberSheet::isSlot(int index) const
140{
141 return d->m_meta->method(index)->methodType() == QDesignerMetaMethodInterface::Slot;
142}
143
144bool QDesignerMemberSheet::inheritedFromWidget(int index) const
145{
146 return declaredInClass(index) == "QWidget"_L1 || declaredInClass(index) == "QObject"_L1;
147}
148
149
150QList<QByteArray> QDesignerMemberSheet::parameterTypes(int index) const
151{
152 return stringListToByteArray(d->m_meta->method(index)->parameterTypes());
153}
154
155QList<QByteArray> QDesignerMemberSheet::parameterNames(int index) const
156{
157 return stringListToByteArray(d->m_meta->method(index)->parameterNames());
158}
159
160bool QDesignerMemberSheet::signalMatchesSlot(const QString &signal, const QString &slot)
161{
162 bool result = true;
163
164 do {
165 qsizetype signal_idx = signal.indexOf(u'(');
166 qsizetype slot_idx = slot.indexOf(u'(');
167 if (signal_idx == -1 || slot_idx == -1)
168 break;
169
170 ++signal_idx; ++slot_idx;
171
172 if (slot.at(slot_idx) == u')')
173 break;
174
175 while (signal_idx < signal.size() && slot_idx < slot.size()) {
176 const QChar signal_c = signal.at(signal_idx);
177 const QChar slot_c = slot.at(slot_idx);
178
179 if (signal_c == u',' && slot_c == u')')
180 break;
181
182 if (signal_c == u')' && slot_c == u')')
183 break;
184
185 if (signal_c != slot_c) {
186 result = false;
187 break;
188 }
189
190 ++signal_idx; ++slot_idx;
191 }
192 } while (false);
193
194 return result;
195}
196
197// ------------ QDesignerMemberSheetFactory
198
199QDesignerMemberSheetFactory::QDesignerMemberSheetFactory(QExtensionManager *parent)
200 : QExtensionFactory(parent)
201{
202}
203
204QObject *QDesignerMemberSheetFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const
205{
206 if (iid == Q_TYPEID(QDesignerMemberSheetExtension)) {
207 return new QDesignerMemberSheet(object, parent);
208 }
209
210 return nullptr;
211}
212
213QT_END_NAMESPACE
QDesignerFormEditorInterface * m_core
const QDesignerMetaObjectInterface * m_meta
QDesignerMemberSheetPrivate(QObject *object, QObject *sheetParent)
Combined button and popup list for selecting options.
static QByteArrayList stringListToByteArray(const QStringList &l)