From c629eaaa08c9a97540f830973dfa6bd4ceb06ba2 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Fri, 10 Apr 2026 01:38:12 +1000 Subject: [PATCH] fix: don't add delegate to layout until ready delay finish Also disable y anim if not ready --- modules/sidebar/NotifDockList.qml | 2 + modules/sidebar/NotifGroupList.qml | 2 + .../src/Caelestia/Components/lazylistview.cpp | 47 +++++++++++++++---- .../src/Caelestia/Components/lazylistview.hpp | 1 + 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/modules/sidebar/NotifDockList.qml b/modules/sidebar/NotifDockList.qml index d2dc4972..08752edc 100644 --- a/modules/sidebar/NotifDockList.qml +++ b/modules/sidebar/NotifDockList.qml @@ -120,6 +120,8 @@ LazyListView { } Behavior on y { + enabled: notif.LazyListView.ready + Anim { duration: Appearance.anim.durations.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial diff --git a/modules/sidebar/NotifGroupList.qml b/modules/sidebar/NotifGroupList.qml index 49330612..5f081a36 100644 --- a/modules/sidebar/NotifGroupList.qml +++ b/modules/sidebar/NotifGroupList.qml @@ -140,6 +140,8 @@ LazyListView { } Behavior on y { + enabled: notif.LazyListView.ready + Anim { duration: Appearance.anim.durations.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial diff --git a/plugin/src/Caelestia/Components/lazylistview.cpp b/plugin/src/Caelestia/Components/lazylistview.cpp index 653fe97b..c9291cfd 100644 --- a/plugin/src/Caelestia/Components/lazylistview.cpp +++ b/plugin/src/Caelestia/Components/lazylistview.cpp @@ -344,23 +344,52 @@ void LazyListView::updatePolish() { if (!m_componentComplete || !m_model || !m_delegate) return; - // Flush pending inserts from the previous frame — make items visible - // and clear the adding flag so enter animations begin. + // Flush pending inserts — make items visible and clear the adding flag + // so enter animations begin. When readyDelay > 0 the entire insert is + // deferred so delegates have time to lay out before appearing. for (auto& entry : m_delegates) { if (!entry.pendingInsert || !entry.item) continue; + + if (m_readyDelay > 0) { + if (!entry.readyDelayStarted) { + entry.readyDelayStarted = true; + auto* item = entry.item; + QTimer::singleShot(m_readyDelay, this, [this, item] { + auto indexIt = m_itemToIndex.find(item); + if (indexIt == m_itemToIndex.end()) + return; + const int idx = indexIt.value(); + auto it = m_delegates.find(idx); + if (it == m_delegates.end() || it->item != item || !it->pendingInsert) + return; + + it->pendingInsert = false; + it->readyDelayStarted = false; + + // Position correctly before making visible + if (idx >= 0 && idx < static_cast(m_layout.size())) + item->setY(m_layout[idx].targetY - m_contentY); + + item->setVisible(true); + auto* att = + qobject_cast(qmlAttachedPropertiesObject(item, false)); + if (att) { + att->setAdding(false); + att->setReady(true); + } + polish(); + }); + } + continue; + } + entry.pendingInsert = false; entry.item->setVisible(true); auto* att = qobject_cast(qmlAttachedPropertiesObject(entry.item, false)); if (att) { att->setAdding(false); - if (m_readyDelay > 0) { - QTimer::singleShot(m_readyDelay, att, [att] { - att->setReady(true); - }); - } else { - att->setReady(true); - } + att->setReady(true); } } diff --git a/plugin/src/Caelestia/Components/lazylistview.hpp b/plugin/src/Caelestia/Components/lazylistview.hpp index a027d19a..e0746db2 100644 --- a/plugin/src/Caelestia/Components/lazylistview.hpp +++ b/plugin/src/Caelestia/Components/lazylistview.hpp @@ -177,6 +177,7 @@ private: QQuickItem* item = nullptr; bool pendingRemoval = false; bool pendingInsert = false; + bool readyDelayStarted = false; }; // Layout