From 5814d9b2a01c9c1d07fef023ad12196d49dd4780 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Fri, 20 Jan 2023 20:48:07 +0100 Subject: make hyprerror follow fadein anim --- src/hyprerror/HyprError.cpp | 38 ++++++++++++++++++++++++++++++-------- src/hyprerror/HyprError.hpp | 18 ++++++++++++------ 2 files changed, 42 insertions(+), 14 deletions(-) (limited to 'src/hyprerror') diff --git a/src/hyprerror/HyprError.cpp b/src/hyprerror/HyprError.cpp index a0111c29..aff94a2d 100644 --- a/src/hyprerror/HyprError.cpp +++ b/src/hyprerror/HyprError.cpp @@ -1,6 +1,15 @@ #include "HyprError.hpp" #include "../Compositor.hpp" +CHyprError::CHyprError() { + m_fFadeOpacity.create(AVARTYPE_FLOAT, g_pConfigManager->getAnimationPropertyConfig("fadeIn"), nullptr, AVARDAMAGE_NONE); + m_fFadeOpacity.registerVar(); +} + +CHyprError::~CHyprError() { + m_fFadeOpacity.unregister(); +} + void CHyprError::queueCreate(std::string message, const CColor& color) { m_szQueued = message; m_cQueued = color; @@ -12,6 +21,9 @@ void CHyprError::createQueued() { m_tTexture.destroyTexture(); } + m_fFadeOpacity.setValueAndWarp(0.f); + m_fFadeOpacity = 1.f; + const auto PMONITOR = g_pCompositor->m_vMonitors.front().get(); const auto SCALE = PMONITOR->scale; @@ -40,6 +52,8 @@ void CHyprError::createQueued() { const double WIDTH = PMONITOR->vecPixelSize.x - PAD * 2; const double HEIGHT = (FONTSIZE + 2 * (FONTSIZE / 10.0)) * LINECOUNT + 3; + m_bDamageBox = {(int)PMONITOR->vecPosition.x, (int)PMONITOR->vecPosition.y, (int)PMONITOR->vecPixelSize.x, (int)HEIGHT + (int)PAD * 2}; + cairo_new_sub_path(CAIRO); cairo_arc(CAIRO, X + WIDTH - RADIUS, Y + RADIUS, RADIUS, -90 * DEGREES, 0 * DEGREES); cairo_arc(CAIRO, X + WIDTH - RADIUS, Y + HEIGHT - RADIUS, RADIUS, 0 * DEGREES, 90 * DEGREES); @@ -107,12 +121,17 @@ void CHyprError::draw() { } if (m_bQueuedDestroy) { - m_bQueuedDestroy = false; - m_tTexture.destroyTexture(); - m_bIsCreated = false; - m_szQueued = ""; - g_pHyprRenderer->damageMonitor(g_pCompositor->m_vMonitors.front().get()); - return; + if (!m_fFadeOpacity.isBeingAnimated()) { + if (m_fFadeOpacity.fl() == 0.f) { + m_bQueuedDestroy = false; + m_tTexture.destroyTexture(); + m_bIsCreated = false; + m_szQueued = ""; + return; + } else { + m_fFadeOpacity = 0.f; + } + } } const auto PMONITOR = g_pCompositor->m_vMonitors.front().get(); @@ -120,9 +139,12 @@ void CHyprError::draw() { if (g_pHyprOpenGL->m_RenderData.pMonitor != PMONITOR) return; // wrong mon - wlr_box windowBox = {0, 0, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y}; + wlr_box monbox = {0, 0, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y}; + + if (m_fFadeOpacity.isBeingAnimated()) + g_pHyprRenderer->damageBox(&m_bDamageBox); - g_pHyprOpenGL->renderTexture(m_tTexture, &windowBox, 1.f, 0); + g_pHyprOpenGL->renderTexture(m_tTexture, &monbox, m_fFadeOpacity.fl(), 0); } void CHyprError::destroy() { diff --git a/src/hyprerror/HyprError.hpp b/src/hyprerror/HyprError.hpp index 4d01e78d..26f90e40 100644 --- a/src/hyprerror/HyprError.hpp +++ b/src/hyprerror/HyprError.hpp @@ -2,22 +2,28 @@ #include "../defines.hpp" #include "../render/Texture.hpp" +#include "../helpers/AnimatedVariable.hpp" #include class CHyprError { public: + CHyprError(); + ~CHyprError(); + void queueCreate(std::string message, const CColor& color); void draw(); void destroy(); private: - void createQueued(); - std::string m_szQueued = ""; - CColor m_cQueued; - bool m_bQueuedDestroy = false; - bool m_bIsCreated = false; - CTexture m_tTexture; + void createQueued(); + std::string m_szQueued = ""; + CColor m_cQueued; + bool m_bQueuedDestroy = false; + bool m_bIsCreated = false; + CTexture m_tTexture; + CAnimatedVariable m_fFadeOpacity; + wlr_box m_bDamageBox = {0, 0, 0, 0}; }; inline std::unique_ptr g_pHyprError; // This is a full-screen error. Treat it with respect, and there can only be one at a time. \ No newline at end of file -- cgit v1.2.3