mirror of
https://github.com/hyprwm/hyprutils.git
synced 2025-05-13 13:50:44 +01:00
animation: only store a single WP to animationmgr signals
This commit is contained in:
parent
27d35e8d08
commit
60dbdc46cc
4 changed files with 32 additions and 39 deletions
|
@ -12,6 +12,12 @@ namespace Hyprutils {
|
||||||
namespace Animation {
|
namespace Animation {
|
||||||
class CAnimationManager;
|
class CAnimationManager;
|
||||||
|
|
||||||
|
struct SAnimVarEvents {
|
||||||
|
Signal::CSignal connect;
|
||||||
|
Signal::CSignal forceDisconnect;
|
||||||
|
Signal::CSignal lazyDisconnect;
|
||||||
|
};
|
||||||
|
|
||||||
/* A base class for animated variables. */
|
/* A base class for animated variables. */
|
||||||
class CBaseAnimatedVariable {
|
class CBaseAnimatedVariable {
|
||||||
public:
|
public:
|
||||||
|
@ -94,12 +100,6 @@ namespace Hyprutils {
|
||||||
|
|
||||||
Memory::CWeakPointer<CBaseAnimatedVariable> m_pSelf;
|
Memory::CWeakPointer<CBaseAnimatedVariable> m_pSelf;
|
||||||
|
|
||||||
struct {
|
|
||||||
Memory::CWeakPointer<Signal::CSignal> connect;
|
|
||||||
Memory::CWeakPointer<Signal::CSignal> forceDisconnect;
|
|
||||||
Memory::CWeakPointer<Signal::CSignal> lazyDisconnect;
|
|
||||||
} m_sEvents;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Memory::CWeakPointer<SAnimationPropertyConfig> m_pConfig;
|
Memory::CWeakPointer<SAnimationPropertyConfig> m_pConfig;
|
||||||
|
|
||||||
|
@ -111,6 +111,8 @@ namespace Hyprutils {
|
||||||
// getCurveValue is only used once in Hyprland. So either remove it or just pass pAnimationManager as a param.
|
// getCurveValue is only used once in Hyprland. So either remove it or just pass pAnimationManager as a param.
|
||||||
CAnimationManager* m_pAnimationManager = nullptr;
|
CAnimationManager* m_pAnimationManager = nullptr;
|
||||||
|
|
||||||
|
Memory::CWeakPointer<SAnimVarEvents> m_events;
|
||||||
|
|
||||||
bool m_bRemoveEndAfterRan = true;
|
bool m_bRemoveEndAfterRan = true;
|
||||||
bool m_bRemoveBeginAfterRan = true;
|
bool m_bRemoveBeginAfterRan = true;
|
||||||
|
|
||||||
|
|
|
@ -25,10 +25,6 @@ namespace Hyprutils {
|
||||||
virtual void scheduleTick() = 0;
|
virtual void scheduleTick() = 0;
|
||||||
virtual void onTicked() = 0;
|
virtual void onTicked() = 0;
|
||||||
|
|
||||||
void connectListener(std::any data);
|
|
||||||
void lazyDisconnectListener(std::any data);
|
|
||||||
void forceDisconnectListener(std::any data);
|
|
||||||
|
|
||||||
void addBezierWithName(std::string, const Math::Vector2D&, const Math::Vector2D&);
|
void addBezierWithName(std::string, const Math::Vector2D&, const Math::Vector2D&);
|
||||||
void removeAllBeziers();
|
void removeAllBeziers();
|
||||||
|
|
||||||
|
@ -45,18 +41,17 @@ namespace Hyprutils {
|
||||||
bool m_bTickScheduled = false;
|
bool m_bTickScheduled = false;
|
||||||
uint32_t m_pendingDisconnects = 0;
|
uint32_t m_pendingDisconnects = 0;
|
||||||
|
|
||||||
|
void connectListener(std::any data);
|
||||||
|
void lazyDisconnectListener(std::any data);
|
||||||
|
void forceDisconnectListener(std::any data);
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
Signal::CHyprSignalListener connect;
|
Signal::CHyprSignalListener connect;
|
||||||
Signal::CHyprSignalListener forceDisconnect;
|
Signal::CHyprSignalListener forceDisconnect;
|
||||||
Signal::CHyprSignalListener lazyDisconnect;
|
Signal::CHyprSignalListener lazyDisconnect;
|
||||||
} m_sListeners;
|
} m_sListeners;
|
||||||
|
|
||||||
struct {
|
Memory::CSharedPointer<SAnimVarEvents> m_events;
|
||||||
// Those events are shared between animated vars
|
|
||||||
Memory::CSharedPointer<Signal::CSignal> connect;
|
|
||||||
Memory::CSharedPointer<Signal::CSignal> forceDisconnect;
|
|
||||||
Memory::CSharedPointer<Signal::CSignal> lazyDisconnect;
|
|
||||||
} m_sEvents;
|
|
||||||
|
|
||||||
friend class CBaseAnimatedVariable;
|
friend class CBaseAnimatedVariable;
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,9 +13,7 @@ void CBaseAnimatedVariable::create(Hyprutils::Animation::CAnimationManager* pAni
|
||||||
m_Type = typeInfo;
|
m_Type = typeInfo;
|
||||||
m_pSelf = pSelf;
|
m_pSelf = pSelf;
|
||||||
|
|
||||||
m_sEvents.connect = pAnimationManager->m_sEvents.connect;
|
m_events = pAnimationManager->m_events;
|
||||||
m_sEvents.forceDisconnect = pAnimationManager->m_sEvents.forceDisconnect;
|
|
||||||
m_sEvents.lazyDisconnect = pAnimationManager->m_sEvents.lazyDisconnect;
|
|
||||||
|
|
||||||
m_bDummy = false;
|
m_bDummy = false;
|
||||||
}
|
}
|
||||||
|
@ -24,15 +22,15 @@ void CBaseAnimatedVariable::connectToActive() {
|
||||||
if (m_bDummy || m_bIsConnectedToActive)
|
if (m_bDummy || m_bIsConnectedToActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (const auto CONNECT = m_sEvents.connect.lock()) {
|
if (const auto PEVENTS = m_events.lock()) {
|
||||||
CONNECT->emit(m_pSelf.lock());
|
PEVENTS->connect.emit(m_pSelf.lock());
|
||||||
m_bIsConnectedToActive = true;
|
m_bIsConnectedToActive = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBaseAnimatedVariable::disconnectFromActive() {
|
void CBaseAnimatedVariable::disconnectFromActive() {
|
||||||
if (const auto DISCONNECT = m_sEvents.forceDisconnect.lock())
|
if (const auto PEVENTS = m_events.lock())
|
||||||
DISCONNECT->emit(static_cast<void*>(this));
|
PEVENTS->forceDisconnect.emit(static_cast<void*>(this));
|
||||||
|
|
||||||
m_bIsConnectedToActive = false;
|
m_bIsConnectedToActive = false;
|
||||||
}
|
}
|
||||||
|
@ -85,7 +83,7 @@ float CBaseAnimatedVariable::getCurveValue() const {
|
||||||
|
|
||||||
// Guard against m_pAnimationManager being deleted
|
// Guard against m_pAnimationManager being deleted
|
||||||
// TODO: Remove this and m_pAnimationManager
|
// TODO: Remove this and m_pAnimationManager
|
||||||
if (m_sEvents.connect.expired()) {
|
if (m_events.expired()) {
|
||||||
return 1.f;
|
return 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +106,7 @@ float CBaseAnimatedVariable::getCurveValue() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CBaseAnimatedVariable::ok() const {
|
bool CBaseAnimatedVariable::ok() const {
|
||||||
return m_pConfig && !m_bDummy;
|
return m_pConfig && !m_bDummy && !m_events.expired();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBaseAnimatedVariable::onUpdate() {
|
void CBaseAnimatedVariable::onUpdate() {
|
||||||
|
@ -144,8 +142,8 @@ void CBaseAnimatedVariable::resetAllCallbacks() {
|
||||||
void CBaseAnimatedVariable::onAnimationEnd() {
|
void CBaseAnimatedVariable::onAnimationEnd() {
|
||||||
m_bIsBeingAnimated = false;
|
m_bIsBeingAnimated = false;
|
||||||
/* lazy disconnect, since this animvar is atill alive */
|
/* lazy disconnect, since this animvar is atill alive */
|
||||||
if (const auto DISCONNECT = m_sEvents.lazyDisconnect.lock())
|
if (const auto PEVENTS = m_events.lock())
|
||||||
DISCONNECT->emit(static_cast<void*>(this));
|
PEVENTS->lazyDisconnect.emit(static_cast<void*>(this));
|
||||||
|
|
||||||
if (m_fEndCallback) {
|
if (m_fEndCallback) {
|
||||||
/* loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. */
|
/* loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. */
|
||||||
|
|
|
@ -14,13 +14,11 @@ CAnimationManager::CAnimationManager() {
|
||||||
BEZIER->setup(DEFAULTBEZIERPOINTS);
|
BEZIER->setup(DEFAULTBEZIERPOINTS);
|
||||||
m_mBezierCurves["default"] = BEZIER;
|
m_mBezierCurves["default"] = BEZIER;
|
||||||
|
|
||||||
m_sEvents.connect = makeShared<CSignal>();
|
m_events = makeShared<SAnimVarEvents>();
|
||||||
m_sEvents.forceDisconnect = makeShared<CSignal>();
|
|
||||||
m_sEvents.lazyDisconnect = makeShared<CSignal>();
|
|
||||||
|
|
||||||
m_sListeners.connect = m_sEvents.connect->registerListener([this](std::any data) { connectListener(data); });
|
m_sListeners.connect = m_events->connect.registerListener([this](std::any data) { connectListener(data); });
|
||||||
m_sListeners.forceDisconnect = m_sEvents.forceDisconnect->registerListener([this](std::any data) { forceDisconnectListener(data); });
|
m_sListeners.forceDisconnect = m_events->forceDisconnect.registerListener([this](std::any data) { forceDisconnectListener(data); });
|
||||||
m_sListeners.lazyDisconnect = m_sEvents.lazyDisconnect->registerListener([this](std::any data) { lazyDisconnectListener(data); });
|
m_sListeners.lazyDisconnect = m_events->lazyDisconnect.registerListener([this](std::any data) { lazyDisconnectListener(data); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimationManager::connectListener(std::any data) {
|
void CAnimationManager::connectListener(std::any data) {
|
||||||
|
|
Loading…
Reference in a new issue