feat: 新版本时提醒参数设置导航 (#103)

This commit is contained in:
chengma
2026-08-11 11:13:16 +08:00
parent 2193430d50
commit 69e52928aa
6 changed files with 111 additions and 1 deletions
+10
View File
@@ -513,6 +513,16 @@ class SettingsPage(QWidget):
self.updateStatusLabel.setText(message) self.updateStatusLabel.setText(message)
def set_update_versions(self, current_version: str, latest_version: str) -> None:
"""同时显示本地版本和线上版本,便于判断是否需要更新。"""
self.currentVersionLabel.setText(
f"本地 {current_version};线上 {latest_version}"
)
self.currentVersionLabel.setAccessibleName(
f"本地版本 {current_version},线上版本 {latest_version}"
)
def set_saved_android_device(self, serial: str) -> None: def set_saved_android_device(self, serial: str) -> None:
"""显示已经保存并实际用于自动化的 Android 设备。""" """显示已经保存并实际用于自动化的 Android 设备。"""
+36 -1
View File
@@ -80,12 +80,22 @@ class MainWindow(FluentWindow):
self.pddTaskPageEvent.update_admin_base_url self.pddTaskPageEvent.update_admin_base_url
) )
self.addSubInterface(self.pddTaskPage, FIF.HOME, "pdd") self.addSubInterface(self.pddTaskPage, FIF.HOME, "pdd")
self.addSubInterface( self.settingsNavigationItem = self.addSubInterface(
self.settingsPage, self.settingsPage,
FIF.SETTING, FIF.SETTING,
"设置", "设置",
NavigationItemPosition.BOTTOM, NavigationItemPosition.BOTTOM,
) )
self._settings_navigation_text = self.settingsNavigationItem.text()
self._settings_navigation_light_color = (
self.settingsNavigationItem.lightTextColor
)
self._settings_navigation_dark_color = (
self.settingsNavigationItem.darkTextColor
)
self.settingsPage.eventBinder.updateEventBinder.updateAvailabilityChanged.connect(
self._set_update_navigation_reminder
)
self.setWindowTitle("采集采购工具") self.setWindowTitle("采集采购工具")
self.setMinimumSize(820, 560) self.setMinimumSize(820, 560)
@@ -93,6 +103,31 @@ class MainWindow(FluentWindow):
self._moveToScreenCenter() self._moveToScreenCenter()
self.pddTaskPageEvent.load_initial_tasks() self.pddTaskPageEvent.load_initial_tasks()
def _set_update_navigation_reminder(
self,
available: bool,
current_version: str,
latest_version: str,
) -> None:
"""用颜色和文字共同提醒更新,不让提示只依赖颜色。"""
if available:
self.settingsNavigationItem.setText(
f"{self._settings_navigation_text}(有更新)"
)
self.settingsNavigationItem.setTextColor("#B45309", "#FBBF24")
self.settingsNavigationItem.setToolTip(
f"发现新版本 {latest_version},当前版本 {current_version}"
)
return
self.settingsNavigationItem.setText(self._settings_navigation_text)
self.settingsNavigationItem.setTextColor(
self._settings_navigation_light_color,
self._settings_navigation_dark_color,
)
self.settingsNavigationItem.setToolTip(self._settings_navigation_text)
def _moveToScreenCenter(self): def _moveToScreenCenter(self):
screen = QApplication.primaryScreen() screen = QApplication.primaryScreen()
if screen is None: if screen is None:
+16
View File
@@ -117,6 +117,8 @@ class UpdateDownloadWorker(QObject):
class UpdateUiEventBinder(QObject): class UpdateUiEventBinder(QObject):
"""管理更新配置、保存反馈和两个后台线程。""" """管理更新配置、保存反馈和两个后台线程。"""
updateAvailabilityChanged = pyqtSignal(bool, str, str)
def __init__( def __init__(
self, self,
page, page,
@@ -300,13 +302,27 @@ class UpdateUiEventBinder(QObject):
def _on_check_succeeded(self, result: UpdateCheckResult) -> None: def _on_check_succeeded(self, result: UpdateCheckResult) -> None:
if self._closing: if self._closing:
return return
self._page.set_update_versions(
result.current_version,
result.latest_version,
)
if not result.available or result.update is None: if not result.available or result.update is None:
self.updateAvailabilityChanged.emit(
False,
result.current_version,
result.latest_version,
)
self._page.set_update_status( self._page.set_update_status(
f"当前已是最新版本({result.current_version})" f"当前已是最新版本({result.current_version})"
) )
return return
update = result.update update = result.update
self.updateAvailabilityChanged.emit(
True,
result.current_version,
update.version,
)
size_mb = update.size / (1024 * 1024) size_mb = update.size / (1024 * 1024)
dialog = MessageBox( dialog = MessageBox(
f"发现新版本 {update.version}", f"发现新版本 {update.version}",
+16
View File
@@ -1113,6 +1113,22 @@ class PDDTaskPageEventTest(unittest.TestCase):
window.close() window.close()
window.deleteLater() window.deleteLater()
def test_main_window_marks_and_clears_update_navigation(self):
window = MainWindow(
task_repository=self.repository,
settings_repository=SettingsRepository(self.db_path),
admin_gateway=MockAdminGateway(),
)
window._set_update_navigation_reminder(True, "0.1.0", "0.2.0")
self.assertIn("有更新", window.settingsNavigationItem.text())
self.assertIn("0.2.0", window.settingsNavigationItem.toolTip())
window._set_update_navigation_reminder(False, "0.2.0", "0.2.0")
self.assertNotIn("有更新", window.settingsNavigationItem.text())
window.close()
window.deleteLater()
def test_admin_base_url_change_reaches_persistent_claim_worker(self): def test_admin_base_url_change_reaches_persistent_claim_worker(self):
settings = self._saved_settings() settings = self._saved_settings()
page = PDDTaskPage() page = PDDTaskPage()
+29
View File
@@ -153,6 +153,35 @@ class UpdateUiEventTest(unittest.TestCase):
page.eventBinder.shutdown() page.eventBinder.shutdown()
page.deleteLater() page.deleteLater()
def test_successful_check_exposes_versions_and_availability(self):
update = UpdateInfo(
version="0.3.0",
notes="",
update_url="https://updates.example.test/CMAutoBuy_0.3.0.zip",
file_name="CMAutoBuy_0.3.0.zip",
size=1024,
sha256="0" * 64,
)
page = self._page(FakeUpdateService())
changes = []
page.eventBinder.updateEventBinder.updateAvailabilityChanged.connect(
lambda available, current, latest: changes.append(
(available, current, latest)
)
)
with patch("src.update_ui_event.MessageBox.exec", return_value=False):
page.eventBinder.updateEventBinder._on_check_succeeded(
UpdateCheckResult("0.1.0", "0.3.0", True, update)
)
self.assertEqual(changes, [(True, "0.1.0", "0.3.0")])
self.assertEqual(
page.currentVersionLabel.text(), "本地 0.1.0;线上 0.3.0"
)
page.eventBinder.shutdown()
page.deleteLater()
def test_save_uses_sqlite_for_non_secret_and_credential_store_for_password(self): def test_save_uses_sqlite_for_non_secret_and_credential_store_for_password(self):
page = self._page(FakeUpdateService()) page = self._page(FakeUpdateService())
+4
View File
@@ -21,6 +21,10 @@
1. **PDD 任务**:主要业务页面。 1. **PDD 任务**:主要业务页面。
2. **设置**:固定在导航底部。 2. **设置**:固定在导航底部。
启动检查确认存在新版本时,设置导航显示“有更新”文字并使用提醒色,不能只靠颜色表达。
只有确认线上版本不高于本地版本时才清除提醒;进入设置页不会自动清除提醒,检查失败也
不会制造更新提示。软件更新区域同时显示本地版本和线上版本。
页面必须使用稳定对象名: 页面必须使用稳定对象名:
- `pddTaskPage` - `pddTaskPage`