refactor(gui): remove duplicate app header title
This commit is contained in:
@@ -130,11 +130,6 @@ class MainWindow(QMainWindow):
|
|||||||
settings_tab = self._settings_tab()
|
settings_tab = self._settings_tab()
|
||||||
if hasattr(settings_tab, "settingsSaved"):
|
if hasattr(settings_tab, "settingsSaved"):
|
||||||
settings_tab.settingsSaved.connect(self._on_settings_saved)
|
settings_tab.settingsSaved.connect(self._on_settings_saved)
|
||||||
self._header_title_label = QLabel(display_name())
|
|
||||||
self._header_title_label.setObjectName("appHeaderTitle")
|
|
||||||
self._header_title_label.setStyleSheet(
|
|
||||||
"font-size: 15px; font-weight: 600; color: #24292f;"
|
|
||||||
)
|
|
||||||
subscription_label_text = (
|
subscription_label_text = (
|
||||||
"会员:正在验证"
|
"会员:正在验证"
|
||||||
if SUBSCRIPTION_CHECK_ENABLED
|
if SUBSCRIPTION_CHECK_ENABLED
|
||||||
@@ -146,10 +141,10 @@ class MainWindow(QMainWindow):
|
|||||||
self._subscription_label.setStyleSheet("color: #0969da;")
|
self._subscription_label.setStyleSheet("color: #0969da;")
|
||||||
header = QWidget()
|
header = QWidget()
|
||||||
header.setObjectName("appHeader")
|
header.setObjectName("appHeader")
|
||||||
|
header.setAccessibleName("会员状态栏")
|
||||||
header_layout = QHBoxLayout(header)
|
header_layout = QHBoxLayout(header)
|
||||||
header_layout.setContentsMargins(18, 8, 18, 4)
|
header_layout.setContentsMargins(18, 4, 18, 2)
|
||||||
header_layout.setSpacing(10)
|
header_layout.setSpacing(0)
|
||||||
header_layout.addWidget(self._header_title_label)
|
|
||||||
header_layout.addStretch(1)
|
header_layout.addStretch(1)
|
||||||
header_layout.addWidget(self._subscription_label)
|
header_layout.addWidget(self._subscription_label)
|
||||||
central = QWidget()
|
central = QWidget()
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
- 当前处于真实接口观察期:`SUBSCRIPTION_CHECK_ENABLED = True`、`SUBSCRIPTION_ENFORCEMENT_ENABLED = False`。客户端真实查询并展示订阅状态,但查询中、未配置 Key、Key 无效、账号禁用、未订阅、到期、撤销或暂时不可用均不禁用六个工作流、不自动切换「设置」、不阻止新提交。
|
- 当前处于真实接口观察期:`SUBSCRIPTION_CHECK_ENABLED = True`、`SUBSCRIPTION_ENFORCEMENT_ENABLED = False`。客户端真实查询并展示订阅状态,但查询中、未配置 Key、Key 无效、账号禁用、未订阅、到期、撤销或暂时不可用均不禁用六个工作流、不自动切换「设置」、不阻止新提交。
|
||||||
- 强制升级检查完成、主窗口显示后,后台用 `data/config/cmhub.json` 的 API Key 请求 `GET /api/v1/cmshopee/subscription/status`;不会阻塞 Qt 主线程或把 Key 放入 URL、状态栏、日志和错误提示。
|
- 强制升级检查完成、主窗口显示后,后台用 `data/config/cmhub.json` 的 API Key 请求 `GET /api/v1/cmshopee/subscription/status`;不会阻塞 Qt 主线程或把 Key 放入 URL、状态栏、日志和错误提示。
|
||||||
- 订阅有效时,应用顶部标题区域右侧显示“账号名 · 套餐名 · 有效至日期”;宽限期显示宽限截止日。其他状态显示中文观察结果并明确“当前不影响使用”。不得把长会员文本拼进 Windows 原生窗口标题,也不得展示 API Key。
|
- 应用名称只由 Windows 原生标题栏显示,Tabs 上方不再重复品牌标题;该轻量区域只在右侧承载会员状态。订阅有效时显示“账号名 · 套餐名 · 有效至日期”,宽限期显示宽限截止日;其他状态显示中文观察结果并明确“当前不影响使用”。不得把长会员文本拼进 Windows 原生窗口标题,也不得展示 API Key。
|
||||||
- 观察期不显示 `notice_id` 对应的“已启用会员订阅”模态通知框;保存 cmhub 设置后会立即重新检查,但陈旧线程结果不能覆盖新状态。
|
- 观察期不显示 `notice_id` 对应的“已启用会员订阅”模态通知框;保存 cmhub 设置后会立即重新检查,但陈旧线程结果不能覆盖新状态。
|
||||||
- 当前服务端未部署订阅接口时,`404` 视为旧服务兼容:顶部显示“会员服务尚未启用”,六个工作流继续按旧行为运行,不弹阻断窗口。网络或格式错误显示“暂时无法确认会员状态”,不能误报为 Key 无效或会员到期。
|
- 当前服务端未部署订阅接口时,`404` 视为旧服务兼容:顶部显示“会员服务尚未启用”,六个工作流继续按旧行为运行,不弹阻断窗口。网络或格式错误显示“暂时无法确认会员状态”,不能误报为 Key 无效或会员到期。
|
||||||
- ② AI生成、⑥商品套图和「AI帮写」继续调用同一订阅预检入口,但观察模式始终放行;cmhub 产品接口仍必须服务端最终裁决。已提交的异步任务继续查询、下载和查看。自定义网关直连的观察结果同样不能作为不可绕过的授权保护。
|
- ② AI生成、⑥商品套图和「AI帮写」继续调用同一订阅预检入口,但观察模式始终放行;cmhub 产品接口仍必须服务端最终裁决。已提交的异步任务继续查询、下载和查看。自定义网关直连的观察结果同样不能作为不可绕过的授权保护。
|
||||||
|
|||||||
+5
-2
@@ -3,7 +3,7 @@ id: T-697
|
|||||||
title: 移除主窗口应用内重复标题
|
title: 移除主窗口应用内重复标题
|
||||||
phase: 7
|
phase: 7
|
||||||
deps: [T-696]
|
deps: [T-696]
|
||||||
status: TODO
|
status: DONE
|
||||||
created: 2026-07-23
|
created: 2026-07-23
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -45,4 +45,7 @@ Windows 原生标题必须保留,用于窗口识别、任务栏/Alt+Tab 展示
|
|||||||
|
|
||||||
## 执行记录
|
## 执行记录
|
||||||
|
|
||||||
- 待实现。
|
- 2026-07-23:保留 `MainWindow.setWindowTitle(display_name())` 与窗口图标,移除应用内 `_header_title_label`、`appHeaderTitle` 和对应字体样式,Tabs 上方不再重复显示应用名称。
|
||||||
|
- `appHeader` 改为只承载右对齐会员状态的轻量区域,增加“会员状态栏”无障碍名称;上下边距从 `8/4` 收紧为 `4/2`,不设置固定高度,保留字体和 DPI 自适应。
|
||||||
|
- 更新路由文档和 GUI 回归测试,覆盖系统窗口标题、重复标题不存在、会员状态标签保留、状态栏对象语义与边距。
|
||||||
|
- 验证通过:主窗口定向 GUI 测试 3 项、`py -3.10 -m unittest discover -s tests`(682 项)、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check`。
|
||||||
|
|||||||
@@ -634,6 +634,22 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
|||||||
self.addCleanup(window.close)
|
self.addCleanup(window.close)
|
||||||
|
|
||||||
self.assertEqual(gui.display_name(), window.windowTitle())
|
self.assertEqual(gui.display_name(), window.windowTitle())
|
||||||
|
self.assertIsNone(window.findChild(QLabel, "appHeaderTitle"))
|
||||||
|
subscription_label = window.findChild(QLabel, "subscriptionStatusLabel")
|
||||||
|
self.assertIsNotNone(subscription_label)
|
||||||
|
header = window.centralWidget().layout().itemAt(0).widget()
|
||||||
|
self.assertEqual("appHeader", header.objectName())
|
||||||
|
self.assertEqual("会员状态栏", header.accessibleName())
|
||||||
|
margins = header.layout().contentsMargins()
|
||||||
|
self.assertEqual(
|
||||||
|
(18, 4, 18, 2),
|
||||||
|
(
|
||||||
|
margins.left(),
|
||||||
|
margins.top(),
|
||||||
|
margins.right(),
|
||||||
|
margins.bottom(),
|
||||||
|
),
|
||||||
|
)
|
||||||
self.assertEqual(6, window.tabs.count())
|
self.assertEqual(6, window.tabs.count())
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
[
|
[
|
||||||
|
|||||||
Reference in New Issue
Block a user