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