From 1a7cefc63011fcfc805604cb211c3c6e8fabde5d Mon Sep 17 00:00:00 2001 From: 7015725 Date: Tue, 19 May 2026 00:26:11 +0800 Subject: [PATCH] feat: add ToolHub badge and back gesture settings --- code/th_01_base.js | 14 ++++++++++++-- code/th_05_persistence.js | 12 ++++++++++++ code/th_14_panels.js | 7 +++++-- code/th_15_extra.js | 38 +++++++++++++++++--------------------- manifest.json | 18 +++++++++--------- manifest.sig | 2 +- 6 files changed, 56 insertions(+), 35 deletions(-) diff --git a/code/th_01_base.js b/code/th_01_base.js index b47bea9..84ec7aa 100644 --- a/code/th_01_base.js +++ b/code/th_01_base.js @@ -91,7 +91,7 @@ var ConfigValidator = { // 图标配置 BALL_ICON_TYPE: { type: "enum", values: ["app", "file", "android", "shortx"], default: "app" }, BALL_ICON_RES_ID: { type: "int", min: 0, max: 999999, default: 0 }, - BALL_ICON_SIZE_DP: { type: "int", min: 16, max: 64, default: 22 }, + BALL_ICON_SIZE_DP: { type: "int", min: 12, max: 80, default: 22 }, BALL_PNG_MODE: { type: "int", min: 0, max: 2, default: 1 }, BALL_IDLE_ALPHA: { type: "float", min: 0.1, max: 1.0, default: 0.6 }, @@ -99,6 +99,9 @@ var ConfigValidator = { LONG_PRESS_MS: { type: "int", min: 200, max: 2000, default: 600 }, LONG_PRESS_VIBRATE_MS: { type: "int", min: 10, max: 100, default: 40 }, CLICK_SLOP_DP: { type: "int", min: 2, max: 20, default: 6 }, + TOOLAPP_BACK_EDGE_WIDTH_DP: { type: "int", min: 12, max: 48, default: 22 }, + TOOLAPP_BACK_COMMIT_DISTANCE_DP: { type: "int", min: 48, max: 160, default: 72 }, + TOOLAPP_BACK_PROGRESS_DISTANCE_DP: { type: "int", min: 120, max: 320, default: 180 }, // 功能开关 ENABLE_SNAP_TO_EDGE: { type: "bool", default: true }, @@ -729,6 +732,9 @@ var ConfigManager = { ENABLE_LONG_PRESS: true, LONG_PRESS_MS: 520, CLICK_SLOP_DP: 6, + TOOLAPP_BACK_EDGE_WIDTH_DP: 22, + TOOLAPP_BACK_COMMIT_DISTANCE_DP: 72, + TOOLAPP_BACK_PROGRESS_DISTANCE_DP: 180, ENABLE_BOUNCE: true, BOUNCE_TIMES: 2, BOUNCE_MAX_SCALE: 0.88, @@ -796,6 +802,7 @@ var ConfigManager = { { key: "BALL_ICON_FILE_PATH", name: "已选择的图标文件", type: "text" }, { key: "BALL_ICON_RES_NAME", name: "岛上图标", type: "ball_shortx_icon" }, { key: "BALL_ICON_TINT_HEX", name: "徽章颜色", type: "ball_color" }, + { key: "BALL_ICON_SIZE_DP", name: "徽章大小", type: "int", min: 12, max: 80, step: 1 }, { key: "BALL_BG_COLOR_HEX", name: "球体背景", type: "ball_color" }, { key: "BALL_IDLE_ALPHA", name: "安静时透明度", type: "float", min: 0.1, max: 1.0, step: 0.05 }, @@ -837,6 +844,9 @@ var ConfigManager = { { type: "section", name: "触摸与手势" }, { key: "CLICK_SLOP_DP", name: "点击位移阈值(dp)", type: "int", min: 1, max: 40, step: 1 }, + { key: "TOOLAPP_BACK_EDGE_WIDTH_DP", name: "设置页返回边界宽度", type: "int", min: 12, max: 48, step: 1 }, + { key: "TOOLAPP_BACK_COMMIT_DISTANCE_DP", name: "设置页返回触发距离", type: "int", min: 48, max: 160, step: 1 }, + { key: "TOOLAPP_BACK_PROGRESS_DISTANCE_DP", name: "设置页返回动画距离", type: "int", min: 120, max: 320, step: 1 }, { key: "ENABLE_LONG_PRESS", name: "启用长按", type: "bool" }, { key: "LONG_PRESS_MS", name: "长按判定(ms)", type: "int", min: 200, max: 2000, step: 10 }, { key: "LONG_PRESS_HAPTIC_ENABLE", name: "长按震动反馈", type: "bool" }, @@ -873,7 +883,7 @@ var ConfigManager = { var needReset = false; if (s) { var sStr = JSON.stringify(s); - if (sStr.indexOf("ENABLE_SNAP_TO_EDGE") < 0 || sStr.indexOf("ENABLE_ANIMATIONS") < 0 || sStr.indexOf("BALL_IDLE_ALPHA") < 0 || sStr.indexOf("PANEL_POS_GRAVITY") < 0 || sStr.indexOf("single_choice") < 0 || sStr.indexOf("ball_shortx_icon") < 0 || sStr.indexOf("ball_color") < 0 || sStr.indexOf("SETTINGS_THEME") < 0 || sStr.indexOf("BALL_BG_COLOR_HEX") < 0) { + if (sStr.indexOf("ENABLE_SNAP_TO_EDGE") < 0 || sStr.indexOf("ENABLE_ANIMATIONS") < 0 || sStr.indexOf("BALL_IDLE_ALPHA") < 0 || sStr.indexOf("PANEL_POS_GRAVITY") < 0 || sStr.indexOf("single_choice") < 0 || sStr.indexOf("ball_shortx_icon") < 0 || sStr.indexOf("ball_color") < 0 || sStr.indexOf("SETTINGS_THEME") < 0 || sStr.indexOf("BALL_BG_COLOR_HEX") < 0 || sStr.indexOf("BALL_ICON_SIZE_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_EDGE_WIDTH_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_COMMIT_DISTANCE_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_PROGRESS_DISTANCE_DP") < 0) { needReset = true; } } else { diff --git a/code/th_05_persistence.js b/code/th_05_persistence.js index 4f269fc..1705370 100644 --- a/code/th_05_persistence.js +++ b/code/th_05_persistence.js @@ -319,6 +319,18 @@ FloatBallAppWM.prototype.applyImmediateEffectsForKey = function(k) { } if (k === "BALL_SIZE_DP" || k === "BALL_PNG_MODE" || k === "BALL_ICON_TYPE" || k === "BALL_ICON_FILE_PATH" || k === "BALL_ICON_RES_ID" || k === "BALL_ICON_RES_NAME" || k === "BALL_ICON_SIZE_DP" || k === "BALL_ICON_TINT_HEX" || k === "BALL_BG_COLOR_HEX") { this.rebuildBallForNewSize(); return; } + if (k === "TOOLAPP_BACK_EDGE_WIDTH_DP") { + try { + if (this.state.toolAppActive && this.hideToolAppScreenBackStrips && this.showToolAppScreenBackStrips) { + this.hideToolAppScreenBackStrips(); + this.showToolAppScreenBackStrips(); + } + } catch(eBackStrip) { + safeLog(this.L, "w", "apply back edge width fail: " + String(eBackStrip)); + } + return; + } + if (k === "PANEL_ROWS" || k === "PANEL_COLS" || k === "PANEL_ITEM_SIZE_DP" || k === "PANEL_GAP_DP" || k === "PANEL_PADDING_DP" || k === "PANEL_ICON_SIZE_DP" || diff --git a/code/th_14_panels.js b/code/th_14_panels.js index 06887a1..266c02a 100644 --- a/code/th_14_panels.js +++ b/code/th_14_panels.js @@ -332,11 +332,9 @@ FloatBallAppWM.prototype.buildSettingsHomePanelView = function() { if (useMonetHome) { this.createSettingsHomeSectionHeader(box, "▦", "工具与配置"); this.createSettingsHomeEntry(box, "工具", "添加、整理和排序工具入口", "", function() { self.pushToolAppPage("btn_editor"); }); - this.createSettingsHomeEntry(box, "配置结构", "编辑分组、布局和高级结构", "", function() { self.pushToolAppPage("schema_editor"); }); } else { this.createSettingsHomeSectionHeader(box, "🧰", "布局与管理"); this.createSettingsHomeEntry(box, "工具伙伴", "添加、整理和安排你的工具伙伴", "", function() { self.pushToolAppPage("btn_editor"); }); - this.createSettingsHomeEntry(box, "岛屿蓝图", "自定义岛屿布局,适合进阶布置", "", function() { self.pushToolAppPage("schema_editor"); }); this.addSettingsHomeDashedDivider(box); } var defs = this.getSettingsGroupDefs(); @@ -370,6 +368,11 @@ FloatBallAppWM.prototype.buildSettingsHomePanelView = function() { }); })(defs[k]); } + this.createSettingsHomeEntry(box, "高级蓝图", "编辑设置页结构和高级配置,适合进阶用户", "", function() { self.pushToolAppPage("schema_editor"); }); + } else { + this.addSettingsHomeDashedDivider(box); + this.createSettingsHomeSectionHeader(box, "⚙", "高级设置"); + this.createSettingsHomeEntry(box, "高级蓝图", "编辑设置页结构和高级配置,适合进阶用户", "", function() { self.pushToolAppPage("schema_editor"); }); } contentCard.addView(scroll, new android.widget.LinearLayout.LayoutParams(-1, 0, 1)); panel.addView(contentCard, new android.widget.LinearLayout.LayoutParams(-1, 0, 1)); diff --git a/code/th_15_extra.js b/code/th_15_extra.js index e5fc488..cd93ae1 100644 --- a/code/th_15_extra.js +++ b/code/th_15_extra.js @@ -507,7 +507,7 @@ FloatBallAppWM.prototype.getToolAppTitle = function(route) { if (this.state.editingSchemaIndex !== null && this.state.editingSchemaIndex !== undefined) { return (this.state.editingSchemaIndex === -1) ? "新增蓝图项" : "编辑蓝图项"; } - return "岛屿蓝图"; + return "高级蓝图"; } return "ToolHub"; }; @@ -786,15 +786,11 @@ FloatBallAppWM.prototype.createToolAppEdgeBackStrip = function(edge) { var validDir = (edge === 0 && mx > 0) || (edge === 1 && mx < 0); if (validDir && Math.abs(mx) > self.dp(4) && Math.abs(mx) > Math.abs(my)) { moved = true; - var panelW = 0; - try { panelW = Number((self.state.viewerPanelLp && self.state.viewerPanelLp.width) || 0); } catch (ePanelW0) {} - if (!panelW || panelW < self.dp(120)) { - try { panelW = Number((self.state.toolAppRoot && self.state.toolAppRoot.getWidth && self.state.toolAppRoot.getWidth()) || 0); } catch (ePanelW1) {} - } - if (!panelW || panelW < self.dp(120)) panelW = self.dp(420); - var triggerDistance = panelW * 0.38; - if (triggerDistance < self.dp(160)) triggerDistance = self.dp(160); - if (triggerDistance > self.dp(260)) triggerDistance = self.dp(260); + var triggerDp = Number(self.config.TOOLAPP_BACK_PROGRESS_DISTANCE_DP || 180); + if (isNaN(triggerDp)) triggerDp = 180; + if (triggerDp < 120) triggerDp = 120; + if (triggerDp > 320) triggerDp = 320; + var triggerDistance = self.dp(triggerDp); var p = Math.min(1, Math.abs(mx) / triggerDistance); self.applyToolAppBackPreviewProgress(edge, p); } @@ -803,15 +799,11 @@ FloatBallAppWM.prototype.createToolAppEdgeBackStrip = function(edge) { if (action === android.view.MotionEvent.ACTION_UP || action === android.view.MotionEvent.ACTION_CANCEL) { var ux = event.getRawX() - downX; var uy = event.getRawY() - downY; - var panelW2 = 0; - try { panelW2 = Number((self.state.viewerPanelLp && self.state.viewerPanelLp.width) || 0); } catch (ePanelW2) {} - if (!panelW2 || panelW2 < self.dp(120)) { - try { panelW2 = Number((self.state.toolAppRoot && self.state.toolAppRoot.getWidth && self.state.toolAppRoot.getWidth()) || 0); } catch (ePanelW3) {} - } - if (!panelW2 || panelW2 < self.dp(120)) panelW2 = self.dp(420); - var completeDistance = panelW2 * 0.18; - if (completeDistance < self.dp(64)) completeDistance = self.dp(64); - if (completeDistance > self.dp(120)) completeDistance = self.dp(120); + var commitDp = Number(self.config.TOOLAPP_BACK_COMMIT_DISTANCE_DP || 72); + if (isNaN(commitDp)) commitDp = 72; + if (commitDp < 48) commitDp = 48; + if (commitDp > 160) commitDp = 160; + var completeDistance = self.dp(commitDp); var okDir = (edge === 0 && ux > completeDistance) || (edge === 1 && ux < -completeDistance); var ok = (action === android.view.MotionEvent.ACTION_UP) && moved && okDir && Math.abs(ux) > Math.abs(uy) * 1.2; active = false; @@ -852,7 +844,11 @@ FloatBallAppWM.prototype.showToolAppScreenBackStrips = function() { if (sw <= 1) { try { var ss = this.getScreenSizePx(); sw = ss.w; } catch (eScreen) {} } - var stripW = this.dp(22); + var stripDp = Number(this.config.TOOLAPP_BACK_EDGE_WIDTH_DP || 22); + if (isNaN(stripDp)) stripDp = 22; + if (stripDp < 12) stripDp = 12; + if (stripDp > 48) stripDp = 48; + var stripW = this.dp(stripDp); var flags = android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; @@ -1307,7 +1303,7 @@ FloatBallAppWM.prototype.showPanelAvoidBall = function(which) { var titleMap = { "settings": "设置", "btn_editor": "按钮管理", - "schema_editor": "布局管理" + "schema_editor": "高级蓝图" }; var title = titleMap[which] || "面板"; diff --git a/manifest.json b/manifest.json index c30481d..c834213 100644 --- a/manifest.json +++ b/manifest.json @@ -2,8 +2,8 @@ "alg": "SHA256withRSA", "files": { "th_01_base.js": { - "sha256": "f275c5964348a06601258d96ede4de9040f1e1d47076bedb405bb1a8ce8465ac", - "size": 53093 + "sha256": "49b97160e851877c00fe6cebbc2e94edee87b2b0cc63e76237e58d31af7bb8b8", + "size": 54172 }, "th_02_core.js": { "sha256": "15bb9bfbd19a673d442e221b0a00a456ed5f87af2666b9c73b117d6223faeecd", @@ -18,8 +18,8 @@ "size": 40227 }, "th_05_persistence.js": { - "sha256": "24f42d714342f6a7f8a726d5acf3670bfaa280937e75f1319cca53794fcd5a56", - "size": 14819 + "sha256": "a8b8e8e34600c70c710f906c832e9ca48c609f2257700b43b313753ce0603b49", + "size": 15231 }, "th_06_icon_parser.js": { "sha256": "25b95a5df634a7ee359f3ab798e4d3154a71c24016f7b4bf8a658096644b2484", @@ -54,12 +54,12 @@ "size": 21198 }, "th_14_panels.js": { - "sha256": "d14a0e9093918911406c314a5a27a75e50d2d52ed3771997729d193ff6514150", - "size": 261858 + "sha256": "185d7ed9d85ffa7e31b70abbd425c0d79d6a435a4c5cb6dc7610d942fdc0fc87", + "size": 262019 }, "th_15_extra.js": { - "sha256": "19e1720032b6cfbb72f561ff18e9fea7d9d741fc4bb1421700a1f18b4c439fc7", - "size": 96634 + "sha256": "f3e92febb017f88cb5484d368e10bd6d69baa7dd50ac39c01c381fa9d7f71bd5", + "size": 96070 }, "th_16_entry.js": { "sha256": "e7c99c3dfbd6aedab05551426955081ae6cae034754f2f557cefa01dc75dc001", @@ -68,5 +68,5 @@ }, "keyId": "toolhub-targets-2026-rsa3072", "schema": 2, - "version": 20260518161003 + "version": 20260518162547 } diff --git a/manifest.sig b/manifest.sig index 46b2594..567c378 100644 --- a/manifest.sig +++ b/manifest.sig @@ -1 +1 @@ -CfuxxR8N3bqjMiymTDYCSFfTmNWxGDbMpCT3FYUSznB3mJueI0ajadduxg1tDCV6X5ssh+4pCE0jwql9+MTH2hJLYJLsaaI8uswaVAUnsTbV9OdLLc6vtXscNaVm54hJ0eg1UyReQinxaqRKqNsMrqkftIDDAw0QGfZPF3ehqvB/wp6cK1jfcLtPiVcnORXUwVntyeiEQqpkVDTK0ovz8eOOYS1kCW3b21tqDwuJ7BvvNM9sDuXF8wdmayxD7vi98IOIeJcw9KnRhHcHxQCOVQ3UUQ115H4V4fA0GHQ6Ae2BzVQ68XQ0nTrZDh2tYF1u7aj1Dg+vnEL9hk/2LJK9wdtPFOCpMrygUVqSN7lLe7tTaCOMwUavV2TmMvwKPBvoIQCdd9gh47j54FsmW1srwHjtWIsGkiwBglc1aiDsq33kcuSc7F7+PCrXNkEB0pk3pS0ZQ66Q0AsxVN48e3iJ0iuHemzZn8fyanRfW8u7hazT3tK89RjlA5OqXkO4j1Gb +LHqLlyMtbfnUs3QuarMMSqyZmIp+zaCcxL+8saFVXCddkflDe1ihMb+W+n4khdm0BvHeycBxPneJgbaeyMdNXnIRgwNmy0QnpLUGzoQp7UmQwIdaTzuOM97vFQ0W2UY8eXwfbSCGtS3QdFeGsD6HcSlijVU8SpsE7oW7uYeG+VqB/tWLF67rb9Ng4UyJVZ9R4RbfP+qmPpcf4YeZIFLg8jgnVPaAfh1RI6Nwg0US8G2jbxnPesF4if1VeJ1g5odp1iwDARLjs4uEpqwbRQ87we4GpDHea1h+o4Qx4jB8/hxzgqlAIDak8PCRo2D7cNiCnZ0jrGNwTXAX0ew9WXhTkYOdP/4pr9qam666Z9wu8vP4Bf2Kd75ZX+IFKH1anhUBL/Y1QB/1MMjYJg4bjj/shsm2WCnV+nlsDDOKLqzaX27ojNjKF324mQlDm6bZ9S3AtR1fbdWhJqD01ktiAyZ3IymaqkKU75S4CDKg8+RmRGO1YygfCrMzPg9vriXKQtt7