From 0416032a7c2f2fdab2abdd262a4e4f8a5c6dcea5 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 26 Jul 2025 17:28:03 -0700 Subject: [PATCH] core/reloader: trigger postReload with a signal A signal is now used over the previous tree-searching method as some QML components such as Repeater fail to reparent created children to themselves, which breaks the tree. --- src/core/generation.cpp | 5 +++-- src/core/generation.hpp | 1 + src/core/reload.cpp | 14 +++++++++----- src/core/reload.hpp | 4 ++-- src/core/singleton.cpp | 6 ------ src/core/singleton.hpp | 1 - 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/core/generation.cpp b/src/core/generation.cpp index 54a1b869..fee94416 100644 --- a/src/core/generation.cpp +++ b/src/core/generation.cpp @@ -161,8 +161,9 @@ void EngineGeneration::postReload() { if (this->engine == nullptr || this->root == nullptr) return; QsEnginePlugin::runOnReload(); - PostReloadHook::postReloadTree(this->root); - this->singletonRegistry.onPostReload(); + + emit this->firePostReload(); + QObject::disconnect(this, &EngineGeneration::firePostReload, nullptr, nullptr); } void EngineGeneration::setWatchingFiles(bool watching) { diff --git a/src/core/generation.hpp b/src/core/generation.hpp index 5d3c5c65..3c0c4ae5 100644 --- a/src/core/generation.hpp +++ b/src/core/generation.hpp @@ -75,6 +75,7 @@ public: signals: void filesChanged(); void reloadFinished(); + void firePostReload(); public slots: void quit(); diff --git a/src/core/reload.cpp b/src/core/reload.cpp index 0bdf8fcb..ea2abbf6 100644 --- a/src/core/reload.cpp +++ b/src/core/reload.cpp @@ -129,14 +129,18 @@ QObject* Reloadable::getChildByReloadId(QObject* parent, const QString& reloadId void PostReloadHook::componentComplete() { auto* engineGeneration = EngineGeneration::findObjectGeneration(this); if (!engineGeneration || engineGeneration->reloadComplete) this->postReload(); + else { + // disconnected by EngineGeneration::postReload + QObject::connect( + engineGeneration, + &EngineGeneration::firePostReload, + this, + &PostReloadHook::postReload + ); + } } void PostReloadHook::postReload() { this->isPostReload = true; this->onPostReload(); } - -void PostReloadHook::postReloadTree(QObject* root) { - for (auto* child: root->children()) PostReloadHook::postReloadTree(child); - if (auto* self = dynamic_cast(root)) self->postReload(); -} diff --git a/src/core/reload.hpp b/src/core/reload.hpp index 0ed34eea..ae5d7c92 100644 --- a/src/core/reload.hpp +++ b/src/core/reload.hpp @@ -131,10 +131,10 @@ public: void classBegin() override {} void componentComplete() override; - void postReload(); virtual void onPostReload() = 0; - static void postReloadTree(QObject* root); +public slots: + void postReload(); protected: bool isPostReload = false; diff --git a/src/core/singleton.cpp b/src/core/singleton.cpp index 61ac9927..15668c98 100644 --- a/src/core/singleton.cpp +++ b/src/core/singleton.cpp @@ -51,9 +51,3 @@ void SingletonRegistry::onReload(SingletonRegistry* old) { singleton->reload(old == nullptr ? nullptr : old->registry.value(url)); } } - -void SingletonRegistry::onPostReload() { - for (auto* singleton: this->registry.values()) { - PostReloadHook::postReloadTree(singleton); - } -} diff --git a/src/core/singleton.hpp b/src/core/singleton.hpp index e63ab128..200c97f1 100644 --- a/src/core/singleton.hpp +++ b/src/core/singleton.hpp @@ -26,7 +26,6 @@ public: void registerSingleton(const QUrl& url, Singleton* singleton); void onReload(SingletonRegistry* old); - void onPostReload(); private: QHash registry;