feat: 添加主题模板一键切换功能
- 新增 THEME_TEMPLATE 配置项(system/animal/ocean/sunset/forest/mono) - 新增 getThemeTemplate() 模板颜色映射 - 新增 applyThemeTemplate() 自动填充面板背景/文字色 - getPanelBgColorInt/getPanelTextColorInt 支持模板覆盖 - 设置页换装分组新增单选选择器
This commit is contained in:
@@ -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" },
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user