feat: 添加主题模板一键切换功能

- 新增 THEME_TEMPLATE 配置项(system/animal/ocean/sunset/forest/mono)
- 新增 getThemeTemplate() 模板颜色映射
- 新增 applyThemeTemplate() 自动填充面板背景/文字色
- getPanelBgColorInt/getPanelTextColorInt 支持模板覆盖
- 设置页换装分组新增单选选择器
This commit is contained in:
7015725
2026-05-15 01:54:40 +08:00
parent bba3d800af
commit d8a25aced9
4 changed files with 68 additions and 6 deletions

View File

@@ -83,6 +83,7 @@ var ConfigValidator = {
PANEL_PADDING_DP: { type: "int", min: 8, max: 32, default: 12 },
// 主题配置
THEME_TEMPLATE: { type: "enum", values: ["system", "animal", "ocean", "sunset", "forest", "mono"], default: "system" },
THEME_MODE: { type: "enum", values: [0, 1, 2], default: 1 },
THEME_ACCENT_LIGHT: { type: "string", default: "#FF3A86FF" },
THEME_ACCENT_DARK: { type: "string", default: "#FF90CAF9" },
@@ -754,6 +755,7 @@ var ConfigManager = {
PANEL_LABEL_TOP_MARGIN_DP: 4,
PANEL_BG_FALLBACK_HEX: "#EE1E1E1E",
PANEL_BG_ALPHA: 0.85,
THEME_TEMPLATE: "system",
THEME_MODE: 1,
THEME_DAY_BG_HEX: null,
THEME_DAY_TEXT_HEX: null,
@@ -770,6 +772,14 @@ var ConfigManager = {
],
defaultSchema: [
{ type: "section", name: "外观" },
{ key: "THEME_TEMPLATE", name: "主题模板", type: "single_choice", options: [
{ label: "系统莫奈色", value: "system" },
{ label: "动物岛(绿)", value: "animal" },
{ label: "海洋(蓝)", value: "ocean" },
{ label: "日落(橙)", value: "sunset" },
{ label: "森林(绿)", value: "forest" },
{ label: "黑白(极简)", value: "mono" }
]},
{ key: "THEME_MODE", name: "主题(0跟随/1白/2黑)", type: "int", min: 0, max: 2, step: 1 },
{ key: "THEME_DAY_BG_HEX", name: "日间背景色(#RRGGBB)", type: "text" },
{ key: "THEME_DAY_TEXT_HEX", name: "日间文字色(#RRGGBB)", type: "text" },

View File

@@ -747,10 +747,58 @@ FloatBallAppWM.prototype.safeParseColor = function(hex, fallbackInt) {
try { return android.graphics.Color.parseColor(String(hex)); } catch (e) { return fallbackInt; }
};
// =======================【主题模板:一键切换配色预设】======================
// 每个模板定义日间/夜间 背景+文字色。选择模板后如果用户没单独覆盖那4个颜色配置
// 就在 getPanelBgColorInt/getPanelTextColorInt 中自动填充模板值。
FloatBallAppWM.prototype.getThemeTemplate = function(name) {
var tplMap = {
system: { dayBg: null, dayText: null, nightBg: null, nightText: null },
animal: { dayBg: "#A8DDB4", dayText: "#5E472D", nightBg: "#2F4034", nightText: "#FFF1D2" },
ocean: { dayBg: "#B3E5FC", dayText: "#1A237E", nightBg: "#1A237E", nightText: "#B3E5FC" },
sunset: { dayBg: "#FFE0B2", dayText: "#4E342E", nightBg: "#3E2723", nightText: "#FFCCBC" },
forest: { dayBg: "#C8E6C9", dayText: "#1B5E20", nightBg: "#1B5E20", nightText: "#C8E6C9" },
mono: { dayBg: "#F5F5F5", dayText: "#212121", nightBg: "#212121", nightText: "#F5F5F5" }
};
return tplMap[name] || tplMap.system;
};
// 应用主题模板:如果配置中的 4 个颜色值为空/null 且模板非 system则用模板值填充。
// 手动覆盖的值保持优先。
FloatBallAppWM.prototype.applyThemeTemplate = function() {
try {
var tpl = String(this.config.THEME_TEMPLATE || "system");
if (tpl === "system") return; // system 走 Monet不填充
var t = this.getThemeTemplate(tpl);
var Color = android.graphics.Color;
if (t.dayBg != null && (this.config.THEME_DAY_BG_HEX == null || String(this.config.THEME_DAY_BG_HEX) === "" || String(this.config.THEME_DAY_BG_HEX) === "null")) {
this.config.THEME_DAY_BG_HEX = String(t.dayBg);
}
if (t.dayText != null && (this.config.THEME_DAY_TEXT_HEX == null || String(this.config.THEME_DAY_TEXT_HEX) === "" || String(this.config.THEME_DAY_TEXT_HEX) === "null")) {
this.config.THEME_DAY_TEXT_HEX = String(t.dayText);
}
if (t.nightBg != null && (this.config.THEME_NIGHT_BG_HEX == null || String(this.config.THEME_NIGHT_BG_HEX) === "" || String(this.config.THEME_NIGHT_BG_HEX) === "null")) {
this.config.THEME_NIGHT_BG_HEX = String(t.nightBg);
}
if (t.nightText != null && (this.config.THEME_NIGHT_TEXT_HEX == null || String(this.config.THEME_NIGHT_TEXT_HEX) === "" || String(this.config.THEME_NIGHT_TEXT_HEX) === "null")) {
this.config.THEME_NIGHT_TEXT_HEX = String(t.nightText);
}
try { _th_log(this.L, "d", "[theme:template] applied " + tpl + " dayBg=" + String(t.dayBg) + " nightBg=" + String(t.nightBg)); } catch(eL) {}
} catch(e) {
try { _th_log(this.L, "e", "[theme:template] apply err=" + String(e)); } catch(eL2) {}
}
};
FloatBallAppWM.prototype.getPanelBgColorInt = function() {
// 这段代码的主要内容/用途:配合"白天/夜晚"两档主题,返回统一的背景颜色(不再依赖自动亮度推断)。
// 应用主题模板(如果选择模板且用户未手动覆盖)
try { this.applyThemeTemplate(); } catch(eAT) {}
var isDark = this.isDarkTheme();
var dayBgHex = (this.config.THEME_DAY_BG_HEX != null) ? String(this.config.THEME_DAY_BG_HEX) : null;
@@ -782,6 +830,10 @@ FloatBallAppWM.prototype.getPanelBgColorInt = function() {
FloatBallAppWM.prototype.getPanelTextColorInt = function(bgInt) {
// 这段代码的主要内容/用途:配合"白天/夜晚"两档主题,返回统一的文字颜色(不再依赖自动亮度推断)。
// 应用主题模板(如果选择模板且用户未手动覆盖)
try { this.applyThemeTemplate(); } catch(eAT) {}
var isDark = this.isDarkTheme();
var dayTextHex = (this.config.THEME_DAY_TEXT_HEX != null) ? String(this.config.THEME_DAY_TEXT_HEX) : null;

View File

@@ -2,8 +2,8 @@
"alg": "SHA256withRSA",
"files": {
"th_01_base.js": {
"sha256": "69131e872988a13b642c0cefa3243bab93f2fa8fdfbf3e4e80edb93dbb472d2e",
"size": 52510
"sha256": "25976d83eec414d3da263f8973eea2024013323f49375ed8ef982f245f5899bb",
"size": 53105
},
"th_02_core.js": {
"sha256": "15bb9bfbd19a673d442e221b0a00a456ed5f87af2666b9c73b117d6223faeecd",
@@ -14,8 +14,8 @@
"size": 5598
},
"th_04_theme.js": {
"sha256": "b56b9013de31bf191a786359f1371b07375c3aa60bbb15bdf318dd39945858d7",
"size": 38293
"sha256": "6bfa24d75ca23ba6c7f09b94492a63e8af2437be1bf25b79eb96089667935361",
"size": 41166
},
"th_05_persistence.js": {
"sha256": "d80787c2810839ebbe499e93db3df33d6e8d2d6b6ae71644ce351db0f36e4d3e",
@@ -68,5 +68,5 @@
},
"keyId": "toolhub-targets-2026-rsa3072",
"schema": 2,
"version": 20260514153017
"version": 20260514175330
}

View File

@@ -1 +1 @@
VaDD1lRPuo0nD3DHjtvep95CfyKjrbLNDu35Z7/6E1VZVRZWSGl4IYrBiHjIDMjFCmgt7XbMwM497i+pyNnE40F57NEUfgobIVxTpD5K2UycYGMy+dCPbLwlLsMDc5ia3Th9CHsbw3PFk+B2DiltRh/3sDrOYNLkTgRcEUSnV5ZcHj0PFdGloC1XYfNbJtRG0j/0mMeRdt0sHLAEHhp5tLALlBNQPU43WVvCNeK4SV6KRmJ7C0DSr1OHrnfDpuGPS1Nw/JLpNN8M/XE/Ir9q1s8c/woS3wmYvGRE7Ts31W+dVDz4SqLvlH5Ge0B9rJSu/Ouc/c9KTiXT/eFY+tjKtj0tGC+dHOzaQeuB063H7W9EvlzDoj5wFrJykoCZm7DfkXeAgO2+q9RsZptfoFs4QgGNkloOPdtIVJNiu+v7yB9Mi/o7PlDYWfi/PPU+0nsvLwK9USov5C5NKx2iqcaJoZ40D6l5ZyTVDMu68atV8hq7Mp5R6g5FbhbyhSlmkhQx
eWeHcpko7Wf2cqLTIeNWt/0+JZkHLYbbo1XiEabLoF72g6XWvxIXdDFLh3teeO47IxxyEdPtxiVWSbq1znygicIEJyLpXONstjDHsqvVQFepLeGUk8+DkEKEi0ZF3jhZkYDlPyfPWyS6FBtNmIKRHkMDDVEFZAc7flWhn2lu3Je+1BHh0HsG/J9wNni48soQv5jTB/Duzd+hxwPX33zfqBxdKU/Es8XDsVVELvAn8Qk3VdtWq2EYYR31klLlYMG7ez4sIYOdAHE5zVirBjEVcz7TO7wqniGu8SuRMMhEo51IXyynenSWozt2G/OwgL/JjdGnSHxsQ8mhmEitLjudoGacmjFkkKHuQyxKu1ulATAlz086+o4lIPvzSRJfYm4yGzVBYt0cKNHu63XgOLXBvLy445sBJ+/+B64SJKrNYEIw8LHJkgrpba5AIIfYXyFrTLL+ehfwUfkCj28Hv99y4JJuCX2/Ut3DzWIu6/4GzgjoB3Nj4NDZekMZZW7wTDQk