#pragma once #include "../loader/Event.hpp" namespace cocos2d { class CCNode; } namespace geode { template concept InheritsCCNode = std::is_base_of_v; // Base class; exists so event listeners can be placed dynamically at runtime class GEODE_DLL AEnterLayerEvent : public Event { protected: std::string m_layerID; cocos2d::CCNode* m_layer; public: AEnterLayerEvent( std::string const& layerID, cocos2d::CCNode* layer ); std::string getID() const; cocos2d::CCNode* getLayer() const; }; class GEODE_DLL AEnterLayerEventHandler : public EventHandler { public: using Consumer = std::function; protected: Consumer m_consumer; std::optional m_targetID; public: PassThrough handle(AEnterLayerEvent* event) override; AEnterLayerEventHandler( std::optional const& id, Consumer handler ); }; template class EnterLayerEvent : public AEnterLayerEvent { public: EnterLayerEvent( std::string const& layerID, T* layer ) : AEnterLayerEvent(layerID, layer) {} T* getLayer() const { return static_cast(m_layer); } }; template concept InheritsEnterLayer = std::is_base_of_v, T>; template T> class EnterLayerEventHandler : public EventHandler> { public: using Consumer = std::function; protected: Consumer m_consumer; std::optional m_targetID; public: PassThrough handle(EnterLayerEvent* event) override { if (m_targetID == event->getID()) { m_consumer(static_cast(event)); } return PassThrough::Propagate; } EnterLayerEventHandler( std::optional const& id, Consumer handler ) : m_targetID(id), m_consumer(handler) {} }; }