Browse Source

Add summary of element event listeners to debugger

Michael Ragazzon 6 years ago
parent
commit
3e8d309c42

+ 3 - 0
Include/Rocket/Core/Element.h

@@ -591,6 +591,9 @@ public:
 	/// Access the event dispatcher for this element.
 	/// @return The element's dispatcher.
 	EventDispatcher* GetEventDispatcher() const;
+	/// Returns event types with number of listeners for debugging.
+	/// @return Summary of attached listeners.
+	String GetEventDispatcherSummary() const;
 	/// Access the element background.
 	/// @return The element's background.
 	ElementBackground* GetElementBackground() const;

+ 5 - 0
Source/Core/Element.cpp

@@ -1601,6 +1601,11 @@ EventDispatcher* Element::GetEventDispatcher() const
 	return event_dispatcher;
 }
 
+String Element::GetEventDispatcherSummary() const
+{
+	return event_dispatcher->ToString();
+}
+
 // Access the element background.
 ElementBackground* Element::GetElementBackground() const
 {

+ 14 - 0
Source/Core/EventDispatcher.cpp

@@ -163,6 +163,20 @@ bool EventDispatcher::DispatchEvent(Element* target_element, const String& name,
 	return propagating;
 }
 
+String EventDispatcher::ToString() const
+{
+	String result;
+	for (auto nvp : events)
+	{
+		result += String(nvp.first.Length() + 32, "%s (%d), ", nvp.first.CString(), static_cast<int>(nvp.second.size()));
+	}
+	if (result.Length() > 2) 
+	{
+		result.Resize(result.Length() - 2);
+	}
+	return result;
+}
+
 void EventDispatcher::TriggerEvents(Event* event)
 {
 	// Look up the event

+ 4 - 0
Source/Core/EventDispatcher.h

@@ -78,6 +78,10 @@ public:
 	/// @return True if the event was not consumed (ie, was prevented from propagating by an element), false if it was.
 	bool DispatchEvent(Element* element, const String& name, const Dictionary& parameters, bool interruptible);
 
+	/// Returns event types with number of listeners for debugging.
+	/// @return Summary of attached listeners.
+	String ToString() const;
+
 private:
 	Element* element;
 

+ 24 - 2
Source/Debugger/ElementInfo.cpp

@@ -230,17 +230,19 @@ void ElementInfo::UpdateSourceElement()
 			title_content->SetInnerRML("Element Information");
 	}
 
+
 	// Set the attributes:
 	Core::Element* attributes_content = GetElementById("attributes-content");
 	if (attributes_content)
 	{
 		int index = 0;
-		Core::String name;
-		Core::String value;
 		Core::String attributes;
 
 		if (source_element != NULL)
 		{
+			Core::String name;
+			Core::String value;
+
 			// The element's attribute list is not always synchronized with its internal values, fetch  
 			// them manually here (see e.g. Element::OnAttributeChange for relevant attributes)
 			{
@@ -314,6 +316,26 @@ void ElementInfo::UpdateSourceElement()
 			properties_content->SetInnerRML(properties);
 	}
 
+	// Set the events:
+	Core::Element* events_content = GetElementById("events-content");
+	if (events_content)
+	{
+		Core::String events;
+
+		if (source_element != NULL)
+		{
+			events = source_element->GetEventDispatcherSummary();
+		}
+
+		if (events.Empty())
+		{
+			while (events_content->HasChildNodes())
+				events_content->RemoveChild(events_content->GetChild(0));
+		}
+		else
+			events_content->SetInnerRML(events);
+	}
+
 	// Set the position:
 	Core::Element* position_content = GetElementById("position-content");
 	if (position_content)

+ 5 - 0
Source/Debugger/InfoSource.h

@@ -77,6 +77,11 @@ static const char* info_rml =
 "		<div id=\"properties-content\">\n"
 "		</div>\n"
 "	</div>\n"
+"	<div id =\"events\">\n"
+"		<h2>Events</h2>\n"
+"		<div id=\"events-content\">\n"
+"		</div>\n"
+"	</div>\n"
 "	<div id =\"position\">\n"
 "		<h2>Position</h2>\n"
 "		<div id=\"position-content\">\n"