core/reloader: watch new files detected in failed reloads

This commit is contained in:
outfoxxed 2025-05-26 02:27:50 -07:00
parent e931b85464
commit 4472b27039
Signed by: outfoxxed
GPG key ID: 4C88A185FB89301E
3 changed files with 35 additions and 5 deletions

View file

@ -162,6 +162,11 @@ void EngineGeneration::setWatchingFiles(bool watching) {
this->watcher->addPath(QFileInfo(file).dir().absolutePath());
}
for (auto& file: this->extraWatchedFiles) {
this->watcher->addPath(file);
this->watcher->addPath(QFileInfo(file).dir().absolutePath());
}
QObject::connect(
this->watcher,
&QFileSystemWatcher::fileChanged,
@ -184,6 +189,22 @@ void EngineGeneration::setWatchingFiles(bool watching) {
}
}
bool EngineGeneration::setExtraWatchedFiles(const QVector<QString>& files) {
this->extraWatchedFiles.clear();
for (const auto& file: files) {
if (!this->scanner.scannedFiles.contains(file)) {
this->extraWatchedFiles.append(file);
}
}
if (this->watcher) {
this->setWatchingFiles(false);
this->setWatchingFiles(true);
}
return !this->extraWatchedFiles.isEmpty();
}
void EngineGeneration::onFileChanged(const QString& name) {
if (!this->watcher->files().contains(name)) {
this->deletedWatchedFiles.push_back(name);

View file

@ -36,6 +36,7 @@ public:
// assumes root has been initialized, consumes old generation
void onReload(EngineGeneration* old);
void setWatchingFiles(bool watching);
bool setExtraWatchedFiles(const QVector<QString>& files);
void registerIncubationController(QQmlIncubationController* controller);
void deregisterIncubationController(QQmlIncubationController* controller);
@ -61,6 +62,7 @@ public:
SingletonRegistry singletonRegistry;
QFileSystemWatcher* watcher = nullptr;
QVector<QString> deletedWatchedFiles;
QVector<QString> extraWatchedFiles;
DelayedQmlIncubationController delayedIncubationController;
bool reloadComplete = false;
QuickshellGlobal* qsgInstance = nullptr;

View file

@ -16,6 +16,7 @@
#include "../window/floatingwindow.hpp"
#include "generation.hpp"
#include "instanceinfo.hpp"
#include "logging.hpp"
#include "qmlglobal.hpp"
#include "scan.hpp"
@ -63,16 +64,20 @@ void RootWrapper::reloadGraph(bool hard) {
url.setScheme("qsintercept");
auto component = QQmlComponent(generation->engine, url);
auto* newRoot = component.beginCreate(generation->engine->rootContext());
if (!component.isReady()) {
qCritical() << "Failed to load configuration:";
auto error = component.errorString().trimmed();
qCCritical(logBare).noquote() << error;
if (newRoot == nullptr) {
const QString error = "failed to create root component\n" + component.errorString();
qWarning().noquote() << error;
auto newFiles = generation->scanner.scannedFiles;
generation->destroy();
if (this->generation != nullptr) {
auto showPopup = true;
if (this->generation->setExtraWatchedFiles(newFiles)) {
qInfo() << "Watching additional files picked up in reload for changes...";
}
auto showPopup = true;
if (this->generation->qsgInstance != nullptr) {
this->generation->qsgInstance->clearReloadPopupInhibit();
emit this->generation->qsgInstance->reloadFailed(error);
@ -89,6 +94,8 @@ void RootWrapper::reloadGraph(bool hard) {
return;
}
auto* newRoot = component.beginCreate(generation->engine->rootContext());
if (auto* item = qobject_cast<QQuickItem*>(newRoot)) {
auto* window = new FloatingWindowInterface();
item->setParent(window);