Browse Source

Added hasEventListener and addEventListenerUnique convenience methods to EventDispatcher, linked entities will now update properly in the entity editor when the source file changes

Ivan Safrin 12 years ago
parent
commit
fe21b9fa92

+ 5 - 1
Core/Contents/Include/PolyEventDispatcher.h

@@ -64,7 +64,11 @@ typedef struct {
 			* @see EventHandler
 			* @see EventHandler
 			*/						
 			*/						
 			void addEventListener(EventHandler *handler, int eventCode);
 			void addEventListener(EventHandler *handler, int eventCode);
-			
+        
+			void addEventListenerUnique(EventHandler *handler, int eventCode);
+        
+            bool hasEventListener(EventHandler *handler, int eventCode);
+        
 			/**
 			/**
 			* Removes a listener for a specific handler and event code. 
 			* Removes a listener for a specific handler and event code. 
 			* @param handler The event handler to remove as a listener
 			* @param handler The event handler to remove as a listener

+ 72 - 56
Core/Contents/Source/PolyEventDispatcher.cpp

@@ -23,63 +23,79 @@
 #include "PolyEventDispatcher.h"
 #include "PolyEventDispatcher.h"
 #include "PolyEvent.h"
 #include "PolyEvent.h"
 
 
-namespace Polycode {
-	
-	EventDispatcher::EventDispatcher() : EventHandler() {
-	}
-	
-	EventDispatcher::~EventDispatcher() {
-		
-	}
-	
-	void EventDispatcher::addEventListener(EventHandler *handler, int eventCode) {
-		EventEntry newEntry;
-		newEntry.handler = handler;
-		newEntry.eventCode = eventCode;
-		handlerEntries.push_back(newEntry);
-	}
+using namespace Polycode;
 
 
-	void EventDispatcher::removeAllHandlers() {
-		handlerEntries.clear();
-	}
-	
-	void EventDispatcher::removeAllHandlersForListener(EventHandler *handler) {
-		std::vector<EventEntry>::iterator iter = handlerEntries.begin();
-		while (iter != handlerEntries.end()) {	
-			if((*iter).handler == handler) {
-				iter = handlerEntries.erase(iter);
-			} else {	
-				++iter;						
-			}
-		}
-		
-	}
+EventDispatcher::EventDispatcher() : EventHandler() {
+}
+
+EventDispatcher::~EventDispatcher() {
+    
+}
+
+void EventDispatcher::addEventListenerUnique(EventHandler *handler, int eventCode) {
+    if(!hasEventListener(handler, eventCode)) {
+        addEventListener(handler, eventCode);
+    }
+}
+
+bool EventDispatcher::hasEventListener(EventHandler *handler, int eventCode) {
+    std::vector<EventEntry>::iterator iter = handlerEntries.begin();
+    for(int i=0;i<handlerEntries.size();i++) {
+        if(handlerEntries[i].eventCode == eventCode && handlerEntries[i].handler == handler) {
+            return true;
+        }
+    }
+    return false;
+}
+
+
+void EventDispatcher::addEventListener(EventHandler *handler, int eventCode) {
+    EventEntry newEntry;
+    newEntry.handler = handler;
+    newEntry.eventCode = eventCode;
+    handlerEntries.push_back(newEntry);
+}
 
 
-	void EventDispatcher::removeEventListener(EventHandler *handler, int eventCode) {
-		for(int i=0;i<handlerEntries.size();i++) {
-			if(handlerEntries[i].eventCode == eventCode && handlerEntries[i].handler == handler) {
-				handlerEntries.erase(handlerEntries.begin()+i);
-			}
-		}
-	}
-	
-	void EventDispatcher::__dispatchEvent(Event *event, int eventCode) {
-		//		event->setDispatcher(dynamic_cast<void*>(this));
-		event->setDispatcher(this);
-		event->setEventCode(eventCode);
-		for(int i=0;i<handlerEntries.size();i++) {
-			if(handlerEntries[i].eventCode == eventCode) {
-				handlerEntries[i].handler->handleEvent(event);
-			}
-		}	
-	}
-	
-	void EventDispatcher::dispatchEventNoDelete(Event *event, int eventCode) {
-		__dispatchEvent(event,eventCode);
-	}
+void EventDispatcher::removeAllHandlers() {
+    handlerEntries.clear();
+}
+
+void EventDispatcher::removeAllHandlersForListener(EventHandler *handler) {
+    std::vector<EventEntry>::iterator iter = handlerEntries.begin();
+    while (iter != handlerEntries.end()) {	
+        if((*iter).handler == handler) {
+            iter = handlerEntries.erase(iter);
+        } else {	
+            ++iter;						
+        }
+    }
+    
+}
+
+void EventDispatcher::removeEventListener(EventHandler *handler, int eventCode) {
+    for(int i=0;i<handlerEntries.size();i++) {
+        if(handlerEntries[i].eventCode == eventCode && handlerEntries[i].handler == handler) {
+            handlerEntries.erase(handlerEntries.begin()+i);
+        }
+    }
+}
+
+void EventDispatcher::__dispatchEvent(Event *event, int eventCode) {
+    //		event->setDispatcher(dynamic_cast<void*>(this));
+    event->setDispatcher(this);
+    event->setEventCode(eventCode);
+    for(int i=0;i<handlerEntries.size();i++) {
+        if(handlerEntries[i].eventCode == eventCode) {
+            handlerEntries[i].handler->handleEvent(event);
+        }
+    }	
+}
+
+void EventDispatcher::dispatchEventNoDelete(Event *event, int eventCode) {
+    __dispatchEvent(event,eventCode);
+}
 
 
-	void EventDispatcher::dispatchEvent(Event *event, int eventCode) {
-		__dispatchEvent(event,eventCode);
-		delete event;
-	}
+void EventDispatcher::dispatchEvent(Event *event, int eventCode) {
+    __dispatchEvent(event,eventCode);
+    delete event;
 }
 }

+ 8 - 4
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -478,6 +478,7 @@ void EntityEditorMainView::setEditorProps(Entity *entity) {
         for(int i=0; i < instance->getNumChildren(); i++) {
         for(int i=0; i < instance->getNumChildren(); i++) {
             setLinkedEntityPropsRecursive(instance, instance->getChildAtIndex(i));
             setLinkedEntityPropsRecursive(instance, instance->getChildAtIndex(i));
             instance->getResourceEntry()->reloadOnFileModify = true;
             instance->getResourceEntry()->reloadOnFileModify = true;
+            instance->getResourceEntry()->addEventListenerUnique(this, Event::RESOURCE_RELOAD_EVENT);
             if(!CoreServices::getInstance()->getResourceManager()->getGlobalPool()->hasResource(instance->getResourceEntry())) {
             if(!CoreServices::getInstance()->getResourceManager()->getGlobalPool()->hasResource(instance->getResourceEntry())) {
                 CoreServices::getInstance()->getResourceManager()->getGlobalPool()->addResource(instance->getResourceEntry());
                 CoreServices::getInstance()->getResourceManager()->getGlobalPool()->addResource(instance->getResourceEntry());
             }
             }
@@ -689,8 +690,12 @@ void EntityEditorMainView::onLoseFocus() {
 }
 }
 
 
 void EntityEditorMainView::handleEvent(Event *event) {
 void EntityEditorMainView::handleEvent(Event *event) {
-
-    if(event->getDispatcher() == renderTextureShape) {
+	if(event->getEventCode() == Event::RESOURCE_RELOAD_EVENT) {
+        SceneEntityInstanceResourceEntry *entry = dynamic_cast<SceneEntityInstanceResourceEntry*>(event->getDispatcher());
+        if(entry) {
+                setEditorProps(entry->getInstance());
+        }
+	} else if(event->getDispatcher() == renderTextureShape) {
         focusSelf();
         focusSelf();
     } else if(event->getDispatcher() == trackballCamera) {
     } else if(event->getDispatcher() == trackballCamera) {
         Update();
         Update();
@@ -735,8 +740,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 sceneObjectRoot->addChild(newEntity);
                 sceneObjectRoot->addChild(newEntity);
                 setEditorProps(newEntity);
                 setEditorProps(newEntity);
                 newEntity->setPosition(cursorPosition);
                 newEntity->setPosition(cursorPosition);
-                selectEntity(newEntity);
-            }
+                selectEntity(newEntity);            }
             
             
             globalFrame->assetBrowser->removeAllHandlersForListener(this);
             globalFrame->assetBrowser->removeAllHandlersForListener(this);
             globalFrame->hideModal();
             globalFrame->hideModal();