6#include <qdesigner_membersheet_p.h>
7#include <widgetdatabase_p.h>
8#include <metadatabase_p.h>
10#include <QtDesigner/abstractformwindow.h>
11#include <QtDesigner/abstractformeditor.h>
12#include <QtDesigner/abstractmetadatabase.h>
13#include <QtDesigner/qextensionmanager.h>
14#include <QtDesigner/abstractlanguage.h>
16#include <QtCore/qpair.h>
20using ClassNameSignaturePair = std::pair<QString, QString>;
27template <
class SignaturePredicate,
class OutputIterator>
28static void memberList(QDesignerFormEditorInterface *core,
32 SignaturePredicate predicate,
38 const QDesignerMemberSheetExtension *members = qt_extension<QDesignerMemberSheetExtension*>(core->extensionManager(), object);
39 Q_ASSERT(members !=
nullptr);
40 const int count = members->count();
41 for (
int i = 0; i < count; ++i) {
42 if (!members->isVisible(i))
51 if (!showAll && members->inheritedFromWidget(i))
54 const QString signature = members->signature(i);
55 if (predicate(signature)) {
56 *it = ClassNameSignaturePair(members->declaredInClass(i), signature);
61 const qdesigner_internal::WidgetDataBase *wdb = qobject_cast<qdesigner_internal::WidgetDataBase *>(core->widgetDataBase());
64 const int idx = wdb->indexOfObject(object);
67 const qdesigner_internal::WidgetDataBaseItem *wdbItem =
static_cast<qdesigner_internal::WidgetDataBaseItem *>(wdb->item(idx));
68 const QString className = wdbItem->name();
70 const QStringList wdbFakeMethods = member_type == qdesigner_internal::SlotMember ? wdbItem->fakeSlots() : wdbItem->fakeSignals();
71 if (!wdbFakeMethods.isEmpty())
72 for (
const QString &fakeMethod : wdbFakeMethods)
73 if (predicate(fakeMethod)) {
74 *it = ClassNameSignaturePair(className, fakeMethod);
78 qdesigner_internal::MetaDataBase *metaDataBase = qobject_cast<qdesigner_internal::MetaDataBase *>(core->metaDataBase());
82 if (
const qdesigner_internal::MetaDataBaseItem *mdbItem = metaDataBase->metaDataBaseItem(object)) {
83 const QStringList mdbFakeMethods = member_type == qdesigner_internal::SlotMember ? mdbItem->fakeSlots() : mdbItem->fakeSignals();
84 if (!mdbFakeMethods.isEmpty())
85 for (
const QString &fakeMethod : mdbFakeMethods)
86 if (predicate(fakeMethod)) {
87 *it = ClassNameSignaturePair(className, fakeMethod);
95 class EqualsPredicate {
97 EqualsPredicate(
const QString &pattern) : m_pattern(pattern) {}
98 bool operator()(
const QString &s)
const {
return s == m_pattern; }
100 const QString m_pattern;
103 class SignalMatchesSlotPredicate {
106 bool operator()(
const QString &s)
const;
109 bool signalMatchesSlot(
const QString &signal,
const QString &slot)
const;
111 const QString m_peer;
113 const QDesignerLanguageExtension *m_lang;
116 SignalMatchesSlotPredicate::SignalMatchesSlotPredicate(QDesignerFormEditorInterface *core,
const QString &peer,
qdesigner_internal::
MemberType memberType) :
118 m_memberType(memberType),
119 m_lang(qt_extension<QDesignerLanguageExtension*>(core->extensionManager(), core))
123 bool SignalMatchesSlotPredicate::operator()(
const QString &s)
const
125 return m_memberType == qdesigner_internal::SlotMember ? signalMatchesSlot(m_peer, s) : signalMatchesSlot(s, m_peer);
128 bool SignalMatchesSlotPredicate::signalMatchesSlot(
const QString &signal,
const QString &slot)
const
131 return m_lang->signalMatchesSlot(signal, slot);
133 return QDesignerMemberSheet::signalMatchesSlot(signal, slot);
139 class ReverseClassesMemberIterator {
141 ReverseClassesMemberIterator(qdesigner_internal::ClassesMemberFunctions *result);
143 ReverseClassesMemberIterator &operator*() {
return *
this; }
144 ReverseClassesMemberIterator &operator++() {
return *
this; }
145 ReverseClassesMemberIterator &operator=(
const ClassNameSignaturePair &classNameSignature);
148 qdesigner_internal::ClassesMemberFunctions *m_result;
149 QString m_lastClassName;
150 QStringList *m_memberList;
153 ReverseClassesMemberIterator::ReverseClassesMemberIterator(qdesigner_internal::ClassesMemberFunctions *result) :
155 m_memberList(
nullptr)
159 ReverseClassesMemberIterator &ReverseClassesMemberIterator::operator=(
const ClassNameSignaturePair &classNameSignature)
162 if (!m_memberList || classNameSignature.first != m_lastClassName) {
163 m_lastClassName = classNameSignature.first;
164 m_result->push_front(qdesigner_internal::ClassMemberFunctions(m_lastClassName));
165 m_memberList = &(m_result->front().m_memberList);
167 m_memberList->push_back(classNameSignature.second);
173 class SignatureIterator {
175 SignatureIterator(QMap<QString, QString> *result) : m_result(result) {}
177 SignatureIterator &operator*() {
return *
this; }
178 SignatureIterator &operator++() {
return *
this; }
179 SignatureIterator &operator=(
const ClassNameSignaturePair &classNameSignature)
181 m_result->insert(classNameSignature.second, classNameSignature.first);
186 QMap<QString, QString> *m_result;
199 bool signalMatchesSlot(QDesignerFormEditorInterface *core,
const QString &signal,
const QString &slot)
202 return predicate(slot);
208 const QString &peer, QDesignerFormWindowInterface *form)
210 QObject *object =
nullptr;
211 if (obj_name == form->mainContainer()->objectName()) {
212 object = form->mainContainer();
214 object = form->mainContainer()->findChild<QObject*>(obj_name);
217 return ClassesMemberFunctions();
218 QDesignerFormEditorInterface *core = form->core();
220 ClassesMemberFunctions rc;
221 memberList(form->core(), object, member_type,
true, SignalMatchesSlotPredicate(core, peer, member_type),
222 ReverseClassesMemberIterator(&rc));
226 QMap<QString, QString> getSignals(QDesignerFormEditorInterface *core, QObject *object,
bool showAll)
228 QMap<QString, QString> rc;
229 memberList(core, object,
SignalMember, showAll, truePredicate, SignatureIterator(&rc));
233 QMap<QString, QString> getMatchingSlots(QDesignerFormEditorInterface *core, QObject *object,
const QString &signalSignature,
bool showAll)
235 QMap<QString, QString> rc;
240 bool memberFunctionListContains(QDesignerFormEditorInterface *core, QObject *object,
MemberType type,
const QString &signature)
242 QMap<QString, QString> rc;
243 memberList(core, object, type,
true, EqualsPredicate(signature), SignatureIterator(&rc));
244 return !rc.isEmpty();
248 QString realObjectName(QDesignerFormEditorInterface *core, QObject *object)
253 const QDesignerMetaDataBaseInterface *mdb = core->metaDataBase();
254 if (
const QDesignerMetaDataBaseItemInterface *item = mdb->item(object))
257 return object->objectName();
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
bool signalMatchesSlot(QDesignerFormEditorInterface *core, const QString &signal, const QString &slot)
ClassesMemberFunctions reverseClassesMemberFunctions(const QString &obj_name, MemberType member_type, const QString &peer, QDesignerFormWindowInterface *form)
static void memberList(QDesignerFormEditorInterface *core, QObject *object, qdesigner_internal::MemberType member_type, bool showAll, SignaturePredicate predicate, OutputIterator it)
static bool truePredicate(const QString &)
ClassMemberFunctions(const QString &_class_name)