Introduce a flag EventManager::Silent
[quassel.git] / src / common / eventmanager.h
index 73ff8b7..4030cff 100644 (file)
@@ -46,7 +46,8 @@ public:
   };
 
   enum EventFlag {
-    Backlog = 0x40,
+    Backlog = 0x20,
+    Silent  = 0x40, ///< Don't generate a MessageEvent
     Stopped = 0x80
   };
   Q_DECLARE_FLAGS(EventFlags, EventFlag)
@@ -77,8 +78,8 @@ public:
     IrcServerParseError,
 
     IrcEvent                    = 0x00030000,
+    IrcEventAuthenticate,
     IrcEventCap,
-    IrcEventCapAuthenticate,
     IrcEventInvite,
     IrcEventJoin,
     IrcEventKick,
@@ -96,21 +97,29 @@ public:
     IrcEventUnknown,    ///< Unknown non-numeric cmd
 
     IrcEventNumeric             = 0x00031000, /* needs 1000 (0x03e8) consecutive free values! */
+    IrcEventNumericMask         = 0x00000fff, /* for checking if an event is numeric */
 
     MessageEvent                = 0x00040000, ///< Stringified event suitable for converting to Message
   };
 
   EventManager(QObject *parent = 0);
-  //virtual ~EventManager();
+  virtual ~EventManager();
 
   EventType eventTypeByName(const QString &name) const;
   EventType eventGroupByName(const QString &name) const;
   QString enumName(EventType type) const;
 
 public slots:
-  void registerObject(QObject *object, Priority priority = NormalPriority, const QString &methodPrefix = "handle");
-  void registerEventHandler(EventType event, QObject *object, const char *slot, Priority priority = NormalPriority);
-  void registerEventHandler(QList<EventType> events, QObject *object, const char *slot, Priority priority = NormalPriority);
+  void registerObject(QObject *object, Priority priority = NormalPriority,
+                      const QString &methodPrefix = "process",
+                      const QString &filterPrefix = "filter");
+  void registerEventHandler(EventType event, QObject *object, const char *slot,
+                            Priority priority = NormalPriority, bool isFilter = false);
+  void registerEventHandler(QList<EventType> events, QObject *object, const char *slot,
+                            Priority priority = NormalPriority, bool isFilter = false);
+
+  void registerEventFilter(EventType event, QObject *object, const char *slot);
+  void registerEventFilter(QList<EventType> events, QObject *object, const char *slot);
 
   //! Send an event to the registered handlers
   /**
@@ -120,6 +129,9 @@ public slots:
    */
   void sendEvent(Event *event);
 
+protected:
+  virtual void customEvent(QEvent *event);
+
 private:
   struct Handler {
     QObject *object;
@@ -138,16 +150,27 @@ private:
   inline const HandlerHash &registeredHandlers() const { return _registeredHandlers; }
   inline HandlerHash &registeredHandlers() { return _registeredHandlers; }
 
+  inline const HandlerHash &registeredFilters() const { return _registeredFilters; }
+  inline HandlerHash &registeredFilters() { return _registeredFilters; }
+
   //! Add handlers to an existing sorted (by priority) handler list
   void insertHandlers(const QList<Handler> &newHandlers, QList<Handler> &existing);
+  //! Add filters to an existing filter hash
+  void insertFilters(const QList<Handler> &newFilters, QHash<QObject *, Handler> &existing);
 
+  int findEventType(const QString &methodSignature, const QString &methodPrefix) const;
+
+  void processEvents();
   void dispatchEvent(Event *event);
 
   //! @return the EventType enum
   QMetaEnum eventEnum() const;
 
   HandlerHash _registeredHandlers;
+  HandlerHash _registeredFilters;
   mutable QMetaEnum _enum;
+
+  QList<Event *> _eventQueue;
 };
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(EventManager::EventFlags);