From 32fe099fab3b948152212e5039bd6d53e022abe8 Mon Sep 17 00:00:00 2001 From: 7015725 Date: Fri, 22 May 2026 04:27:45 +0800 Subject: [PATCH] fix: make ToolHub UI actions responsive --- code/th_04_theme.js | 35 ++++++++++++++++++++++------------- code/th_07_shortcut.js | 5 +++-- code/th_14_panels.js | 10 ++++++++-- code/th_15_extra.js | 9 ++++++--- manifest.json | 18 +++++++++--------- manifest.sig | 2 +- 6 files changed, 49 insertions(+), 30 deletions(-) diff --git a/code/th_04_theme.js b/code/th_04_theme.js index b151165..93d387f 100644 --- a/code/th_04_theme.js +++ b/code/th_04_theme.js @@ -281,21 +281,30 @@ FloatBallAppWM.prototype.ui = { var pasteBtn = this.createFlatButton(app, "粘贴", this.colors.accent, function() { try { var cb = context.getSystemService(android.content.Context.CLIPBOARD_SERVICE); - if (cb.hasPrimaryClip()) { - var item = cb.getPrimaryClip().getItemAt(0); - if (item) { - var txt = item.getText(); - if (txt) { - var st = String(txt); - var old = String(et.getText()); - if (old.length > 0) et.setText(old + st); - else et.setText(st); - et.setSelection(et.getText().length()); - } - } - } else { + if (!cb || !cb.hasPrimaryClip()) { app.toast("剪贴板为空"); + return; } + var clip = cb.getPrimaryClip(); + if (!clip || clip.getItemCount() <= 0) { + app.toast("剪贴板为空"); + return; + } + var item = clip.getItemAt(0); + if (!item) { + app.toast("剪贴板为空"); + return; + } + var txt = item.getText(); + if (txt === null || txt === undefined || String(txt).length === 0) { + app.toast("剪贴板不是文本内容"); + return; + } + var st = String(txt); + var old = String(et.getText()); + if (old.length > 0) et.setText(old + st); + else et.setText(st); + et.setSelection(et.getText().length()); } catch (eP) { app.toast("粘贴失败: " + eP); } diff --git a/code/th_07_shortcut.js b/code/th_07_shortcut.js index 3c04ea3..6f336a5 100644 --- a/code/th_07_shortcut.js +++ b/code/th_07_shortcut.js @@ -1577,12 +1577,13 @@ FloatBallAppWM.prototype.showIconPicker = function(opts) { if (e.getAction() === android.view.MotionEvent.ACTION_DOWN) { try { var rect = new android.graphics.Rect(); - if (state.root) { - state.root.getGlobalVisibleRect(rect); + if (panel) { + panel.getGlobalVisibleRect(rect); var x = e.getRawX(); var y = e.getRawY(); if (!rect.contains(x, y)) { hide(); + return true; } } } catch(eOut) { safeLog(null, 'e', "catch " + String(eOut)); } diff --git a/code/th_14_panels.js b/code/th_14_panels.js index 9511562..9e14c03 100644 --- a/code/th_14_panels.js +++ b/code/th_14_panels.js @@ -3453,8 +3453,14 @@ scRefreshTv.setOnClickListener(new android.view.View.OnClickListener({ try { __scIconCache = {}; } catch(eC0) { safeLog(null, 'e', "catch " + String(eC0)); } try { __scIconKeys = []; } catch(eC1) { safeLog(null, 'e', "catch " + String(eC1)); } try { __scIconInFlight = {}; } catch(eC2) { safeLog(null, 'e', "catch " + String(eC2)); } - // 若当前已展开,立即触发重新加载与渲染 - if (scInlineState.expanded) __scEnsureLoadedAndRender(); + // 点击刷新时给用户即时反馈;折叠状态下自动展开并加载,避免看起来无效。 + if (!scInlineState.expanded) { + scInlineState.expanded = true; + try { scBody.setVisibility(android.view.View.VISIBLE); } catch(eV) { safeLog(null, 'e', "catch " + String(eV)); } + try { scArrowTv.setText("▲"); } catch(eA) { safeLog(null, 'e', "catch " + String(eA)); } + } + __scEnsureLoadedAndRender(); + try { self.toast("正在刷新快捷方式"); } catch(eToast) {} } catch(eR) { safeLog(null, 'e', "catch " + String(eR)); } } })); diff --git a/code/th_15_extra.js b/code/th_15_extra.js index 79ef0ee..ff5a1b0 100644 --- a/code/th_15_extra.js +++ b/code/th_15_extra.js @@ -653,7 +653,7 @@ FloatBallAppWM.prototype.buildToolAppPreviewBody = function(entry) { var btnBack = this.ui.createFlatButton(this, "‹", T.brown, function() {}); btnBack.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 24); btnBack.setPadding(this.dp(8), 0, this.dp(8), 0); - try { btnBack.setClickable(false); } catch(eBackClick) {} + try { btnBack.setClickable(false); btnBack.setAlpha(0.45); } catch(eBackClick) {} try { btnBack.setBackground(this.ui.createStrokeDrawable(T.primarySoft, this.withAlpha(T.primaryDeep, isDark ? 0.30 : 0.22), this.dp(1), this.dp(18))); } catch(eBackBg) {} bar.addView(btnBack, new android.widget.LinearLayout.LayoutParams(this.dp(42), this.dp(38))); @@ -674,7 +674,7 @@ FloatBallAppWM.prototype.buildToolAppPreviewBody = function(entry) { btnClose.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, r === "settings" ? 12 : 18); btnClose.setTypeface(null, android.graphics.Typeface.BOLD); btnClose.setPadding(this.dp(10), 0, this.dp(10), 0); - try { btnClose.setClickable(false); } catch(eRightClick) {} + try { btnClose.setClickable(false); btnClose.setAlpha(0.45); } catch(eRightClick) {} try { btnClose.setBackground(this.ui.createStrokeDrawable(T.primarySoft, this.withAlpha(T.primaryDeep, isDark ? 0.30 : 0.22), this.dp(1), this.dp(18))); } catch(eRightBg) {} bar.addView(btnClose, new android.widget.LinearLayout.LayoutParams(this.dp(104), this.dp(38))); var barLp = new android.widget.LinearLayout.LayoutParams(-1, topBarHeight); @@ -1143,11 +1143,14 @@ FloatBallAppWM.prototype.updateToolAppShellChrome = function(title, canBack) { var r = String(this.state.toolAppRoute || ""); var titleText = String(title || "ToolHub"); if (r === "settings") titleText = "❧ 岛屿设置 ❧"; + var hasBack = false; + try { hasBack = !!(this.hasToolAppBackTarget && this.hasToolAppBackTarget()); } catch(eHasBack) { hasBack = !!canBack; } if (this.state.toolAppTitleView) this.state.toolAppTitleView.setText(titleText); if (this.state.toolAppBackButton) { - this.state.toolAppBackButton.setText("‹"); + this.state.toolAppBackButton.setText(hasBack ? "‹" : "✕"); this.state.toolAppBackButton.setVisibility(android.view.View.VISIBLE); this.state.toolAppBackButton.setEnabled(true); + try { this.state.toolAppBackButton.setAlpha(1.0); } catch(eAlpha) {} } if (this.state.toolAppRightButton) { if (r === "settings") this.state.toolAppRightButton.setText("📖 岛务手册"); diff --git a/manifest.json b/manifest.json index 1bfa777..ea10d2c 100644 --- a/manifest.json +++ b/manifest.json @@ -14,8 +14,8 @@ "size": 5598 }, "th_04_theme.js": { - "sha256": "b839d36cfdf9ed66cb207673119ec4f4567f4afca93a9ca8ca0a52fd01e1ded6", - "size": 41840 + "sha256": "dbfce3c493438843dc7285765f61007b24df5db972b8877a81c4b86ae7b9f7ec", + "size": 42168 }, "th_05_persistence.js": { "sha256": "8cc52d3dacc8ac3c1b5aecf6fc399a2fe516402955799eddbd07dc9195c10d40", @@ -26,8 +26,8 @@ "size": 22909 }, "th_07_shortcut.js": { - "sha256": "7b2dbd1e35c636cca4ccce335dfb9e0b972342972ce012116ff4bbcfc438caa1", - "size": 72992 + "sha256": "8e70adda0d73930e2afc1eba488e95016fc2f739ba199834a30bec015fa6156c", + "size": 73011 }, "th_08_content.js": { "sha256": "8a76f15dfd1292081cba4b2dd218424be66540350e2807065421a6176a86c2db", @@ -54,12 +54,12 @@ "size": 21198 }, "th_14_panels.js": { - "sha256": "7f67c1a1d0fbffb125837269f8475226e00b79017f5503c406c9f06d37f1ddea", - "size": 294524 + "sha256": "ad0db8e379445b83fd3c86d335b12f084498e1dd876550039a25a9c9d7e12803", + "size": 294962 }, "th_15_extra.js": { - "sha256": "11a9866ba156c2a7862633530eb0d796a9955698a0c3fad4199dcccd4bb27c47", - "size": 104307 + "sha256": "f607f0a5e66a7e9a5ef0c2af8eeda78200138c08438bd6a315d1dc7235e55dc7", + "size": 104599 }, "th_16_entry.js": { "sha256": "6c59d9891cd010647f84c3db93f1cf95c7bbfb758470ea21044bf72eb8ff73d1", @@ -68,5 +68,5 @@ }, "keyId": "toolhub-targets-2026-rsa3072", "schema": 2, - "version": 20260521201044 + "version": 20260521202619 } diff --git a/manifest.sig b/manifest.sig index b3834f3..add5ab8 100644 --- a/manifest.sig +++ b/manifest.sig @@ -1 +1 @@ -QBhY334RgIq6jCCuUNhhW9Uc+Fth5elIZGxYlfkuggQarZnoII1Hxrlsl0P3kUZHSy1iR7RxCTlp+VJ8ELHEpDnWKHOoObN3n36Nxw8cEHY9cNwNAJq9aAETz2R5Tnt7i6Pfi6/GelqOh9RZXNLTcFhywtxqfCaERMQ3mKSeDg71sb0SFGWHUKBgTnTY1mvz/BYfJNsu3gaO1lR5LX4bg3H9kUngqIoXp5EdAo4zhn7XQvuHK/OLKUktfIW+vlFrBlTDfMsfYHX1ajjAdrRYN6z6bumH7agGitRsmKATB/bTtFS4fcatrZrwJUdz7ZQVXM0X4AQP7B//4jHXPcRtg8EkhkqZVxgAw95turMFncg/q8crRtVz1jdtBvMbDYVAu46uop97Xs++IbYmrdAkfqsSYjbLOjUh1Egcq55qKbFwQjWswsRqbwv9zjY/My/5YGJeJCy7QFAxgedTWdgPqtjDvBAUj4pxvuW7xlKkSBWYCtZbGc2mZ07euxyVIPg3 +C+0TNFqO1QyV/26OJ39wLL93yh2hYFvWynTRwctmWnpLwF8sDUiTxhija5KG3yvJtvQ8cVe6JFHqbCkx/IFuiXVg8xnsr/L91vSiJYdRQvsH/nSl9yuUMik0v5OyMYebVHwsoM/TysbvsH8SdGnbkWjjWsK1wLJxdKrk5PlbQHz7ZskMOJoQn/LUkt9DhTuapalyBZrTh3UQktG/Xg9rRhZUKafgBLBfb9RD1F8jgebY2MN+I7AkeMMIhUv9Eob/pmw598fI7Pr0MKgDVN4Ge8ZIINhthyjFcFz+owToubauW/iAneGEROeZJ9/874c071tyfuCZhH6TMc7BH26VOmv7bq+Rqr0EsRNhFfxnPmPczIX+92Tgp0ppI+xErBN+/rFtLnPBPbfhTTbDt+Q88gxH0jx95Nx9e4Kz/dh1ffJx1oUxGcI78JkyEo68QCIhKgKTmhw7FoQRYoV33Fl+jRxRtBqbMww5oTZd+0u8Wg7FR4iqHDe7o6SlCjnCT7sk