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.
This commit is contained in:
outfoxxed 2025-07-26 17:28:03 -07:00
parent 1644ed5e19
commit 0416032a7c
Signed by untrusted user: outfoxxed
GPG key ID: 4C88A185FB89301E
6 changed files with 15 additions and 16 deletions

View file

@ -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) {

View file

@ -75,6 +75,7 @@ public:
signals:
void filesChanged();
void reloadFinished();
void firePostReload();
public slots:
void quit();

View file

@ -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<PostReloadHook*>(root)) self->postReload();
}

View file

@ -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;

View file

@ -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);
}
}

View file

@ -26,7 +26,6 @@ public:
void registerSingleton(const QUrl& url, Singleton* singleton);
void onReload(SingletonRegistry* old);
void onPostReload();
private:
QHash<QUrl, Singleton*> registry;