Przeglądaj źródła

Added a way for event handlers to cancel subsequent executions of an event

Ivan Safrin 10 lat temu
rodzic
commit
680509fa3b

+ 5 - 2
Core/Contents/Include/PolyEvent.h

@@ -60,6 +60,9 @@ namespace Polycode {
 			void setEventCode(int eventCode);			
 			void setDispatcher(EventDispatcher *dispatcher);
 			const String& getEventType() const;
+        
+        
+            void cancelEvent();
 			
 			// In order to prevent "namespace" collisions between events of different types, all event integers must be unique.
 			// This is managed by arbitrarily assigning each class a "base" constant, and adding it to all its event type constants.
@@ -91,12 +94,12 @@ namespace Polycode {
 			static const int EVENTBASE_NONPOLYCODE = 0x10000;
 		
 			bool deleteOnDispatch;
-						
+            bool cancelEventFlag;
+        
 		protected:
 			
 			String eventType;
 			EventDispatcher *dispatcher;
 			int eventCode;
-			
 	};
 }

+ 8 - 1
Core/Contents/Source/PolyEvent.cpp

@@ -26,9 +26,11 @@ namespace Polycode {
 	
 	Event::Event() {
 			deleteOnDispatch = true;
+            cancelEventFlag = false;
 	}
 	
-	Event::Event(int eventCode) {	
+	Event::Event(int eventCode) {
+        cancelEventFlag = false;
 		setEventCode(eventCode);
 	}
 	
@@ -55,4 +57,9 @@ namespace Polycode {
 	void Event::setEventCode(int eventCode) {
 		this->eventCode = eventCode;
 	}
+    
+    void Event::cancelEvent() {
+        cancelEventFlag = true;
+    }
+
 }

+ 3 - 0
Core/Contents/Source/PolyEventDispatcher.cpp

@@ -87,6 +87,9 @@ void EventDispatcher::__dispatchEvent(Event *event, int eventCode) {
     for(int i=0;i<handlerEntries.size();i++) {
         if(handlerEntries[i].eventCode == eventCode) {
             handlerEntries[i].handler->handleEvent(event);
+            if(event->cancelEventFlag) {
+                break;
+            }
         }
     }	
 }