1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-04-14 17:52:10 -04:00

theme: improve handling of custom themes with variants and accents in

light/dark mode (e.g. catpuccin will react to light/dark changes and
remember theme per-mode)
fixes #1094
This commit is contained in:
bbedward
2026-02-13 10:31:59 -05:00
parent 8a6c1e45ce
commit 242660c51d
3 changed files with 45 additions and 17 deletions

View File

@@ -2210,19 +2210,34 @@ Singleton {
Theme.reloadCustomThemeVariant(); Theme.reloadCustomThemeVariant();
} }
function getRegistryThemeMultiVariant(themeId, defaults) { function getRegistryThemeMultiVariant(themeId, defaults, mode) {
var stored = registryThemeVariants[themeId]; var stored = registryThemeVariants[themeId];
if (stored && typeof stored === "object") if (!stored || typeof stored !== "object")
return stored; return defaults || {};
return defaults || {}; if ((stored.dark && typeof stored.dark === "object") || (stored.light && typeof stored.light === "object")) {
if (!mode)
return stored.dark || stored.light || defaults || {};
var modeData = stored[mode];
if (modeData && typeof modeData === "object")
return modeData;
return defaults || {};
}
return stored;
} }
function setRegistryThemeMultiVariant(themeId, flavor, accent) { function setRegistryThemeMultiVariant(themeId, flavor, accent, mode) {
var variants = JSON.parse(JSON.stringify(registryThemeVariants)); var variants = JSON.parse(JSON.stringify(registryThemeVariants));
variants[themeId] = { var existing = variants[themeId];
flavor: flavor, var perMode = {};
accent: accent if (existing && typeof existing === "object") {
}; if ((existing.dark && typeof existing.dark === "object") || (existing.light && typeof existing.light === "object")) {
perMode = existing;
} else if (typeof existing.flavor === "string") {
perMode.dark = {flavor: existing.flavor, accent: existing.accent || ""};
}
}
perMode[mode || "dark"] = {flavor: flavor, accent: accent};
variants[themeId] = perMode;
registryThemeVariants = variants; registryThemeVariants = variants;
saveSettings(); saveSettings();
if (typeof Theme !== "undefined") if (typeof Theme !== "undefined")

View File

@@ -971,7 +971,7 @@ Singleton {
if (themeData.variants.type === "multi" && themeData.variants.flavors && themeData.variants.accents) { if (themeData.variants.type === "multi" && themeData.variants.flavors && themeData.variants.accents) {
const defaults = themeData.variants.defaults || {}; const defaults = themeData.variants.defaults || {};
const modeDefaults = defaults[colorMode] || defaults.dark || {}; const modeDefaults = defaults[colorMode] || defaults.dark || {};
const stored = typeof SettingsData !== "undefined" ? SettingsData.getRegistryThemeMultiVariant(themeId, modeDefaults) : modeDefaults; const stored = typeof SettingsData !== "undefined" ? SettingsData.getRegistryThemeMultiVariant(themeId, modeDefaults, colorMode) : modeDefaults;
var flavorId = stored.flavor || modeDefaults.flavor || ""; var flavorId = stored.flavor || modeDefaults.flavor || "";
const accentId = stored.accent || modeDefaults.accent || ""; const accentId = stored.accent || modeDefaults.accent || "";
var flavor = findVariant(themeData.variants.flavors, flavorId); var flavor = findVariant(themeData.variants.flavors, flavorId);
@@ -1365,8 +1365,8 @@ Singleton {
const defaults = customThemeRawData.variants.defaults || {}; const defaults = customThemeRawData.variants.defaults || {};
const darkDefaults = defaults.dark || {}; const darkDefaults = defaults.dark || {};
const lightDefaults = defaults.light || defaults.dark || {}; const lightDefaults = defaults.light || defaults.dark || {};
const storedDark = typeof SettingsData !== "undefined" ? SettingsData.getRegistryThemeMultiVariant(themeId, darkDefaults) : darkDefaults; const storedDark = typeof SettingsData !== "undefined" ? SettingsData.getRegistryThemeMultiVariant(themeId, darkDefaults, "dark") : darkDefaults;
const storedLight = typeof SettingsData !== "undefined" ? SettingsData.getRegistryThemeMultiVariant(themeId, lightDefaults) : lightDefaults; const storedLight = typeof SettingsData !== "undefined" ? SettingsData.getRegistryThemeMultiVariant(themeId, lightDefaults, "light") : lightDefaults;
const darkFlavorId = storedDark.flavor || darkDefaults.flavor || ""; const darkFlavorId = storedDark.flavor || darkDefaults.flavor || "";
const lightFlavorId = storedLight.flavor || lightDefaults.flavor || ""; const lightFlavorId = storedLight.flavor || lightDefaults.flavor || "";
const accentId = storedDark.accent || darkDefaults.accent || ""; const accentId = storedDark.accent || darkDefaults.accent || "";

View File

@@ -777,13 +777,26 @@ Item {
return {}; return {};
return activeThemeVariants.defaults[colorMode] || activeThemeVariants.defaults.dark || {}; return activeThemeVariants.defaults[colorMode] || activeThemeVariants.defaults.dark || {};
} }
property var storedMulti: activeThemeId ? SettingsData.getRegistryThemeMultiVariant(activeThemeId, multiDefaults) : multiDefaults property var storedMulti: activeThemeId ? SettingsData.getRegistryThemeMultiVariant(activeThemeId, multiDefaults, colorMode) : multiDefaults
property string selectedFlavor: storedMulti.flavor || multiDefaults.flavor || "" property string selectedFlavor: {
var sf = storedMulti.flavor || multiDefaults.flavor || "";
for (var i = 0; i < flavorOptions.length; i++) {
if (flavorOptions[i].id === sf)
return sf;
}
if (flavorOptions.length > 0)
return flavorOptions[0].id;
return sf;
}
property string selectedAccent: storedMulti.accent || multiDefaults.accent || "" property string selectedAccent: storedMulti.accent || multiDefaults.accent || ""
property var flavorOptions: { property var flavorOptions: {
if (!isMultiVariant || !activeThemeVariants?.flavors) if (!isMultiVariant || !activeThemeVariants?.flavors)
return []; return [];
return activeThemeVariants.flavors.filter(f => f.mode === colorMode || f.mode === "both"); return activeThemeVariants.flavors.filter(f => {
if (f.mode)
return f.mode === colorMode || f.mode === "both";
return !!f[colorMode];
});
} }
property var flavorNames: flavorOptions.map(f => f.name) property var flavorNames: flavorOptions.map(f => f.name)
property int flavorIndex: { property int flavorIndex: {
@@ -842,7 +855,7 @@ Item {
if (!flavorId || flavorId === variantSelector.selectedFlavor) if (!flavorId || flavorId === variantSelector.selectedFlavor)
return; return;
Theme.screenTransition(); Theme.screenTransition();
SettingsData.setRegistryThemeMultiVariant(variantSelector.activeThemeId, flavorId, variantSelector.selectedAccent); SettingsData.setRegistryThemeMultiVariant(variantSelector.activeThemeId, flavorId, variantSelector.selectedAccent, variantSelector.colorMode);
} }
} }
} }
@@ -905,7 +918,7 @@ Item {
if (parent.isSelected) if (parent.isSelected)
return; return;
Theme.screenTransition(); Theme.screenTransition();
SettingsData.setRegistryThemeMultiVariant(variantSelector.activeThemeId, variantSelector.selectedFlavor, parent.accentId); SettingsData.setRegistryThemeMultiVariant(variantSelector.activeThemeId, variantSelector.selectedFlavor, parent.accentId, variantSelector.colorMode);
} }
} }