From d8a25aced97e0841ec77a356ffb3e6e1f9042895 Mon Sep 17 00:00:00 2001 From: 7015725 Date: Fri, 15 May 2026 01:54:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=B8=80=E9=94=AE=E5=88=87=E6=8D=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 THEME_TEMPLATE 配置项(system/animal/ocean/sunset/forest/mono) - 新增 getThemeTemplate() 模板颜色映射 - 新增 applyThemeTemplate() 自动填充面板背景/文字色 - getPanelBgColorInt/getPanelTextColorInt 支持模板覆盖 - 设置页换装分组新增单选选择器 --- code/th_01_base.js | 10 +++++++++ code/th_04_theme.js | 52 +++++++++++++++++++++++++++++++++++++++++++++ manifest.json | 10 ++++----- manifest.sig | 2 +- 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/code/th_01_base.js b/code/th_01_base.js index bd4f13d..108e0e3 100644 --- a/code/th_01_base.js +++ b/code/th_01_base.js @@ -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" }, diff --git a/code/th_04_theme.js b/code/th_04_theme.js index c190a55..5aeecb7 100644 --- a/code/th_04_theme.js +++ b/code/th_04_theme.js @@ -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; diff --git a/manifest.json b/manifest.json index 47af78c..e1df064 100644 --- a/manifest.json +++ b/manifest.json @@ -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 } diff --git a/manifest.sig b/manifest.sig index f3bb11d..9ded32a 100644 --- a/manifest.sig +++ b/manifest.sig @@ -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