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