Fixing app templating after refactor

This commit is contained in:
ItsLemmy
2025-11-08 19:29:02 -05:00
parent 355271768c
commit 168bf54f41
28 changed files with 113 additions and 101 deletions
+5 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Ko-fi-Seite in Ihrem Browser geöffnet"
},
"matugen": {
"failed": "Matugen-Verarbeitung fehlgeschlagen",
"failed-general": "Matugen ist beim Verarbeiten der Vorlagen auf einen Fehler gestoßen"
},
"missing-control-center": {
"description": "Das Kontrollzentrum-Widget wurde aus der Leiste entfernt. Um es erneut über die Leiste zu öffnen, fügen Sie das Widget wieder hinzu. Sie können es auch durch Rechtsklick auf die Leiste öffnen.",
"label": "Letztes Kontrollzentrum-Widget entfernt"
@@ -1755,6 +1751,11 @@
"started": "Aufnahme gestartet",
"stopping": "Aufnahme wird gestoppt…"
},
"theming-processor-failed": {
"desc-generic": "Beim Verarbeiten von Vorlagen ist ein Fehler aufgetreten.",
"title-matugen": "Matugen-Templating-Verarbeitung fehlgeschlagen",
"title-predefined": "Die Verarbeitung des vordefinierten Farbschemas ist fehlgeschlagen."
},
"wallpaper-colors": {
"disabled": "Hintergrundbild-Farben deaktiviert",
"enabled": "Hintergrundbild-Farben aktiviert",
+6 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Ko-fi page opened in your browser"
},
"matugen": {
"failed": "Matugen processing failed",
"failed-general": "Matugen encountered an error while processing templates"
},
"missing-control-center": {
"description": "The Control Center widget has been removed from the bar. To access it from the bar again, you will need to re-add the widget. You can open it with right clicking on the bar too.",
"label": "Last Control Center widget removed"
@@ -1755,7 +1751,13 @@
"started": "Recording started",
"stopping": "Stopping recording…"
},
"theming-processor-failed": {
"desc-generic": "Encountered an error while processing templates",
"title-matugen": "Matugen templating processing failed",
"title-predefined": "Predefined color cheme processing failed"
},
"wallpaper-colors": {
"label": "Wallpaper colors generation",
"disabled": "Wallpaper colors disabled",
"enabled": "Wallpaper colors enabled",
"not-installed": "Matugen not installed - required for wallpaper color extraction"
+5 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Página de Ko-fi abierta en tu navegador"
},
"matugen": {
"failed": "Error en el procesamiento de Matugen",
"failed-general": "Matugen encontró un error al procesar las plantillas"
},
"missing-control-center": {
"description": "El widget del Centro de control se eliminó de la barra. Para acceder a él nuevamente desde la barra, debes volver a añadir el widget. También puedes abrirlo haciendo clic derecho en la barra.",
"label": "Se eliminó el último widget del Centro de control"
@@ -1755,6 +1751,11 @@
"started": "Grabación iniciada",
"stopping": "Deteniendo grabación..."
},
"theming-processor-failed": {
"desc-generic": "Se encontró un error al procesar las plantillas.",
"title-matugen": "Falló el procesamiento de la plantilla Matugen.",
"title-predefined": "Falló el procesamiento del esquema de color predefinido."
},
"wallpaper-colors": {
"disabled": "Colores del fondo de pantalla desactivados",
"enabled": "Colores del fondo de pantalla activados",
+5 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Page Ko-fi ouverte dans votre navigateur"
},
"matugen": {
"failed": "Échec du traitement Matugen",
"failed-general": "Matugen a rencontré une erreur lors du traitement des modèles"
},
"missing-control-center": {
"description": "Le widget du Centre de contrôle a été retiré de la barre. Pour y accéder à nouveau depuis la barre, veuillez ré‑ajouter le widget. Vous pouvez aussi l'ouvrir en cliquant avec le bouton droit sur la barre.",
"label": "Dernier widget du Centre de contrôle supprimé"
@@ -1755,6 +1751,11 @@
"started": "Enregistrement démarré",
"stopping": "Arrêt de l'enregistrement..."
},
"theming-processor-failed": {
"desc-generic": "Une erreur s'est produite lors du traitement des modèles.",
"title-matugen": "Le traitement du modèle Matugen a échoué.",
"title-predefined": "Le traitement du schéma de couleurs prédéfini a échoué."
},
"wallpaper-colors": {
"disabled": "Couleurs du fond d'écran désactivées",
"enabled": "Couleurs du fond d'écran activées",
+5 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Página do Ko-fi aberta no seu navegador"
},
"matugen": {
"failed": "Falha no processamento do Matugen",
"failed-general": "Matugen encontrou um erro ao processar os modelos"
},
"missing-control-center": {
"description": "O widget da Central de Controle foi removido da barra. Para acessá-lo novamente pela barra, adicione o widget novamente. Você também pode abri-lo clicando com o botão direito na barra.",
"label": "Último widget da Central de Controle removido"
@@ -1755,6 +1751,11 @@
"started": "Gravação iniciada",
"stopping": "Parando gravação…"
},
"theming-processor-failed": {
"desc-generic": "Ocorreu um erro ao processar os templates.",
"title-matugen": "Falha no processamento do template Matugen",
"title-predefined": "O processamento do esquema de cores predefinido falhou."
},
"wallpaper-colors": {
"disabled": "Cores do papel de parede desativadas",
"enabled": "Cores do papel de parede ativadas",
+5 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Ko-fi sayfası tarayıcınızda açıldı"
},
"matugen": {
"failed": "Matugen işlemi başarısız oldu",
"failed-general": "Matugen şablonları işlerken bir hata ile karşılaştı"
},
"missing-control-center": {
"description": "Kontrol Merkezi widget'ı çubuktan kaldırıldı. Çubuktan tekrar erişmek için widget'ı yeniden eklemeniz gerekecek. Çubuğa sağ tıklayarak da açabilirsiniz.",
"label": "Son Kontrol Merkezi widget'ı kaldırıldı"
@@ -1755,6 +1751,11 @@
"started": "Kayıt başladı",
"stopping": "Kayıt durduruluyor..."
},
"theming-processor-failed": {
"desc-generic": "Şablonlar işlenirken bir hatayla karşılaşıldı.",
"title-matugen": "Matugen şablon işleme başarısız oldu.",
"title-predefined": "Önceden tanımlanmış renk şeması işleme başarısız oldu."
},
"wallpaper-colors": {
"disabled": "Duvar kağıdı renkleri devre dışı",
"enabled": "Duvar kağıdı renkleri etkin",
+5 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Сторінка Ko-fi відкрита у вашому браузері"
},
"matugen": {
"failed": "Помилка обробки Matugen",
"failed-general": "Matugen зіткнувся з помилкою під час обробки шаблонів"
},
"missing-control-center": {
"description": "Віджет Центру керування видалено з панелі. Щоб знову отримати до нього доступ з панелі, вам потрібно повторно додати віджет. Ви також можете відкрити його, клацнувши правою кнопкою миші на панелі.",
"label": "Останній віджет Центру керування видалено"
@@ -1755,6 +1751,11 @@
"started": "Запис розпочато",
"stopping": "Зупинка запису…"
},
"theming-processor-failed": {
"desc-generic": "Виникла помилка під час обробки шаблонів.",
"title-matugen": "Помилка обробки шаблонів Matugen",
"title-predefined": "Помилка обробки попередньо визначеної колірної схеми"
},
"wallpaper-colors": {
"disabled": "Кольори шпалер вимкнено",
"enabled": "Кольори шпалер увімкнено",
+5 -4
View File
@@ -1719,10 +1719,6 @@
"kofi": {
"opened": "Ko-fi页面已在您的浏览器中打开"
},
"matugen": {
"failed": "Matugen 处理失败",
"failed-general": "Matugen 在处理模板时遇到错误"
},
"missing-control-center": {
"description": "控制中心小部件已从状态栏中移除。要再次从状态栏访问它,您需要重新添加小部件。您也可以通过右键点击状态栏来打开它。",
"label": "最后一个控制中心小部件已移除"
@@ -1755,6 +1751,11 @@
"started": "录制已开始",
"stopping": "正在停止录制…"
},
"theming-processor-failed": {
"desc-generic": "处理模板时遇到错误",
"title-matugen": "Matugen模板处理失败",
"title-predefined": "预定义的颜色方案处理失败"
},
"wallpaper-colors": {
"disabled": "壁纸颜色已禁用",
"enabled": "壁纸颜色已启用",
+6 -6
View File
@@ -257,17 +257,17 @@
"wezterm": false,
"fuzzel": false,
"discord": false,
"pywalfox": false,
"vicinae": false,
"walker": false,
"code": false,
"enableUserTemplates": false,
"discord_vesktop": false,
"discord_webcord": false,
"discord_armcord": false,
"discord_equibop": false,
"discord_lightcord": false,
"discord_dorion": false,
"pywalfox": false,
"vicinae": false,
"walker": false,
"code": false,
"enableUserTemplates": false
"discord_dorion": false
},
"nightLight": {
"enabled": false,
+2 -2
View File
@@ -327,7 +327,7 @@ BarWidgetRegistry and ControlCenterWidgetRegistry:
Services in Quickshell use the `pragma Singleton` directive:
- Add `pragma Singleton` at the top of the QML file (before imports)
- No qmldir needed - Quickshell handles singleton resolution automatically
- Import with standard path: `import qs.Services` or `import qs.Services.DynamicTheming`
- Import with standard path: `import qs.Services` or `import qs.Services.Theming`
- Access via singleton name: `AppThemeService.generate()`
Example:
@@ -346,7 +346,7 @@ Singleton {
}
```
### DynamicTheming Architecture
### Theming Architecture
The theming system was refactored (Jan 2025) into 4 focused services in `Services/`:
**AppThemeService.qml** (~60 lines) - Main facade
+7 -6
View File
@@ -402,17 +402,18 @@ Singleton {
property bool wezterm: false
property bool fuzzel: false
property bool discord: false
property bool discord_vesktop: false
property bool discord_webcord: false
property bool discord_armcord: false
property bool discord_equibop: false
property bool discord_lightcord: false
property bool discord_dorion: false
property bool pywalfox: false
property bool vicinae: false
property bool walker: false
property bool code: false
property bool enableUserTemplates: false
property bool discord_vesktop: false // To be deleted soon
property bool discord_webcord: false // To be deleted soon
property bool discord_armcord: false // To be deleted soon
property bool discord_equibop: false // To be deleted soon
property bool discord_lightcord: false // To be deleted soon
property bool discord_dorion: false // To be deleted soon
}
// night light
+2 -2
View File
@@ -332,10 +332,10 @@ Variants {
var dim = Qt.size(0, 0)
if (screenWidth >= screenHeight) {
const w = Math.min(screenWidth, wpWidth)
dim = Qt.size(w, w / imageAspectRatio)
dim = Qt.size(Math.round(w), Math.round(w / imageAspectRatio))
} else {
const h = Math.min(screenHeight, wpHeight)
dim = Qt.size(h * imageAspectRatio, h)
dim = Qt.size(Math.round(h * imageAspectRatio), Math.round(h))
}
Logger.d("Background", `Wallpaper resized on ${modelData.name} ${screenWidth}x${screenHeight} @ ${compositorScale}x`, "src:", wpWidth, wpHeight, "dst:", dim.width, dim.height)
+1 -1
View File
@@ -24,7 +24,7 @@ NIconButton {
function handleClick() {
if (!ScreenRecorderService.isAvailable) {
ToastService.showError(I18n.tr("toast.recording.not-installed"), I18n.tr("toast.recording.not-installed-desc"), 7000)
ToastService.showError(I18n.tr("toast.recording.not-installed"), I18n.tr("toast.recording.not-installed-desc"))
return
}
ScreenRecorderService.toggleRecording()
+4 -2
View File
@@ -15,8 +15,10 @@ Variants {
required property ShellScreen modelData
property bool shouldBeActive: {
if (!modelData || !modelData.name)
Logger.d("Shell", "MainScreen activated for", modelData?.name)
if (!modelData || !modelData.name) {
return false
}
Logger.d("Shell", "MainScreen activated for", modelData?.name)
return true
}
+1 -16
View File
@@ -163,7 +163,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "audioPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(audioPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -175,7 +174,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "batteryPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(batteryPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -187,7 +185,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "bluetoothPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(bluetoothPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -199,7 +196,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "controlCenterPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(controlCenterPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -211,7 +207,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "calendarPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(calendarPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -223,7 +218,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "launcherPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(launcherPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -235,7 +229,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "notificationHistoryPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(notificationHistoryPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -247,7 +240,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "sessionMenuPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(sessionMenuPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -259,7 +251,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "settingsPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(settingsPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -271,7 +262,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "setupWizardPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(setupWizardPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -283,7 +273,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "trayDrawerPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(trayDrawerPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -295,7 +284,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "trayMenuPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(trayMenuPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -307,7 +295,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "wallpaperPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(wallpaperPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -319,7 +306,6 @@ PanelWindow {
Component.onCompleted: {
objectName = "wifiPanel-" + (screen?.name || "unknown")
PanelService.registerPanel(wifiPanel)
Logger.d("MainScreen", "Panel registered:", objectName, "on screen:", screen?.name)
}
}
@@ -338,9 +324,8 @@ PanelWindow {
property ShellScreen screen: root.screen
onLoaded: {
Logger.d("MainScreen", "Bar loaded:", item !== null)
if (item) {
Logger.d("MainScreen", "Bar screen", item.screen?.name, "size:", item.width, "x", item.height)
Logger.d("MainScreen", "Bar loaded with screen", item.screen?.name)
// Bind screen to bar component (use binding for reactivity)
item.screen = Qt.binding(function () {
return barLoader.screen
+3 -1
View File
@@ -4,8 +4,10 @@ import QtQuick.Layouts
import Quickshell
import Quickshell.Widgets
import qs.Commons
import qs.Widgets
import qs.Modules.MainScreen
import qs.Services.Keyboard
import qs.Widgets
import "Plugins"
SmartPanel {
@@ -4,7 +4,7 @@ import QtQuick.Layouts
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Services.DynamicTheming
import qs.Services.Theming
import qs.Services.System
import qs.Services.UI
import qs.Widgets
@@ -113,9 +113,9 @@ ColumnLayout {
if (exitCode === 0) {
Settings.data.colorSchemes.useWallpaperColors = true
AppThemeService.generate()
ToastService.showNotice(I18n.tr("settings.color-scheme.color-source.use-wallpaper-colors.label"), I18n.tr("toast.wallpaper-colors.enabled"), "settings-color-scheme")
ToastService.showNotice(I18n.tr("toast.wallpaper-colors.label"), I18n.tr("toast.wallpaper-colors.enabled"), "settings-color-scheme")
} else {
ToastService.showWarning(I18n.tr("settings.color-scheme.color-source.use-wallpaper-colors.label"), I18n.tr("toast.wallpaper-colors.not-installed"))
ToastService.showWarning(I18n.tr("oast.wallpaper-colors.label"), I18n.tr("toast.wallpaper-colors.not-installed"))
}
}
@@ -130,7 +130,6 @@ ColumnLayout {
Repeater {
model: ColorSchemeService.schemes
delegate: Item {
FileView {
path: modelData
@@ -250,7 +249,7 @@ ColumnLayout {
matugenCheck.running = true
} else {
Settings.data.colorSchemes.useWallpaperColors = false
ToastService.showNotice(I18n.tr("settings.color-scheme.color-source.use-wallpaper-colors.label"), I18n.tr("toast.wallpaper-colors.disabled"), "settings-color-scheme")
ToastService.showNotice(I18n.tr("toast.wallpaper-colors.label"), I18n.tr("toast.wallpaper-colors.disabled"), "settings-color-scheme")
if (Settings.data.colorSchemes.predefinedScheme) {
ColorSchemeService.applyScheme(Settings.data.colorSchemes.predefinedScheme)
@@ -470,6 +469,7 @@ ColumnLayout {
ColumnLayout {
Layout.fillWidth: true
spacing: Style.marginL
visible: Settings.data.colorSchemes.useWallpaperColors || Settings.data.colorSchemes.generateTemplatesForPredefined
NHeader {
label: I18n.tr("settings.color-scheme.templates.section.label")
+1
View File
@@ -4,6 +4,7 @@ import QtQuick
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Services.UI
Singleton {
id: root
+6 -6
View File
@@ -113,7 +113,7 @@ Singleton {
// Check if gpu-screen-recorder is not installed
const stdout = String(recorderProcess.stdout.text || "").trim()
if (stdout === "GPU_SCREEN_RECORDER_NOT_INSTALLED") {
ToastService.showError(I18n.tr("toast.recording.not-installed"), I18n.tr("toast.recording.not-installed-desc"), 7000)
ToastService.showError(I18n.tr("toast.recording.not-installed"), I18n.tr("toast.recording.not-installed-desc"))
return
}
@@ -121,9 +121,9 @@ Singleton {
if (exitCode !== 0) {
const err = String(recorderProcess.stderr.text || "").trim()
if (err.length > 0)
ToastService.showError(I18n.tr("toast.recording.failed-start"), err, 7000)
ToastService.showError(I18n.tr("toast.recording.failed-start"), err)
else
ToastService.showError(I18n.tr("toast.recording.failed-start"), I18n.tr("toast.recording.failed-gpu"), 7000)
ToastService.showError(I18n.tr("toast.recording.failed-start"), I18n.tr("toast.recording.failed-gpu"))
}
} else if (isRecording) {
// Process ended normally while recording
@@ -135,9 +135,9 @@ Singleton {
} else {
const err2 = String(recorderProcess.stderr.text || "").trim()
if (err2.length > 0)
ToastService.showError(I18n.tr("toast.recording.failed-start"), err2, 7000)
ToastService.showError(I18n.tr("toast.recording.failed-start"), err2)
else
ToastService.showError(I18n.tr("toast.recording.failed-start"), I18n.tr("toast.recording.failed-general"), 7000)
ToastService.showError(I18n.tr("toast.recording.failed-start"), I18n.tr("toast.recording.failed-general"))
}
}
}
@@ -153,7 +153,7 @@ Singleton {
} else {
isPending = false
hasActiveRecording = false
ToastService.showError(I18n.tr("toast.recording.no-portals"), I18n.tr("toast.recording.no-portals-desc"), 8000)
ToastService.showError(I18n.tr("toast.recording.no-portals"), I18n.tr("toast.recording.no-portals-desc"))
}
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ import QtQuick
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Services.DynamicTheming
import qs.Services.Theming
// Service to check if various programs are available on the system
Singleton {
@@ -8,15 +8,15 @@ import qs.Services.UI
Singleton {
id: root
// PUBLIC API - maintain compatibility with existing code
readonly property string colorsApplyScript: Quickshell.shellDir + '/Bin/colors-apply.sh'
// Connections to trigger regeneration
Connections {
target: WallpaperService
// When the wallpaper changes, regenerate with Matugen if necessary
function onWallpaperChanged(screenName, path) {
if (screenName === Screen.name && Settings.data.colorSchemes.useWallpaperColors) {
generate()
generateFromWallpaper()
}
}
}
@@ -39,6 +39,7 @@ Singleton {
generateFromWallpaper()
} else {
ColorSchemeService.applyScheme(Settings.data.colorSchemes.predefinedScheme)
generateFromPredefinedScheme()
}
}
@@ -5,6 +5,7 @@ import Qt.labs.folderlistmodel
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Services.UI
Singleton {
id: root
@@ -29,7 +29,7 @@ Singleton {
/**
* Process wallpaper colors using matugen CLI
* Requirement #4: Dual-path architecture (wallpaper uses matugen CLI)
* Dual-path architecture (wallpaper uses matugen CLI)
*/
function processWallpaperColors(wallpaperPath, mode) {
const content = buildMatugenConfig()
@@ -39,6 +39,7 @@ Singleton {
const wp = wallpaperPath.replace(/'/g, "'\\''")
const script = buildMatugenScript(content, wp, mode)
generateProcess.generator = "matugen"
generateProcess.command = ["bash", "-lc", script]
generateProcess.running = true
}
@@ -46,7 +47,7 @@ Singleton {
/**
* Process predefined color scheme using sed scripts
* Requirement #4: Dual-path architecture (predefined uses sed scripts)
* Dual-path architecture (predefined uses sed scripts)
*/
function processPredefinedScheme(schemeData, mode) {
handleTerminalThemes(mode)
@@ -57,6 +58,7 @@ Singleton {
// Add user templates if enabled (requirement #1)
script += buildUserTemplateCommandForPredefined(schemeData, mode)
generateProcess.generator = "predefined"
generateProcess.command = ["bash", "-lc", script]
generateProcess.running = true
}
@@ -167,7 +169,6 @@ Singleton {
}
}
})
return script
}
@@ -184,6 +185,7 @@ Singleton {
const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/'))
const baseConfigDir = outputDir.replace("/themes", "")
script += `\n`
script += `if [ -d "${baseConfigDir}" ]; then\n`
script += ` mkdir -p ${outputDir}\n`
script += ` cp '${templatePath}' '${outputPath}'\n`
@@ -205,9 +207,11 @@ Singleton {
const outputPath = output.path.replace("~", homeDir)
const outputDir = outputPath.substring(0, outputPath.lastIndexOf('/'))
script += `\n`
script += `mkdir -p ${outputDir}\n`
script += `cp '${templatePath}' '${outputPath}'\n`
script += replaceColorsInFile(outputPath, palette)
script += `\n`
})
if (app.postProcess) {
@@ -269,7 +273,7 @@ Singleton {
}
// ================================================================================
// USER TEMPLATES
// USER TEMPLATES, advanced usage
// ================================================================================
function buildUserTemplateCommand(input, mode) {
if (!Settings.data.templates.enableUserTemplates)
@@ -320,17 +324,21 @@ Singleton {
workingDirectory: Quickshell.shellDir
running: false
// Error reporting helpers
property string generator: ""
function showError() {
const description = (stderr.text && stderr.text.trim() !== "") ? stderr.text.trim() : ((stdout.text && stdout.text.trim() !== "") ? stdout.text.trim() : I18n.tr("toast.theming-processor-failed.desc-generic"))
const title = I18n.tr(`toast.theming-processor-failed.title-${generator}`)
// Give a bit more time to the user to read, as it can contains important information for debugging user's templates.
ToastService.showError(title, description, 8000)
return description
}
onExited: function (exitCode) {
if (exitCode !== 0) {
const errorMsg = (stderr.text && stderr.text.trim() !== "") ? stderr.text.trim() : ((stdout.text && stdout.text.trim() !== "") ? stdout.text.trim() : I18n.tr("toast.matugen.failed-general"))
Logger.e("TemplateProcessor", "Process failed with exit code:", exitCode)
if (stderr.text && stderr.text.trim() !== "") {
Logger.e("TemplateProcessor", "stderr:", stderr.text)
}
if (stdout.text && stdout.text.trim() !== "") {
Logger.e("TemplateProcessor", "stdout:", stdout.text)
}
ToastService.showError(I18n.tr("toast.matugen.failed"), errorMsg, 6000)
const description = generateProcess.showError()
Logger.e("TemplateProcessor", "Process failed with exit code", exitCode, description)
}
}
@@ -342,8 +350,10 @@ Singleton {
}
stderr: StdioCollector {
onStreamFinished: {
if (this.text)
Logger.d("TemplateProcessor", "stderr:", this.text)
if (this.text) {
const description = generateProcess.showError()
Logger.e("TemplateProcessor", "Process failed with exit code", exitCode, description)
}
}
}
}
+1 -1
View File
@@ -25,7 +25,7 @@ Singleton {
// Register this panel (called after panel is loaded)
function registerPanel(panel) {
registeredPanels[panel.objectName] = panel
Logger.i("PanelService", "Registered panel:", panel.objectName)
Logger.d("PanelService", "Registered panel:", panel.objectName)
}
// Returns a panel (loads it on-demand if not yet loaded)
+1 -1
View File
@@ -18,7 +18,7 @@ Singleton {
notify(message, description, "", "warning", duration)
}
function showError(message, description = "", duration = 5000) {
function showError(message, description = "", duration = 6000) {
notify(message, description, "", "error", duration)
}
}
+1 -1
View File
@@ -13,7 +13,7 @@ import Quickshell
// Commons & Services
import qs.Commons
import qs.Services.Control
import qs.Services.DynamicTheming
import qs.Services.Theming
import qs.Services.Hardware
import qs.Services.Location
import qs.Services.Networking