From 386820b24edd6cdb48f63ce2fd14484bf9c8778f Mon Sep 17 00:00:00 2001 From: Michael Ragazzon Date: Sun, 31 Mar 2024 10:25:08 +0200 Subject: [PATCH] Invader sample: Clean up event listeners, see #605 --- Samples/invaders/src/ElementGame.cpp | 12 ++++++++++++ Samples/invaders/src/ElementGame.h | 7 ++++--- Samples/luainvaders/src/ElementGame.cpp | 12 ++++++++++++ Samples/luainvaders/src/ElementGame.h | 7 ++++--- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Samples/invaders/src/ElementGame.cpp b/Samples/invaders/src/ElementGame.cpp index 3c1a191c9..a6b19410f 100644 --- a/Samples/invaders/src/ElementGame.cpp +++ b/Samples/invaders/src/ElementGame.cpp @@ -100,3 +100,15 @@ void ElementGame::OnChildAdd(Rml::Element* element) GetOwnerDocument()->AddEventListener(Rml::EventId::Keyup, this); } } + +void ElementGame::OnChildRemove(Rml::Element* element) +{ + Rml::Element::OnChildRemove(element); + + if (element == this) + { + GetOwnerDocument()->RemoveEventListener(Rml::EventId::Load, this); + GetOwnerDocument()->RemoveEventListener(Rml::EventId::Keydown, this); + GetOwnerDocument()->RemoveEventListener(Rml::EventId::Keyup, this); + } +} diff --git a/Samples/invaders/src/ElementGame.h b/Samples/invaders/src/ElementGame.h index 98d6fe21e..1d181e31d 100644 --- a/Samples/invaders/src/ElementGame.h +++ b/Samples/invaders/src/ElementGame.h @@ -46,11 +46,12 @@ class ElementGame : public Rml::Element, public Rml::EventListener { /// Intercepts and handles key events. void ProcessEvent(Rml::Event& event) override; - /// Receive notifications when child elements are added - /// This will only get called when we're added to the tree, - /// which allows us to bind to onload + /// This will get called when we're added to the tree, which allows us to bind to events. void OnChildAdd(Rml::Element* element) override; + /// This will get called when we're removed from the tree, which allows us to clean up the event listeners previously added. + void OnChildRemove(Element* element) override; + protected: /// Updates the game. void OnUpdate() override; diff --git a/Samples/luainvaders/src/ElementGame.cpp b/Samples/luainvaders/src/ElementGame.cpp index 8bec0fe21..27ff353f6 100644 --- a/Samples/luainvaders/src/ElementGame.cpp +++ b/Samples/luainvaders/src/ElementGame.cpp @@ -103,3 +103,15 @@ void ElementGame::OnChildAdd(Rml::Element* element) GetOwnerDocument()->AddEventListener(Rml::EventId::Keyup, this); } } + +void ElementGame::OnChildRemove(Rml::Element* element) +{ + Rml::Element::OnChildRemove(element); + + if (element == this) + { + GetOwnerDocument()->RemoveEventListener(Rml::EventId::Load, this); + GetOwnerDocument()->RemoveEventListener(Rml::EventId::Keydown, this); + GetOwnerDocument()->RemoveEventListener(Rml::EventId::Keyup, this); + } +} diff --git a/Samples/luainvaders/src/ElementGame.h b/Samples/luainvaders/src/ElementGame.h index 33dd029d4..37b832724 100644 --- a/Samples/luainvaders/src/ElementGame.h +++ b/Samples/luainvaders/src/ElementGame.h @@ -46,11 +46,12 @@ class ElementGame : public Rml::Element, public Rml::EventListener { /// Intercepts and handles key events. void ProcessEvent(Rml::Event& event) override; - /// Receive notifications when child elements are added - /// This will only get called when we're added to the tree, - /// which allows us to bind to onload + /// This will get called when we're added to the tree, which allows us to bind to events. void OnChildAdd(Rml::Element* element) override; + /// This will get called when we're removed from the tree, which allows us to clean up the event listeners previously added. + void OnChildRemove(Element* element) override; + protected: /// Updates the game. void OnUpdate() override;