style: simplify button manager layout
This commit is contained in:
@@ -515,7 +515,7 @@ FloatBallAppWM.prototype.createButtonManagerSummaryCard = function(parent, total
|
|||||||
try { card.setElevation(this.dp(2)); } catch(eElev) { safeLog(null, 'e', "catch " + String(eElev)); }
|
try { card.setElevation(this.dp(2)); } catch(eElev) { safeLog(null, 'e', "catch " + String(eElev)); }
|
||||||
|
|
||||||
var title = new android.widget.TextView(context);
|
var title = new android.widget.TextView(context);
|
||||||
title.setText("按钮管理首页");
|
title.setText("按钮统计");
|
||||||
title.setTextColor(isDark ? C.textPriDark : C.textPriLight);
|
title.setTextColor(isDark ? C.textPriDark : C.textPriLight);
|
||||||
title.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 15);
|
title.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 15);
|
||||||
title.setTypeface(null, android.graphics.Typeface.BOLD);
|
title.setTypeface(null, android.graphics.Typeface.BOLD);
|
||||||
@@ -776,7 +776,7 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() {
|
|||||||
|
|
||||||
// 提示文字 (左侧)
|
// 提示文字 (左侧)
|
||||||
var hintTv = new android.widget.TextView(context);
|
var hintTv = new android.widget.TextView(context);
|
||||||
hintTv.setText("长按卡片排序");
|
hintTv.setText("点卡片编辑");
|
||||||
hintTv.setTextColor(subTextColor);
|
hintTv.setTextColor(subTextColor);
|
||||||
hintTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 12);
|
hintTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 12);
|
||||||
header.addView(hintTv);
|
header.addView(hintTv);
|
||||||
@@ -808,7 +808,25 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() {
|
|||||||
else enabledCount++;
|
else enabledCount++;
|
||||||
}
|
}
|
||||||
} catch(eCnt) { safeLog(null, 'e', "catch " + String(eCnt)); }
|
} 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);
|
var searchSurface = new android.widget.LinearLayout(context);
|
||||||
@@ -948,130 +966,60 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() {
|
|||||||
|
|
||||||
mainRow.addView(textContainer);
|
mainRow.addView(textContainer);
|
||||||
|
|
||||||
// 右侧操作区
|
// 操作区:文字 chip 横排,替代孤立箭头,降低别扭感。
|
||||||
var actions = new android.widget.LinearLayout(context);
|
var actions = new android.widget.LinearLayout(context);
|
||||||
actions.setOrientation(android.widget.LinearLayout.HORIZONTAL);
|
actions.setOrientation(android.widget.LinearLayout.HORIZONTAL);
|
||||||
actions.setGravity(android.view.Gravity.CENTER_VERTICAL);
|
actions.setGravity(android.view.Gravity.RIGHT | android.view.Gravity.CENTER_VERTICAL);
|
||||||
actions.setPadding(self.dp(42), 0, 0, 0); // 上移/下移(排序按钮布局优化:扩大点击面积,顶部/底部也占位,避免难点)
|
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);
|
|
||||||
|
|
||||||
// 按钮公共样式
|
|
||||||
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 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];
|
var temp = buttons[idx];
|
||||||
buttons[idx] = buttons[idx - 1];
|
buttons[idx] = buttons[idx - 1];
|
||||||
buttons[idx - 1] = temp;
|
buttons[idx - 1] = temp;
|
||||||
refreshPanel();
|
refreshPanel();
|
||||||
});
|
} : null);
|
||||||
sortBox.addView(u);
|
try { btnUp.setEnabled(canUp); } catch(eUpEn) {}
|
||||||
|
actions.addView(btnUp);
|
||||||
|
|
||||||
// 下移按钮(底部也占位)
|
|
||||||
var canDown = (idx < buttons.length - 1);
|
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];
|
var temp = buttons[idx];
|
||||||
buttons[idx] = buttons[idx + 1];
|
buttons[idx] = buttons[idx + 1];
|
||||||
buttons[idx + 1] = temp;
|
buttons[idx + 1] = temp;
|
||||||
refreshPanel();
|
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 {
|
try {
|
||||||
var lpD = new android.widget.LinearLayout.LayoutParams(
|
var lpTg = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||||
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
|
|
||||||
);
|
|
||||||
lpTg.leftMargin = self.dp(6);
|
lpTg.leftMargin = self.dp(6);
|
||||||
btnToggle.setLayoutParams(lpTg);
|
btnToggle.setLayoutParams(lpTg);
|
||||||
} catch(eLpTg) { safeLog(null, 'e', "catch " + String(eLpTg)); }
|
} catch(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();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
actions.addView(btnToggle);
|
actions.addView(btnToggle);
|
||||||
|
|
||||||
// 删除按钮
|
var btnDel = self.createButtonManagerActionChip("删除", self.withAlpha(C.danger, 0.85), self.withAlpha(C.danger, 0.28), function() {
|
||||||
var btnDel = new android.widget.TextView(context);
|
buttons.splice(idx, 1);
|
||||||
btnDel.setText("✕"); // 垃圾桶图标更好,但这里用X
|
refreshPanel();
|
||||||
btnDel.setTextColor(self.withAlpha(C.danger, 0.7));
|
});
|
||||||
btnDel.setTextSize(16);
|
try {
|
||||||
btnDel.setPadding(self.dp(10), self.dp(10), self.dp(4), self.dp(10));
|
var lpDel = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||||
btnDel.setOnClickListener(new android.view.View.OnClickListener({
|
lpDel.leftMargin = self.dp(6);
|
||||||
onClick: function() {
|
btnDel.setLayoutParams(lpDel);
|
||||||
// 确认删除
|
} catch(eLpDel) {}
|
||||||
buttons.splice(idx, 1);
|
|
||||||
refreshPanel();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
actions.addView(btnDel);
|
actions.addView(btnDel);
|
||||||
|
|
||||||
card.addView(mainRow);
|
card.addView(mainRow);
|
||||||
|
|||||||
@@ -54,8 +54,8 @@
|
|||||||
"size": 20386
|
"size": 20386
|
||||||
},
|
},
|
||||||
"th_14_panels.js": {
|
"th_14_panels.js": {
|
||||||
"sha256": "f3aaae49c54a7d5187d83c7408649c8206dac3c461a91bcd870a463a10b8a55f",
|
"sha256": "37ed575c0d6b86ebd5980555d7a148702042ef67a04e61bf9adabb851a04a0db",
|
||||||
"size": 243664
|
"size": 241799
|
||||||
},
|
},
|
||||||
"th_15_extra.js": {
|
"th_15_extra.js": {
|
||||||
"sha256": "44d19f0012f4182b9f9831d4f5a747b43d3b726f98e0480e6c79f54eeff70a5e",
|
"sha256": "44d19f0012f4182b9f9831d4f5a747b43d3b726f98e0480e6c79f54eeff70a5e",
|
||||||
@@ -68,5 +68,5 @@
|
|||||||
},
|
},
|
||||||
"keyId": "toolhub-targets-2026-rsa3072",
|
"keyId": "toolhub-targets-2026-rsa3072",
|
||||||
"schema": 2,
|
"schema": 2,
|
||||||
"version": 20260512233842
|
"version": 20260513001538
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -5,10 +5,13 @@ import sys
|
|||||||
root = pathlib.Path(__file__).resolve().parents[1]
|
root = pathlib.Path(__file__).resolve().parents[1]
|
||||||
text = (root / "code" / "th_14_panels.js").read_text(encoding="utf-8")
|
text = (root / "code" / "th_14_panels.js").read_text(encoding="utf-8")
|
||||||
checks = [
|
checks = [
|
||||||
("manager has polished helper", "createButtonManagerPolishedCard" in text),
|
|
||||||
("manager has action chip helper", "createButtonManagerActionChip" in text),
|
("manager has action chip helper", "createButtonManagerActionChip" in text),
|
||||||
("manager card has two-row layout marker", "按钮管理列表卡片:上信息、下操作" in text),
|
("manager card has two-row layout marker", "按钮管理列表卡片:上信息、下操作" in text),
|
||||||
("manager has search surface 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 hero helper", "createButtonEditorHeroCard" in text),
|
||||||
("editor has field spacing helper", "addButtonEditorField" in text),
|
("editor has field spacing helper", "addButtonEditorField" in text),
|
||||||
("editor hero visible text", "按钮编辑工作台" in text),
|
("editor hero visible text", "按钮编辑工作台" in text),
|
||||||
|
|||||||
Reference in New Issue
Block a user