+ int eventType = -1;
+
+ // special handling for numeric IrcEvents: IrcEvent042 gets mapped to IrcEventNumeric + 42
+ if (methodSignature.length() == 8+3 && methodSignature.startsWith("IrcEvent")) {
+ int num = methodSignature.right(3).toUInt();
+ if (num > 0) {
+ QString numericSig = methodSignature.left(methodSignature.length() - 3) + "Numeric";
+ eventType = eventEnum().keyToValue(numericSig.toLatin1());
+ if (eventType < 0) {
+ qWarning() << Q_FUNC_INFO << "Could not find EventType" << numericSig << "for handling" << methodSignature;
+ return -1;
+ }
+ eventType += num;
+ }
+ }
+
+ if (eventType < 0)
+ eventType = eventEnum().keyToValue(methodSignature.toLatin1());
+ if (eventType < 0) {
+ qWarning() << Q_FUNC_INFO << "Could not find EventType" << methodSignature;
+ return -1;
+ }
+ return eventType;
+}
+
+
+void EventManager::registerObject(QObject *object, Priority priority, const QString &methodPrefix, const QString &filterPrefix)
+{
+ for (int i = object->metaObject()->methodOffset(); i < object->metaObject()->methodCount(); i++) {
+ QString methodSignature = object->metaObject()->method(i).methodSignature();
+ int eventType = findEventType(methodSignature, methodPrefix);
+ if (eventType > 0) {
+ Handler handler(object, i, priority);
+ registeredHandlers()[eventType].append(handler);
+ //qDebug() << "Registered event handler for" << methodSignature << "in" << object;
+ }
+ eventType = findEventType(methodSignature, filterPrefix);
+ if (eventType > 0) {
+ Handler handler(object, i, priority);
+ registeredFilters()[eventType].append(handler);
+ //qDebug() << "Registered event filterer for" << methodSignature << "in" << object;
+ }
+ }
+}
+
+
+void EventManager::registerEventFilter(EventType event, QObject *object, const char *slot)
+{
+ registerEventHandler(QList<EventType>() << event, object, slot, NormalPriority, true);
+}
+
+
+void EventManager::registerEventFilter(QList<EventType> events, QObject *object, const char *slot)
+{
+ registerEventHandler(events, object, slot, NormalPriority, true);
+}
+
+
+void EventManager::registerEventHandler(EventType event, QObject *object, const char *slot, Priority priority, bool isFilter)
+{
+ registerEventHandler(QList<EventType>() << event, object, slot, priority, isFilter);
+}
+
+
+void EventManager::registerEventHandler(QList<EventType> events, QObject *object, const char *slot, Priority priority, bool isFilter)
+{
+ int methodIndex = object->metaObject()->indexOfMethod(slot);
+ if (methodIndex < 0) {
+ qWarning() << Q_FUNC_INFO << QString("Slot %1 not found in object %2").arg(slot).arg(object->objectName());
+ return;
+ }
+ Handler handler(object, methodIndex, priority);
+ foreach(EventType event, events) {
+ if (isFilter) {
+ registeredFilters()[event].append(handler);
+ qDebug() << "Registered event filter for" << event << "in" << object;
+ }
+ else {
+ registeredHandlers()[event].append(handler);
+ qDebug() << "Registered event handler for" << event << "in" << object;
+ }