Merge remote-tracking branch 'origin/matugen-test'

This commit is contained in:
lysec
2025-10-06 16:16:34 +02:00
4 changed files with 148 additions and 533 deletions
+44 -360
View File
@@ -5,7 +5,7 @@ import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Services
import "../Helpers/ColorVariants.js" as ColorVariants
import "../Helpers/ColorsConvert.js" as ColorsConvert
Singleton {
id: root
@@ -42,325 +42,6 @@ Singleton {
Logger.log("Matugen", "Service started")
}
// --------------------------------
// Convert predefined color scheme to Matugen format
function convertPredefinedSchemeToMatugen(schemeData) {
var variant = schemeData
// If scheme provides dark/light variants, pick based on settings
if (schemeData && (schemeData.dark || schemeData.light)) {
if (Settings.data.colorSchemes.darkMode) {
variant = schemeData.dark || schemeData.light
} else {
variant = schemeData.light || schemeData.dark
}
}
// Map predefined scheme colors to Matugen color structure - only core Material 3 colors
var matugenColors = {
"colors": {
"primary": {
"light": {
"color": variant.mPrimary
},
"default": {
"color": variant.mPrimary
},
"dark": {
"color": variant.mPrimary
}
},
"on_primary": {
"light": {
"color": variant.mOnPrimary
},
"default": {
"color": variant.mOnPrimary
},
"dark": {
"color": variant.mOnPrimary
}
},
"secondary": {
"light": {
"color": variant.mSecondary
},
"default": {
"color": variant.mSecondary
},
"dark": {
"color": variant.mSecondary
}
},
"on_secondary": {
"light": {
"color": variant.mOnSecondary
},
"default": {
"color": variant.mOnSecondary
},
"dark": {
"color": variant.mOnSecondary
}
},
"tertiary": {
"light": {
"color": variant.mTertiary
},
"default": {
"color": variant.mTertiary
},
"dark": {
"color": variant.mTertiary
}
},
"on_tertiary": {
"light": {
"color": variant.mOnTertiary
},
"default": {
"color": variant.mOnTertiary
},
"dark": {
"color": variant.mOnTertiary
}
},
"error": {
"light": {
"color": variant.mError
},
"default": {
"color": variant.mError
},
"dark": {
"color": variant.mError
}
},
"on_error": {
"light": {
"color": variant.mOnError
},
"default": {
"color": variant.mOnError
},
"dark": {
"color": variant.mOnError
}
},
"surface": {
"light": {
"color": variant.mSurface
},
"default": {
"color": variant.mSurface
},
"dark": {
"color": variant.mSurface
}
},
"on_surface": {
"light": {
"color": variant.mOnSurface
},
"default": {
"color": variant.mOnSurface
},
"dark": {
"color": variant.mOnSurface
}
},
"surface_variant": {
"light": {
"color": variant.mSurfaceVariant
},
"default": {
"color": variant.mSurfaceVariant
},
"dark": {
"color": variant.mSurfaceVariant
}
},
"on_surface_variant": {
"light": {
"color": variant.mOnSurfaceVariant
},
"default": {
"color": variant.mOnSurfaceVariant
},
"dark": {
"color": variant.mOnSurfaceVariant
}
},
"outline": {
"light": {
"color": variant.mOutline
},
"default": {
"color": variant.mOutline
},
"dark": {
"color": variant.mOutline
}
},
"primary_fixed_dim": {
"light": {
"color": ColorVariants.generateFixedDim(variant.mPrimary)
},
"default": {
"color": ColorVariants.generateFixedDim(variant.mPrimary)
},
"dark": {
"color": ColorVariants.generateFixedDim(variant.mPrimary)
}
},
"secondary_fixed_dim": {
"light": {
"color": ColorVariants.generateFixedDim(variant.mSecondary)
},
"default": {
"color": ColorVariants.generateFixedDim(variant.mSecondary)
},
"dark": {
"color": ColorVariants.generateFixedDim(variant.mSecondary)
}
},
"tertiary_fixed_dim": {
"light": {
"color": ColorVariants.generateFixedDim(variant.mTertiary)
},
"default": {
"color": ColorVariants.generateFixedDim(variant.mTertiary)
},
"dark": {
"color": ColorVariants.generateFixedDim(variant.mTertiary)
}
},
"surface_bright": {
"light": {
"color": ColorVariants.generateBright(variant.mSurface)
},
"default": {
"color": ColorVariants.generateBright(variant.mSurface)
},
"dark": {
"color": ColorVariants.generateBright(variant.mSurface)
}
},
"surface_variant_bright": {
"light": {
"color": ColorVariants.generateBright(variant.mSurfaceVariant)
},
"default": {
"color": ColorVariants.generateBright(variant.mSurfaceVariant)
},
"dark": {
"color": ColorVariants.generateBright(variant.mSurfaceVariant)
}
},
"primary_container": {
"light": {
"color": ColorVariants.generateContainer(variant.mPrimary, false)
},
"default": {
"color": ColorVariants.generateContainer(variant.mPrimary, true)
},
"dark": {
"color": ColorVariants.generateContainer(variant.mPrimary, true)
}
},
"secondary_container": {
"light": {
"color": ColorVariants.generateContainer(variant.mSecondary, false)
},
"default": {
"color": ColorVariants.generateContainer(variant.mSecondary, true)
},
"dark": {
"color": ColorVariants.generateContainer(variant.mSecondary, true)
}
},
"tertiary_container": {
"light": {
"color": ColorVariants.generateContainer(variant.mTertiary, false)
},
"default": {
"color": ColorVariants.generateContainer(variant.mTertiary, true)
},
"dark": {
"color": ColorVariants.generateContainer(variant.mTertiary, true)
}
},
"on_primary_container": {
"light": {
"color": ColorVariants.generateContainer(variant.mOnPrimary, false)
},
"default": {
"color": ColorVariants.generateContainer(variant.mOnPrimary, true)
},
"dark": {
"color": ColorVariants.generateContainer(variant.mOnPrimary, true)
}
},
"on_secondary_container": {
"light": {
"color": ColorVariants.generateContainer(variant.mOnSecondary, false)
},
"default": {
"color": ColorVariants.generateContainer(variant.mOnSecondary, true)
},
"dark": {
"color": ColorVariants.generateContainer(variant.mOnSecondary, true)
}
},
"on_tertiary_container": {
"light": {
"color": ColorVariants.generateContainer(variant.mOnTertiary, false)
},
"default": {
"color": ColorVariants.generateContainer(variant.mOnTertiary, true)
},
"dark": {
"color": ColorVariants.generateContainer(variant.mOnTertiary, true)
}
},
"surface_container": {
"light": {
"color": ColorVariants.generateContainer(variant.mSurface, false)
},
"default": {
"color": ColorVariants.generateContainer(variant.mSurface, true)
},
"dark": {
"color": ColorVariants.generateContainer(variant.mSurface, true)
}
},
"surface_container_high": {
"light": {
"color": ColorVariants.generateBright(ColorVariants.generateContainer(variant.mSurface, false), false)
},
"default": {
"color": ColorVariants.generateBright(ColorVariants.generateContainer(variant.mSurface, true), true)
},
"dark": {
"color": ColorVariants.generateBright(ColorVariants.generateContainer(variant.mSurface, true), true)
}
},
"surface_container_highest": {
"light": {
"color": ColorVariants.generateBright(ColorVariants.generateBright(ColorVariants.generateContainer(variant.mSurface, false), false), false)
},
"default": {
"color": ColorVariants.generateBright(ColorVariants.generateBright(ColorVariants.generateContainer(variant.mSurface, true), true), true)
},
"dark": {
"color": ColorVariants.generateBright(ColorVariants.generateBright(ColorVariants.generateContainer(variant.mSurface, true), true), true)
}
}
}
}
return JSON.stringify(matugenColors)
}
// --------------------------------
// Generate colors using current wallpaper and settings
function generateFromWallpaper() {
@@ -394,6 +75,29 @@ Singleton {
generateProcess.running = true
}
// --------------------------------
function selectVibrantColor(schemeData, mode) {
var colors = []
colors.push(schemeData[mode]["mPrimary"]);
colors.push(schemeData[mode]["mSecondary"]);
colors.push(schemeData[mode]["mTertiary"]);
var bestScore = 0
var bestScoreIndex = -1
for (var i=0; i<colors.length; i++) {
var hsl = ColorsConvert.hexToHSL(colors[i])
var score = hsl['s'];// + hsl['l'];
if (score > bestScore) {
bestScore = score
bestScoreIndex = i
}
}
return colors[bestScoreIndex]
}
// --------------------------------
// Generate templates from predefined color scheme
function generateFromPredefinedScheme(schemeData) {
@@ -404,39 +108,33 @@ Singleton {
var pathEsc = dynamicConfigPath.replace(/'/g, "'\\''")
var extraRepo = (Quickshell.shellDir + "/Assets/Matugen/extra").replace(/'/g, "'\\''")
var extraUser = (Settings.configDir + "matugen.d").replace(/'/g, "'\\''")
// Convert predefined scheme to Matugen format
var matugenJson = convertPredefinedSchemeToMatugen(schemeData)
var jsonPath = Settings.cacheDir + "matugen.import.json"
var jsonPathEsc = jsonPath.replace(/'/g, "'\\''")
const color = selectVibrantColor(schemeData, mode)
// Build the script
var script = ""
script += "cat > '" + pathEsc + "' << 'EOF'\n" + content + "EOF\n"
script += "for d in '" + extraRepo + "' '" + extraUser + "'; do\n"
script += " if [ -d \"$d\" ]; then\n"
script += " for f in \"$d\"/*.toml; do\n"
script += " [ -f \"$f\" ] && { echo; echo \"# extra: $f\"; cat \"$f\"; } >> '" + pathEsc + "'\n"
script += " done\n"
script += " fi\n"
script += "done\n"
script += "matugen image --import-json '" + jsonPathEsc + "' --config '" + pathEsc + "' --mode " + mode + " '" + Quickshell.shellDir + "/Assets/Wallpaper/noctalia.png'"
script += "cat > '" + pathEsc + "' << 'EOF'\n" + content + "EOF\n\n"
// script += "for d in '" + extraRepo + "' '" + extraUser + "'; do\n"
// script += " if [ -d \"$d\" ]; then\n"
// script += " for f in \"$d\"/*.toml; do\n"
// script += " [ -f \"$f\" ] && { echo; echo \"# extra: $f\"; cat \"$f\"; } >> '" + pathEsc + "'\n"
// script += " done\n"
// script += " fi\n"
// script += "done\n\n"
script += "matugen color hex '" + color + "' --config '" + pathEsc + "' --mode " + mode
// Add user config execution if enabled
if (Settings.data.templates.enableUserTemplates) {
var userConfigDir = (Quickshell.env("HOME") + "/.config/matugen/").replace(/'/g, "'\\''")
script += "\n# Execute user config if it exists\nif [ -f '" + userConfigDir + "config.toml' ]; then\n"
script += " matugen image --import-json '" + jsonPathEsc + "' --config '" + userConfigDir + "config.toml' --mode " + mode + " '" + Quickshell.shellDir + "/Assets/Wallpaper/noctalia.png'\n"
script += "fi"
}
console.log(script)
// // Add user config execution if enabled
// if (Settings.data.templates.enableUserTemplates) {
// var userConfigDir = (Quickshell.env("HOME") + "/.config/matugen/").replace(/'/g, "'\\''")
// script += "\n# Execute user config if it exists\nif [ -f '" + userConfigDir + "config.toml' ]; then\n"
// script += " matugen color hex " + color + " --config '" + userConfigDir + "config.toml' --mode " + mode
// script += "fi"
// }
script += "\n"
generateProcess.command = ["bash", "-lc", script]
// Write JSON file with our custom colors
// once written matugen will be executed via 'generateProcess'
jsonWriter.path = jsonPath
jsonWriter.setText(matugenJson)
generateProcess.running = true
// -----
var terminals = {
@@ -489,20 +187,6 @@ Singleton {
return `${Quickshell.shellDir}/Assets/ColorScheme/${colorScheme}/terminal/${terminal}/${colorScheme}-${darkLight}${extension}`
}
// --------------------------------
// File writer for JSON import file
FileView {
id: jsonWriter
onSaved: {
Logger.log("Matugen", "JSON import file written successfully")
// Run matugen command after JSON file is written
generateProcess.running = true
}
onSaveFailed: {
Logger.error("Matugen", "Failed to write JSON import file:", error)
}
}
// --------------------------------
Process {
id: generateProcess