forked from Shinonome/dots-hyprland
79 lines
2.6 KiB
QML
79 lines
2.6 KiB
QML
pragma Singleton
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import "root:/modules/common"
|
|
import "root:/modules/common/functions/file_utils.js" as FileUtils
|
|
import "root:/modules/common/functions/object_utils.js" as ObjectUtils
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
import Quickshell.Hyprland
|
|
import Qt.labs.platform
|
|
|
|
/**
|
|
* Loads and manages the shell configuration file.
|
|
* The config file is by default at XDG_CONFIG_HOME/illogical-impulse/config.json.
|
|
* Automatically reloaded when the file changes, but does not provide a way to save changes.
|
|
*/
|
|
Singleton {
|
|
id: root
|
|
property string filePath: Directories.shellConfigPath
|
|
property bool firstLoad: true
|
|
|
|
function loadConfig() {
|
|
configFileView.reload()
|
|
}
|
|
|
|
function applyConfig(fileContent) {
|
|
try {
|
|
const json = JSON.parse(fileContent);
|
|
|
|
ObjectUtils.applyToQtObject(ConfigOptions, json);
|
|
if (root.firstLoad) {
|
|
root.firstLoad = false;
|
|
} else {
|
|
Hyprland.dispatch(`exec notify-send "${qsTr("Shell configuration reloaded")}" "${root.filePath}"`)
|
|
}
|
|
} catch (e) {
|
|
console.error("[ConfigLoader] Error reading file:", e);
|
|
Hyprland.dispatch(`exec notify-send "${qsTr("Shell configuration failed to load")}" "${root.filePath}"`)
|
|
return;
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
id: delayedFileRead
|
|
interval: ConfigOptions.hacks.arbitraryRaceConditionDelay
|
|
repeat: false
|
|
running: false
|
|
onTriggered: {
|
|
root.applyConfig(configFileView.text())
|
|
}
|
|
}
|
|
|
|
FileView {
|
|
id: configFileView
|
|
path: Qt.resolvedUrl(root.filePath)
|
|
watchChanges: true
|
|
onFileChanged: {
|
|
console.log("[ConfigLoader] File changed, reloading...")
|
|
this.reload()
|
|
delayedFileRead.start()
|
|
}
|
|
onLoadedChanged: {
|
|
const fileContent = configFileView.text()
|
|
root.applyConfig(fileContent)
|
|
}
|
|
onLoadFailed: (error) => {
|
|
if(error == FileViewError.FileNotFound) {
|
|
console.log("[ConfigLoader] File not found, creating new file.")
|
|
const plainConfig = ObjectUtils.toPlainObject(ConfigOptions)
|
|
configFileView.setText(JSON.stringify(plainConfig, null, 2))
|
|
Hyprland.dispatch(`exec notify-send "${qsTr("Shell configuration created")}" "${root.filePath}"`)
|
|
} else {
|
|
Hyprland.dispatch(`exec notify-send "${qsTr("Shell configuration failed to load")}" "${root.filePath}"`)
|
|
}
|
|
}
|
|
}
|
|
}
|