From 8efee586d53642f75d99e9edb8a95e89a3417374 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sun, 3 Mar 2024 23:11:28 +0100 Subject: [PATCH 1/2] input-field: add fade out timeout --- src/config/ConfigManager.cpp | 2 ++ src/renderer/widgets/PasswordInputField.cpp | 38 ++++++++++++++++++--- src/renderer/widgets/PasswordInputField.hpp | 4 +++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 64864109..df28e0c1 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -62,6 +62,7 @@ void CConfigManager::init() { m_config.addSpecialConfigValue("input-field", "dots_center", Hyprlang::INT{1}); m_config.addSpecialConfigValue("input-field", "dots_spacing", Hyprlang::FLOAT{0.2}); m_config.addSpecialConfigValue("input-field", "fade_on_empty", Hyprlang::INT{1}); + m_config.addSpecialConfigValue("input-field", "fade_timeout", Hyprlang::INT{1000}); m_config.addSpecialConfigValue("input-field", "font_color", Hyprlang::INT{0xFF000000}); m_config.addSpecialConfigValue("input-field", "halign", Hyprlang::STRING{"center"}); m_config.addSpecialConfigValue("input-field", "valign", Hyprlang::STRING{"center"}); @@ -136,6 +137,7 @@ std::vector CConfigManager::getWidgetConfigs() { {"dots_spacing", m_config.getSpecialConfigValue("input-field", "dots_spacing", k.c_str())}, {"dots_center", m_config.getSpecialConfigValue("input-field", "dots_center", k.c_str())}, {"fade_on_empty", m_config.getSpecialConfigValue("input-field", "fade_on_empty", k.c_str())}, + {"fade_timeout", m_config.getSpecialConfigValue("input-field", "fade_timeout", k.c_str())}, {"font_color", m_config.getSpecialConfigValue("input-field", "font_color", k.c_str())}, {"halign", m_config.getSpecialConfigValue("input-field", "halign", k.c_str())}, {"valign", m_config.getSpecialConfigValue("input-field", "valign", k.c_str())}, diff --git a/src/renderer/widgets/PasswordInputField.cpp b/src/renderer/widgets/PasswordInputField.cpp index a5b66e0b..d94fc58f 100644 --- a/src/renderer/widgets/PasswordInputField.cpp +++ b/src/renderer/widgets/PasswordInputField.cpp @@ -12,6 +12,7 @@ CPasswordInputField::CPasswordInputField(const Vector2D& viewport_, const std::u dt_space = std::any_cast(props.at("dots_spacing")); dots.center = std::any_cast(props.at("dots_center")); fadeOnEmpty = std::any_cast(props.at("fade_on_empty")); + fadeTimeoutMs = std::any_cast(props.at("fade_timeout")); font = std::any_cast(props.at("font_color")); pos = std::any_cast(props.at("position")); hiddenInputState.enabled = std::any_cast(props.at("hide_input")); @@ -35,6 +36,29 @@ CPasswordInputField::CPasswordInputField(const Vector2D& viewport_, const std::u } } +static void fadeOutCallback(std::shared_ptr self, void* data) { + CPasswordInputField* p = (CPasswordInputField*)data; + + p->onFadeOutTimer(); + + for (auto& o : g_pHyprlock->m_vOutputs) { + o->sessionLockSurface->render(); + } +} + +void CPasswordInputField::onFadeOutTimer() { + const auto PASSLEN = g_pHyprlock->getPasswordBufferLen(); + + if (PASSLEN == 0 && fade.a != 0.0 && (!fade.animated || fade.appearing)) { + fade.a = 1.0; + fade.animated = true; + fade.appearing = false; + fade.start = std::chrono::system_clock::now(); + } + + fade.timer = nullptr; +} + void CPasswordInputField::updateFade() { const auto PASSLEN = g_pHyprlock->getPasswordBufferLen(); @@ -44,10 +68,14 @@ void CPasswordInputField::updateFade() { } if (PASSLEN == 0 && fade.a != 0.0 && (!fade.animated || fade.appearing)) { - fade.a = 1.0; - fade.animated = true; - fade.appearing = false; - fade.start = std::chrono::system_clock::now(); + if (fadeTimeoutMs != 0 && fade.timer == nullptr) { + fade.timer = g_pHyprlock->addTimer(std::chrono::milliseconds(fadeTimeoutMs), fadeOutCallback, this); + } else if (fadeTimeoutMs == 0) { + fade.a = 1.0; + fade.animated = true; + fade.appearing = false; + fade.start = std::chrono::system_clock::now(); + } } else if (PASSLEN > 0 && fade.a != 1.0 && (!fade.animated || !fade.appearing)) { fade.a = 0.0; fade.animated = true; @@ -199,7 +227,7 @@ bool CPasswordInputField::draw(const SRenderData& data) { forceReload = true; } - return dots.currentAmount != PASSLEN || data.opacity < 1.0 || forceReload; + return dots.currentAmount != PASSLEN || fade.animated || forceReload; } void CPasswordInputField::updateFailTex() { diff --git a/src/renderer/widgets/PasswordInputField.hpp b/src/renderer/widgets/PasswordInputField.hpp index ae4e8c1f..f095fd2f 100644 --- a/src/renderer/widgets/PasswordInputField.hpp +++ b/src/renderer/widgets/PasswordInputField.hpp @@ -3,6 +3,7 @@ #include "IWidget.hpp" #include "../../helpers/Vector2D.hpp" #include "../../helpers/Color.hpp" +#include "../../core/Timer.hpp" #include #include #include @@ -15,6 +16,7 @@ class CPasswordInputField : public IWidget { CPasswordInputField(const Vector2D& viewport, const std::unordered_map& props); virtual bool draw(const SRenderData& data); + void onFadeOutTimer(); private: void updateDots(); @@ -44,6 +46,7 @@ class CPasswordInputField : public IWidget { float a = 0; bool appearing = true; bool animated = false; + std::shared_ptr timer; } fade; struct { @@ -63,4 +66,5 @@ class CPasswordInputField : public IWidget { } hiddenInputState; bool fadeOnEmpty; + long fadeTimeoutMs; }; From d46d437503f27558d6280b8ebffcae9856801715 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sun, 3 Mar 2024 23:12:50 +0100 Subject: [PATCH 2/2] input-field: let dots reset themselfs Now the dots kind of fade into the placeholder text on a failure. --- src/renderer/widgets/PasswordInputField.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/renderer/widgets/PasswordInputField.cpp b/src/renderer/widgets/PasswordInputField.cpp index d94fc58f..0c7a89e8 100644 --- a/src/renderer/widgets/PasswordInputField.cpp +++ b/src/renderer/widgets/PasswordInputField.cpp @@ -105,11 +105,6 @@ void CPasswordInputField::updateDots() { dots.lastFrame = std::chrono::system_clock::now(); } - if (PASSLEN == 0 && !placeholder.failID.empty()) { - dots.currentAmount = PASSLEN; - return; - } - const auto DELTA = std::clamp((int)std::chrono::duration_cast(std::chrono::system_clock::now() - dots.lastFrame).count(), 0, 20000); const float TOADD = DELTA / 1000000.0 * dots.speedPerSecond;