From 648b45585a6bb47cb783f7b27c52f5f18fe79f33 Mon Sep 17 00:00:00 2001 From: 7015725 Date: Wed, 13 May 2026 08:15:45 +0800 Subject: [PATCH] style: simplify button manager layout --- code/th_14_panels.js | 162 +++++++++---------------- manifest.json | 6 +- manifest.sig | 2 +- scripts/verify_button_editor_layout.py | 5 +- 4 files changed, 63 insertions(+), 112 deletions(-) diff --git a/code/th_14_panels.js b/code/th_14_panels.js index ec3ab1e..3adc17e 100644 --- a/code/th_14_panels.js +++ b/code/th_14_panels.js @@ -515,7 +515,7 @@ FloatBallAppWM.prototype.createButtonManagerSummaryCard = function(parent, total try { card.setElevation(this.dp(2)); } catch(eElev) { safeLog(null, 'e', "catch " + String(eElev)); } var title = new android.widget.TextView(context); - title.setText("按钮管理首页"); + title.setText("按钮统计"); title.setTextColor(isDark ? C.textPriDark : C.textPriLight); title.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 15); title.setTypeface(null, android.graphics.Typeface.BOLD); @@ -776,7 +776,7 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() { // 提示文字 (左侧) var hintTv = new android.widget.TextView(context); - hintTv.setText("长按卡片排序"); + hintTv.setText("点卡片编辑"); hintTv.setTextColor(subTextColor); hintTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 12); header.addView(hintTv); @@ -808,7 +808,25 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() { else enabledCount++; } } catch(eCnt) { safeLog(null, 'e', "catch " + String(eCnt)); } - self.createButtonManagerPolishedCard(panel, "按钮管理首页", "点卡片编辑;下方操作区负责排序、启用和删除", "共 " + buttons.length + " 个 · 已启用 " + enabledCount + " · 已禁用 " + disabledCount); + var statsStrip = new android.widget.LinearLayout(context); + statsStrip.setOrientation(android.widget.LinearLayout.VERTICAL); + statsStrip.setPadding(self.dp(12), self.dp(8), self.dp(12), self.dp(8)); + statsStrip.setBackground(self.ui.createRoundDrawable(isDark ? self.withAlpha(C.cardDark, 0.42) : self.withAlpha(C.cardLight, 0.48), self.dp(14))); + var statsTv = new android.widget.TextView(context); + statsTv.setText("共 " + buttons.length + " 个 · 已启用 " + enabledCount + " · 已禁用 " + disabledCount); + statsTv.setTextColor(textColor); + statsTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 13); + statsTv.setTypeface(null, android.graphics.Typeface.BOLD); + statsStrip.addView(statsTv); + var statsHint = new android.widget.TextView(context); + statsHint.setText("点卡片进入编辑;用上移/下移调整顺序"); + statsHint.setTextColor(subTextColor); + statsHint.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 11); + statsHint.setPadding(0, self.dp(3), 0, 0); + statsStrip.addView(statsHint); + var statsLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT); + statsLp.setMargins(self.dp(2), 0, self.dp(2), self.dp(8)); + panel.addView(statsStrip, statsLp); // 按钮管理搜索卡片:搜索输入与操作按钮收在同一张卡片里,避免顶部显得零散。 var searchSurface = new android.widget.LinearLayout(context); @@ -948,130 +966,60 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() { mainRow.addView(textContainer); - // 右侧操作区 + // 操作区:文字 chip 横排,替代孤立箭头,降低别扭感。 var actions = new android.widget.LinearLayout(context); actions.setOrientation(android.widget.LinearLayout.HORIZONTAL); - actions.setGravity(android.view.Gravity.CENTER_VERTICAL); - actions.setPadding(self.dp(42), 0, 0, 0); // 上移/下移(排序按钮布局优化:扩大点击面积,顶部/底部也占位,避免难点) - // 说明:原先 ▲▼ 太小且只有可用时才出现,手指很难点中;这里改为固定 2 个大按钮(44dp),不可用则置灰禁用。 - var sortBox = new android.widget.LinearLayout(context); - sortBox.setOrientation(android.widget.LinearLayout.HORIZONTAL); // # 排序按钮改为横向排列,减少占高 - sortBox.setGravity(android.view.Gravity.CENTER); + actions.setGravity(android.view.Gravity.RIGHT | android.view.Gravity.CENTER_VERTICAL); + actions.setPadding(self.dp(42), 0, 0, 0); - // 按钮公共样式 - var mkSortBtn = function(txt, enabled, onClickFn) { - var tv = new android.widget.TextView(context); - tv.setText(txt); - tv.setGravity(android.view.Gravity.CENTER); - tv.setTextSize(12); // # 排序按钮适量缩小字号 - tv.setMinWidth(self.dp(36)); // # 排序按钮适量缩小点击块 - tv.setMinHeight(self.dp(36)); // # 排序按钮适量缩小点击块 - tv.setPadding(0, 0, 0, 0); - - // 轻量边框+圆角,提升"可点击"视觉 - try { - var bg = new android.graphics.drawable.GradientDrawable(); - bg.setColor(android.graphics.Color.TRANSPARENT); - bg.setCornerRadius(self.dp(8)); // # 小一点圆角更紧凑 - bg.setStroke(self.dp(1), self.withAlpha(subTextColor, 0.22)); - tv.setBackground(bg); - } catch(eBg) { safeLog(null, 'e', "catch " + String(eBg)); } - - if (!enabled) { - tv.setEnabled(false); - tv.setTextColor(self.withAlpha(subTextColor, 0.25)); - } else { - tv.setEnabled(true); - tv.setTextColor(subTextColor); - tv.setOnClickListener(new android.view.View.OnClickListener({ - onClick: function() { - try { onClickFn(); } catch(eSort) { safeLog(null, 'e', "catch " + String(eSort)); } - } - })); - } - return tv; - }; - - // 上移按钮(顶部也占位) var canUp = (idx > 0); - var u = mkSortBtn("▲", canUp, function() { + var btnUp = self.createButtonManagerActionChip("上移", canUp ? subTextColor : self.withAlpha(subTextColor, 0.25), self.withAlpha(subTextColor, canUp ? 0.24 : 0.12), canUp ? function() { var temp = buttons[idx]; buttons[idx] = buttons[idx - 1]; buttons[idx - 1] = temp; refreshPanel(); - }); - sortBox.addView(u); + } : null); + try { btnUp.setEnabled(canUp); } catch(eUpEn) {} + actions.addView(btnUp); - // 下移按钮(底部也占位) var canDown = (idx < buttons.length - 1); - var d = mkSortBtn("▼", canDown, function() { + var btnDown = self.createButtonManagerActionChip("下移", canDown ? subTextColor : self.withAlpha(subTextColor, 0.25), self.withAlpha(subTextColor, canDown ? 0.24 : 0.12), canDown ? function() { var temp = buttons[idx]; buttons[idx] = buttons[idx + 1]; buttons[idx + 1] = temp; refreshPanel(); + } : null); + try { + var lpDown = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT); + lpDown.leftMargin = self.dp(6); + btnDown.setLayoutParams(lpDown); + btnDown.setEnabled(canDown); + } catch(eDownLp) {} + actions.addView(btnDown); + + var btnToggle = self.createButtonManagerActionChip(__enabled ? "禁用" : "启用", __enabled ? self.withAlpha(subTextColor, 0.9) : self.withAlpha(C.success, 0.9), self.withAlpha(__enabled ? subTextColor : C.success, 0.24), function() { + try { + btnCfg.enabled = (btnCfg.enabled === false) ? true : false; + ConfigManager.saveButtons(buttons); + } catch(eTg) { safeLog(null, 'e', "catch " + String(eTg)); } + refreshPanel(); }); - // 两按钮之间留一点间距,避免误触 try { - var lpD = new android.widget.LinearLayout.LayoutParams( - android.view.ViewGroup.LayoutParams.WRAP_CONTENT, - android.view.ViewGroup.LayoutParams.WRAP_CONTENT - ); - lpD.leftMargin = self.dp(6); // # 横向排列:用左间距代替上间距 - d.setLayoutParams(lpD); - } catch(eLp) { safeLog(null, 'e', "catch " + String(eLp)); } - sortBox.addView(d); - - actions.addView(sortBox); - - // # 禁用/启用:管理页直接切换显示状态(禁用后按钮页不显示该按钮) - var btnToggle = new android.widget.TextView(context); - btnToggle.setText(__enabled ? "禁用" : "启用"); - btnToggle.setGravity(android.view.Gravity.CENTER); - btnToggle.setTextSize(12); - btnToggle.setMinWidth(self.dp(44)); - btnToggle.setMinHeight(self.dp(36)); - btnToggle.setPadding(self.dp(6), 0, self.dp(6), 0); - try { - var tgBg = new android.graphics.drawable.GradientDrawable(); - tgBg.setColor(android.graphics.Color.TRANSPARENT); - tgBg.setCornerRadius(self.dp(8)); - tgBg.setStroke(self.dp(1), self.withAlpha(subTextColor, 0.22)); - btnToggle.setBackground(tgBg); - } catch(eTgBg) { safeLog(null, 'e', "catch " + String(eTgBg)); } - btnToggle.setTextColor(__enabled ? self.withAlpha(subTextColor, 0.9) : self.withAlpha(C.success, 0.9)); - try { - var lpTg = new android.widget.LinearLayout.LayoutParams( - android.view.ViewGroup.LayoutParams.WRAP_CONTENT, - android.view.ViewGroup.LayoutParams.WRAP_CONTENT - ); + var lpTg = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT); lpTg.leftMargin = self.dp(6); btnToggle.setLayoutParams(lpTg); - } catch(eLpTg) { safeLog(null, 'e', "catch " + String(eLpTg)); } - btnToggle.setOnClickListener(new android.view.View.OnClickListener({ - onClick: function() { - try { - btnCfg.enabled = (btnCfg.enabled === false) ? true : false; - // # 立即持久化,避免面板关闭后丢失 - ConfigManager.saveButtons(buttons); - } catch(eTg) { safeLog(null, 'e', "catch " + String(eTg)); } - refreshPanel(); - } - })); + } catch(eLpTg) {} actions.addView(btnToggle); - // 删除按钮 - var btnDel = new android.widget.TextView(context); - btnDel.setText("✕"); // 垃圾桶图标更好,但这里用X - btnDel.setTextColor(self.withAlpha(C.danger, 0.7)); - btnDel.setTextSize(16); - btnDel.setPadding(self.dp(10), self.dp(10), self.dp(4), self.dp(10)); - btnDel.setOnClickListener(new android.view.View.OnClickListener({ - onClick: function() { - // 确认删除 - buttons.splice(idx, 1); - refreshPanel(); - } - })); + var btnDel = self.createButtonManagerActionChip("删除", self.withAlpha(C.danger, 0.85), self.withAlpha(C.danger, 0.28), function() { + buttons.splice(idx, 1); + refreshPanel(); + }); + try { + var lpDel = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT); + lpDel.leftMargin = self.dp(6); + btnDel.setLayoutParams(lpDel); + } catch(eLpDel) {} actions.addView(btnDel); card.addView(mainRow); diff --git a/manifest.json b/manifest.json index cd61a12..fe88768 100644 --- a/manifest.json +++ b/manifest.json @@ -54,8 +54,8 @@ "size": 20386 }, "th_14_panels.js": { - "sha256": "f3aaae49c54a7d5187d83c7408649c8206dac3c461a91bcd870a463a10b8a55f", - "size": 243664 + "sha256": "37ed575c0d6b86ebd5980555d7a148702042ef67a04e61bf9adabb851a04a0db", + "size": 241799 }, "th_15_extra.js": { "sha256": "44d19f0012f4182b9f9831d4f5a747b43d3b726f98e0480e6c79f54eeff70a5e", @@ -68,5 +68,5 @@ }, "keyId": "toolhub-targets-2026-rsa3072", "schema": 2, - "version": 20260512233842 + "version": 20260513001538 } diff --git a/manifest.sig b/manifest.sig index 59da26d..c64a297 100644 --- a/manifest.sig +++ b/manifest.sig @@ -1 +1 @@ -NJfls68utJFK3pZ/wxio4O0buAiyM4oZMpTS5b5JvNUQ3GNW1pEopJeu9sLvZWHxql7tmg/OjTrCVXB+JhwmeRILXcsFLLHp9ogvnHzqchiCUSuwilBWhB07r5fiIq23egUjNs25Z7nRtvx47WCp0lvM9YdMcHPNifPr82VpC9EtTD29Qw+gY+jjPm+GiScY88SvUnpZOVEf/XCh9tBeSz1YrIA+6D6TpfZrRY6dh4GFgLezKd5DNljqw3ig61to6wu0xJcz+v+l9PWq6zoMkTG7XUIP4AGVyKvzkDr7EM8wMjwUq5z6OQiwqp9yBaRx+Av7aGG9IwWz3NxFuYA86Y9z7L2t4e+Ajf1BMYC1vuThH0sG0lLERPWx4VjncOgVx2fthrmrGstF+BkqZW68rmscOIAKQ1Lxz0ySkDfhtKsaXk+xe43AQ1l9wAPIB7pk08TZPaSGY2zXE0/blUvr1TzrgXwK5wWRib0kZlEpOJTRbcItPt8iaAWAZixC0jwC +Gbl+DdtfJl2MYIMvlBUqDpmakkCpoEk+kpOF5HU2MtSz3AkC8XDz9QMIDZ0keff3fciptxdvYYIg8QqOfKob40akvscjyX4yQWos9CCPytMBrNrjjPMOpUSXsER8gZTb2pdGvweaVRr8ZZuWtoVPnqgIBlivvNMXfXBIZ973d12OeSsQiQrUCE8qXQm1R3t+hVhoht7yePxRC+6r3jKi8arWQOFOWNhTCDWNtWmvjvLUBxVuAHM82j8q8cD+bNstChRhNKeQfa2s/yod2LhBqM9ELd1rGtK9PXkizmeCW/mTR7s7Y3Mll2Fp+rNvV4xY8x9ql0uedUQ5UK7W3m/GSjPSNFZ/9UxobO8XIgGPf7V7a/weoa80vlvUkZs4YNFpnch7K7u/9tA30mfbayAQb9gR1JKahQJXPOz7Ru3++wOP5C53ZrzizVPUkLk7aGrUBLuZtolq7neJ/F398P6bIJou+bQ3DJT/1hYbVQTjuqGeu3YnpnRzoN3SGdVSaWDJ diff --git a/scripts/verify_button_editor_layout.py b/scripts/verify_button_editor_layout.py index 0a074a1..7b9823d 100644 --- a/scripts/verify_button_editor_layout.py +++ b/scripts/verify_button_editor_layout.py @@ -5,10 +5,13 @@ import sys root = pathlib.Path(__file__).resolve().parents[1] text = (root / "code" / "th_14_panels.js").read_text(encoding="utf-8") checks = [ - ("manager has polished helper", "createButtonManagerPolishedCard" in text), ("manager has action chip helper", "createButtonManagerActionChip" in text), ("manager card has two-row layout marker", "按钮管理列表卡片:上信息、下操作" in text), ("manager has search surface marker", "按钮管理搜索卡片" in text), + ("manager no false long-press sort text", "长按卡片排序" not in text), + ("manager no homepage title block", "按钮管理首页" not in text), + ("manager uses textual sort chips", "上移" in text and "下移" in text and "孤立箭头" in text), + ("manager uses delete chip", "createButtonManagerActionChip(\"删除\"" in text), ("editor has hero helper", "createButtonEditorHeroCard" in text), ("editor has field spacing helper", "addButtonEditorField" in text), ("editor hero visible text", "按钮编辑工作台" in text),