From 190bd64c8ddac4b1a45ce59873c2cd0f8bdfb463 Mon Sep 17 00:00:00 2001 From: Felix Salcher Date: Tue, 3 Jun 2025 12:34:04 +0200 Subject: [PATCH] add pendingResourceID to enable smoother input copied from Label --- src/renderer/widgets/PasswordInputField.cpp | 26 ++++++++++++++++++++- src/renderer/widgets/PasswordInputField.hpp | 3 +++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/renderer/widgets/PasswordInputField.cpp b/src/renderer/widgets/PasswordInputField.cpp index cfd13ba..42256cc 100644 --- a/src/renderer/widgets/PasswordInputField.cpp +++ b/src/renderer/widgets/PasswordInputField.cpp @@ -176,6 +176,29 @@ void CPasswordInputField::updateDots() { *dots.currentAmount = passwordLength; } +static void onAssetCallback(WP ref) { + if (auto PINPUT = ref.lock(); PINPUT) + PINPUT->renderPasswordUpdate(); +} + +void CPasswordInputField::renderPasswordUpdate() { + auto newAsset = g_pRenderer->asyncResourceGatherer->getAssetByID(password.pendingResourceID); + if (newAsset) { + // new asset is ready :D + g_pRenderer->asyncResourceGatherer->unloadAsset(password.asset); + password.asset = newAsset; + password.resourceID = password.pendingResourceID; + password.pendingResourceID = ""; + } else { + Debug::log(WARN, "Asset {} not available after the asyncResourceGatherer's callback!", password.pendingResourceID); + + g_pHyprlock->addTimer(std::chrono::milliseconds(100), [REF = m_self](auto, auto) { onAssetCallback(REF); }, nullptr); + return; + } + + g_pHyprlock->renderOutput(outputStringPort); +} + void CPasswordInputField::updatePassword() { std::string passwordContent = g_pHyprlock->getPasswordBuffer(); if (passwordContent == password.content) { @@ -191,8 +214,9 @@ void CPasswordInputField::updatePassword() { request.props["font_family"] = fontFamily; request.props["color"] = colorConfig.font; request.props["font_size"] = (int)(std::nearbyint(configSize.y * password.size * 0.5f) * 2.f); + request.callback = [REF = m_self]() { onAssetCallback(REF); }; - password.resourceID = textResourceID; + password.pendingResourceID = textResourceID; g_pRenderer->asyncResourceGatherer->requestAsyncAssetPreload(request); } diff --git a/src/renderer/widgets/PasswordInputField.hpp b/src/renderer/widgets/PasswordInputField.hpp index 150d17a..ffb54be 100644 --- a/src/renderer/widgets/PasswordInputField.hpp +++ b/src/renderer/widgets/PasswordInputField.hpp @@ -29,6 +29,8 @@ class CPasswordInputField : public IWidget { void reset(); void onFadeOutTimer(); + void renderPasswordUpdate(); + private: WP m_self; @@ -76,6 +78,7 @@ class CPasswordInputField : public IWidget { float size = 0; std::string content; std::string resourceID; + std::string pendingResourceID; SPreloadedAsset* asset = nullptr; } password;