forked from quickshell/quickshell
		
	core: improve log format for QML errors and warnings
This commit is contained in:
		
							parent
							
								
									4472b27039
								
							
						
					
					
						commit
						ec433d1a70
					
				
					 3 changed files with 44 additions and 8 deletions
				
			
		| 
						 | 
					@ -8,11 +8,13 @@
 | 
				
			||||||
#include <qfileinfo.h>
 | 
					#include <qfileinfo.h>
 | 
				
			||||||
#include <qfilesystemwatcher.h>
 | 
					#include <qfilesystemwatcher.h>
 | 
				
			||||||
#include <qhash.h>
 | 
					#include <qhash.h>
 | 
				
			||||||
 | 
					#include <qlist.h>
 | 
				
			||||||
#include <qlogging.h>
 | 
					#include <qlogging.h>
 | 
				
			||||||
#include <qloggingcategory.h>
 | 
					#include <qloggingcategory.h>
 | 
				
			||||||
#include <qobject.h>
 | 
					#include <qobject.h>
 | 
				
			||||||
#include <qqmlcontext.h>
 | 
					#include <qqmlcontext.h>
 | 
				
			||||||
#include <qqmlengine.h>
 | 
					#include <qqmlengine.h>
 | 
				
			||||||
 | 
					#include <qqmlerror.h>
 | 
				
			||||||
#include <qqmlincubator.h>
 | 
					#include <qqmlincubator.h>
 | 
				
			||||||
#include <qtmetamacros.h>
 | 
					#include <qtmetamacros.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +26,10 @@
 | 
				
			||||||
#include "reload.hpp"
 | 
					#include "reload.hpp"
 | 
				
			||||||
#include "scan.hpp"
 | 
					#include "scan.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace {
 | 
				
			||||||
 | 
					Q_LOGGING_CATEGORY(logScene, "scene");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QHash<const QQmlEngine*, EngineGeneration*> g_generations; // NOLINT
 | 
					static QHash<const QQmlEngine*, EngineGeneration*> g_generations; // NOLINT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EngineGeneration::EngineGeneration(const QDir& rootPath, QmlScanner scanner)
 | 
					EngineGeneration::EngineGeneration(const QDir& rootPath, QmlScanner scanner)
 | 
				
			||||||
| 
						 | 
					@ -34,6 +40,9 @@ EngineGeneration::EngineGeneration(const QDir& rootPath, QmlScanner scanner)
 | 
				
			||||||
    , engine(new QQmlEngine()) {
 | 
					    , engine(new QQmlEngine()) {
 | 
				
			||||||
	g_generations.insert(this->engine, this);
 | 
						g_generations.insert(this->engine, this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this->engine->setOutputWarningsToStandardError(false);
 | 
				
			||||||
 | 
						QObject::connect(this->engine, &QQmlEngine::warnings, this, &EngineGeneration::onEngineWarnings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this->engine->addUrlInterceptor(&this->urlInterceptor);
 | 
						this->engine->addUrlInterceptor(&this->urlInterceptor);
 | 
				
			||||||
	this->engine->setNetworkAccessManagerFactory(&this->interceptNetFactory);
 | 
						this->engine->setNetworkAccessManagerFactory(&this->interceptNetFactory);
 | 
				
			||||||
	this->engine->setIncubationController(&this->delayedIncubationController);
 | 
						this->engine->setIncubationController(&this->delayedIncubationController);
 | 
				
			||||||
| 
						 | 
					@ -312,6 +321,22 @@ void EngineGeneration::incubationControllerDestroyed() {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void EngineGeneration::onEngineWarnings(const QList<QQmlError>& warnings) const {
 | 
				
			||||||
 | 
						for (const auto& error: warnings) {
 | 
				
			||||||
 | 
							auto rel = "**/" % this->rootPath.relativeFilePath(error.url().path());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							QString objectName;
 | 
				
			||||||
 | 
							auto desc = error.description();
 | 
				
			||||||
 | 
							if (auto i = desc.indexOf(": "); i != -1) {
 | 
				
			||||||
 | 
								objectName = desc.first(i);
 | 
				
			||||||
 | 
								desc = desc.sliced(i + 2);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qCWarning(logScene).noquote().nospace() << objectName << " at " << rel << '[' << error.line()
 | 
				
			||||||
 | 
							                                        << ':' << error.column() << "]: " << desc;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void EngineGeneration::registerExtension(const void* key, EngineGenerationExt* extension) {
 | 
					void EngineGeneration::registerExtension(const void* key, EngineGenerationExt* extension) {
 | 
				
			||||||
	if (this->extensions.contains(key)) {
 | 
						if (this->extensions.contains(key)) {
 | 
				
			||||||
		delete this->extensions.value(key);
 | 
							delete this->extensions.value(key);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,8 +4,10 @@
 | 
				
			||||||
#include <qdir.h>
 | 
					#include <qdir.h>
 | 
				
			||||||
#include <qfilesystemwatcher.h>
 | 
					#include <qfilesystemwatcher.h>
 | 
				
			||||||
#include <qhash.h>
 | 
					#include <qhash.h>
 | 
				
			||||||
 | 
					#include <qlist.h>
 | 
				
			||||||
#include <qobject.h>
 | 
					#include <qobject.h>
 | 
				
			||||||
#include <qqmlengine.h>
 | 
					#include <qqmlengine.h>
 | 
				
			||||||
 | 
					#include <qqmlerror.h>
 | 
				
			||||||
#include <qqmlincubator.h>
 | 
					#include <qqmlincubator.h>
 | 
				
			||||||
#include <qtclasshelpermacros.h>
 | 
					#include <qtclasshelpermacros.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,6 +84,7 @@ private slots:
 | 
				
			||||||
	void onFileChanged(const QString& name);
 | 
						void onFileChanged(const QString& name);
 | 
				
			||||||
	void onDirectoryChanged();
 | 
						void onDirectoryChanged();
 | 
				
			||||||
	void incubationControllerDestroyed();
 | 
						void incubationControllerDestroyed();
 | 
				
			||||||
 | 
						void onEngineWarnings(const QList<QQmlError>& warnings) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	void postReload();
 | 
						void postReload();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,6 @@
 | 
				
			||||||
#include "../window/floatingwindow.hpp"
 | 
					#include "../window/floatingwindow.hpp"
 | 
				
			||||||
#include "generation.hpp"
 | 
					#include "generation.hpp"
 | 
				
			||||||
#include "instanceinfo.hpp"
 | 
					#include "instanceinfo.hpp"
 | 
				
			||||||
#include "logging.hpp"
 | 
					 | 
				
			||||||
#include "qmlglobal.hpp"
 | 
					#include "qmlglobal.hpp"
 | 
				
			||||||
#include "scan.hpp"
 | 
					#include "scan.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +31,6 @@ RootWrapper::RootWrapper(QString rootPath, QString shellId)
 | 
				
			||||||
	this->reloadGraph(true);
 | 
						this->reloadGraph(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->generation == nullptr) {
 | 
						if (this->generation == nullptr) {
 | 
				
			||||||
		qCritical() << "could not create scene graph, exiting";
 | 
					 | 
				
			||||||
		exit(-1); // NOLINT
 | 
							exit(-1); // NOLINT
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -54,6 +52,7 @@ void RootWrapper::reloadGraph(bool hard) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// todo: move into EngineGeneration
 | 
						// todo: move into EngineGeneration
 | 
				
			||||||
	if (this->generation != nullptr) {
 | 
						if (this->generation != nullptr) {
 | 
				
			||||||
 | 
							qInfo() << "Reloading configuration...";
 | 
				
			||||||
		QuickshellSettings::reset();
 | 
							QuickshellSettings::reset();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,9 +64,17 @@ void RootWrapper::reloadGraph(bool hard) {
 | 
				
			||||||
	auto component = QQmlComponent(generation->engine, url);
 | 
						auto component = QQmlComponent(generation->engine, url);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!component.isReady()) {
 | 
						if (!component.isReady()) {
 | 
				
			||||||
		qCritical() << "Failed to load configuration:";
 | 
							qCritical() << "Failed to load configuration";
 | 
				
			||||||
		auto error = component.errorString().trimmed();
 | 
							QString errorString = "Failed to load configuration";
 | 
				
			||||||
		qCCritical(logBare).noquote() << error;
 | 
					
 | 
				
			||||||
 | 
							auto errors = component.errors();
 | 
				
			||||||
 | 
							for (auto& error: errors) {
 | 
				
			||||||
 | 
								auto rel = "**/" % rootPath.relativeFilePath(error.url().path());
 | 
				
			||||||
 | 
								auto msg = "  caused by " % rel % '[' % QString::number(error.line()) % ':'
 | 
				
			||||||
 | 
								         % QString::number(error.column()) % "]: " % error.description();
 | 
				
			||||||
 | 
								errorString += '\n' % msg;
 | 
				
			||||||
 | 
								qCritical().noquote() << msg;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto newFiles = generation->scanner.scannedFiles;
 | 
							auto newFiles = generation->scanner.scannedFiles;
 | 
				
			||||||
		generation->destroy();
 | 
							generation->destroy();
 | 
				
			||||||
| 
						 | 
					@ -80,15 +87,16 @@ void RootWrapper::reloadGraph(bool hard) {
 | 
				
			||||||
			auto showPopup = true;
 | 
								auto showPopup = true;
 | 
				
			||||||
			if (this->generation->qsgInstance != nullptr) {
 | 
								if (this->generation->qsgInstance != nullptr) {
 | 
				
			||||||
				this->generation->qsgInstance->clearReloadPopupInhibit();
 | 
									this->generation->qsgInstance->clearReloadPopupInhibit();
 | 
				
			||||||
				emit this->generation->qsgInstance->reloadFailed(error);
 | 
									emit this->generation->qsgInstance->reloadFailed(errorString);
 | 
				
			||||||
				showPopup = !this->generation->qsgInstance->isReloadPopupInhibited();
 | 
									showPopup = !this->generation->qsgInstance->isReloadPopupInhibited();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (showPopup) qs::ui::ReloadPopup::spawnPopup(InstanceInfo::CURRENT.instanceId, true, error);
 | 
								if (showPopup)
 | 
				
			||||||
 | 
									qs::ui::ReloadPopup::spawnPopup(InstanceInfo::CURRENT.instanceId, true, errorString);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (this->generation != nullptr && this->generation->qsgInstance != nullptr) {
 | 
							if (this->generation != nullptr && this->generation->qsgInstance != nullptr) {
 | 
				
			||||||
			emit this->generation->qsgInstance->reloadFailed(error);
 | 
								emit this->generation->qsgInstance->reloadFailed(errorString);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue