mirror of
https://github.com/geode-sdk/geode.git
synced 2024-11-26 17:36:05 -05:00
Merge bd6bfb661f
into 22210956bb
This commit is contained in:
commit
47dd478724
2 changed files with 103 additions and 0 deletions
41
loader/include/Geode/ui/OverlayManager.hpp
Normal file
41
loader/include/Geode/ui/OverlayManager.hpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#pragma once
|
||||
|
||||
#include "../DefaultInclude.hpp"
|
||||
|
||||
#include <cocos2d.h>
|
||||
#include <vector>
|
||||
#include <span>
|
||||
#include <Geode/utils/cocos.hpp>
|
||||
|
||||
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<cocos2d::CCNode*> 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<cocos2d::CCNode*> getOverlays();
|
||||
};
|
||||
};
|
62
loader/src/ui/nodes/OverlayManager.cpp
Normal file
62
loader/src/ui/nodes/OverlayManager.cpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#include <Geode/ui/OverlayManager.hpp>
|
||||
|
||||
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<CCNode*> OverlayManager::getOverlays()
|
||||
{
|
||||
return nodes;
|
||||
}
|
Loading…
Reference in a new issue