mirror of
https://github.com/geode-sdk/geode.git
synced 2024-11-27 01:45:35 -05:00
Merge bd6bfb661f
into 6e11d0a6b0
This commit is contained in:
commit
468dea6346
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