7#include <qdesigner_membersheet_p.h>
8#include <widgetdatabase_p.h>
9#include <metadatabase_p.h>
11#include <QtDesigner/abstractformwindow.h>
12#include <QtDesigner/abstractformeditor.h>
13#include <QtDesigner/abstractmetadatabase.h>
14#include <QtDesigner/qextensionmanager.h>
15#include <QtDesigner/abstractlanguage.h>
21using ClassNameSignaturePair = std::pair<QString, QString>;
28template <
class SignaturePredicate,
class OutputIterator>
29static void memberList(QDesignerFormEditorInterface *core,
33 SignaturePredicate predicate,
39 const QDesignerMemberSheetExtension *members = qt_extension<QDesignerMemberSheetExtension*>(core->extensionManager(), object);
40 Q_ASSERT(members !=
nullptr);
41 const int count = members->count();
42 for (
int i = 0; i < count; ++i) {
43 if (!members->isVisible(i))
52 if (!showAll && members->inheritedFromWidget(i))
55 const QString signature = members->signature(i);
56 if (predicate(signature)) {
57 *it = ClassNameSignaturePair(members->declaredInClass(i), signature);
62 const qdesigner_internal::WidgetDataBase *wdb = qobject_cast<qdesigner_internal::WidgetDataBase *>(core->widgetDataBase());
65 const int idx = wdb->indexOfObject(object);
68 const qdesigner_internal::WidgetDataBaseItem *wdbItem =
static_cast<qdesigner_internal::WidgetDataBaseItem *>(wdb->item(idx));
69 const QString className = wdbItem->name();
72 if (!wdbFakeMethods.isEmpty())
73 for (
const QString &fakeMethod : wdbFakeMethods)
74 if (predicate(fakeMethod)) {
75 *it = ClassNameSignaturePair(className, fakeMethod);
79 qdesigner_internal::MetaDataBase *metaDataBase = qobject_cast<qdesigner_internal::MetaDataBase *>(core->metaDataBase());
83 if (
const qdesigner_internal::MetaDataBaseItem *mdbItem = metaDataBase->metaDataBaseItem(object)) {
85 if (!mdbFakeMethods.isEmpty())
86 for (
const QString &fakeMethod : mdbFakeMethods)
87 if (predicate(fakeMethod)) {
88 *it = ClassNameSignaturePair(className, fakeMethod);
96 class EqualsPredicate {
98 EqualsPredicate(
const QString &pattern) : m_pattern(pattern) {}
99 bool operator()(
const QString &s)
const {
return s == m_pattern; }
101 const QString m_pattern;
104 class SignalMatchesSlotPredicate {
107 bool operator()(
const QString &s)
const;
110 bool signalMatchesSlot(
const QString &signal,
const QString &slot)
const;
112 const QString m_peer;
114 const QDesignerLanguageExtension *m_lang;
117 SignalMatchesSlotPredicate::SignalMatchesSlotPredicate(QDesignerFormEditorInterface *core,
const QString &peer,
qdesigner_internal::
MemberType memberType) :
119 m_memberType(memberType),
120 m_lang(qt_extension<QDesignerLanguageExtension*>(core->extensionManager(), core))
124 bool SignalMatchesSlotPredicate::operator()(
const QString &s)
const
126 return m_memberType == qdesigner_internal::SlotMember ? signalMatchesSlot(m_peer, s) : signalMatchesSlot(s, m_peer);
129 bool SignalMatchesSlotPredicate::signalMatchesSlot(
const QString &signal,
const QString &slot)
const
132 return m_lang->signalMatchesSlot(signal, slot);
134 return QDesignerMemberSheet::signalMatchesSlot(signal, slot);
140 class ReverseClassesMemberIterator {
142 ReverseClassesMemberIterator(qdesigner_internal::ClassesMemberFunctions *result);
144 ReverseClassesMemberIterator &operator*() {
return *
this; }
145 ReverseClassesMemberIterator &operator++() {
return *
this; }
146 ReverseClassesMemberIterator &operator=(
const ClassNameSignaturePair &classNameSignature);
149 qdesigner_internal::ClassesMemberFunctions *m_result;
150 QString m_lastClassName;
151 QStringList *m_memberList;
154 ReverseClassesMemberIterator::ReverseClassesMemberIterator(qdesigner_internal::ClassesMemberFunctions *result) :
156 m_memberList(
nullptr)
160 ReverseClassesMemberIterator &ReverseClassesMemberIterator::operator=(
const ClassNameSignaturePair &classNameSignature)
163 if (!m_memberList || classNameSignature.first != m_lastClassName) {
164 m_lastClassName = classNameSignature.first;
165 m_result->push_front(qdesigner_internal::ClassMemberFunctions(m_lastClassName));
166 m_memberList = &(m_result->front().m_memberList);
168 m_memberList->push_back(classNameSignature.second);
174 class SignatureIterator {
176 SignatureIterator(QMap<QString, QString> *result) : m_result(result) {}
178 SignatureIterator &operator*() {
return *
this; }
179 SignatureIterator &operator++() {
return *
this; }
180 SignatureIterator &operator=(
const ClassNameSignaturePair &classNameSignature)
182 m_result->insert(classNameSignature.second, classNameSignature.first);
187 QMap<QString, QString> *m_result;
200 bool signalMatchesSlot(QDesignerFormEditorInterface *core,
const QString &signal,
const QString &slot)
203 return predicate(slot);
209 const QString &peer, QDesignerFormWindowInterface *form)
211 QObject *object =
nullptr;
212 if (obj_name == form->mainContainer()->objectName()) {
213 object = form->mainContainer();
215 object = form->mainContainer()->findChild<QObject*>(obj_name);
218 return ClassesMemberFunctions();
219 QDesignerFormEditorInterface *core = form->core();
221 ClassesMemberFunctions rc;
222 memberList(form->core(), object, member_type,
true, SignalMatchesSlotPredicate(core, peer, member_type),
223 ReverseClassesMemberIterator(&rc));
227 QMap<QString, QString> getSignals(QDesignerFormEditorInterface *core, QObject *object,
bool showAll)
229 QMap<QString, QString> rc;
230 memberList(core, object,
SignalMember, showAll, truePredicate, SignatureIterator(&rc));
234 QMap<QString, QString> getMatchingSlots(QDesignerFormEditorInterface *core, QObject *object,
const QString &signalSignature,
bool showAll)
236 QMap<QString, QString> rc;
241 bool memberFunctionListContains(QDesignerFormEditorInterface *core, QObject *object,
MemberType type,
const QString &signature)
243 QMap<QString, QString> rc;
244 memberList(core, object, type,
true, EqualsPredicate(signature), SignatureIterator(&rc));
245 return !rc.isEmpty();
249 QString realObjectName(QDesignerFormEditorInterface *core, QObject *object)
254 const QDesignerMetaDataBaseInterface *mdb = core->metaDataBase();
255 if (
const QDesignerMetaDataBaseItemInterface *item = mdb->item(object))
258 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)