diff --git a/loader/include/Geode/ui/OverlayManager.hpp b/loader/include/Geode/ui/OverlayManager.hpp new file mode 100644 index 00000000..cb853163 --- /dev/null +++ b/loader/include/Geode/ui/OverlayManager.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include "../DefaultInclude.hpp" + +#include +#include +#include +#include + +namespace geode +{ + /* + Because cocos only allows for one notification node (a node drawn last, above the fps counter and everything), + I added this, a simple class to add nodes to a general notification node so that mods dont interfere with each other. + */ + + class GEODE_DLL OverlayManager : private cocos2d::CCNode + { + private: + std::vector nodes; + + public: + /// @brief Get the overlay manager instance, and if it doesnt exist, sets the notification node to it + static OverlayManager* get(); + + /// @brief Adds a node to the overlay manager, overlays are sorted by ZOrder, the higher the order is the later it draws. This will retain the node + void addNode(cocos2d::CCNode* node); + + /// @brief Removes a node from the overlay manager, stopping it from being drawn. This will release the node + void removeNode(cocos2d::CCNode* node); + + /// @brief Util to get the highest ZOrder of all nodes + int getHighestOverlayZOrder(); + + /// @brief Util to get the lowest ZOrder of all nodes + int getLowestOverlayZOrder(); + + /// @brief Gets all the overlays + std::vector getOverlays(); + }; +}; \ No newline at end of file diff --git a/loader/src/ui/nodes/OverlayManager.cpp b/loader/src/ui/nodes/OverlayManager.cpp new file mode 100644 index 00000000..c76131bb --- /dev/null +++ b/loader/src/ui/nodes/OverlayManager.cpp @@ -0,0 +1,62 @@ +#include + +using namespace geode::prelude; + +OverlayManager* OverlayManager::get() +{ + static OverlayManager* instance; + + if (!instance) + { + instance = new OverlayManager(); + + CCDirector::get()->setNotificationNode(instance); + } + + return instance; +} + +void OverlayManager::addNode(CCNode* node) +{ + this->addChild(node); + + nodes.push_back(node); +} + +void OverlayManager::removeNode(CCNode* node) +{ + this->removeChild(node); + + std::erase(nodes, node); +} + +int OverlayManager::getHighestOverlayZOrder() +{ + int z = INT_MIN; + + for (auto node : nodes) + { + if (node->getZOrder() > z) + z = node->getZOrder(); + } + + return z; +} + +int OverlayManager::getLowestOverlayZOrder() +{ + int z = INT_MAX; + + for (auto node : nodes) + { + if (node->getZOrder() < z) + z = node->getZOrder(); + } + + return z; +} + +std::vector OverlayManager::getOverlays() +{ + return nodes; +} \ No newline at end of file