Skip to content

Commit 023e8c1

Browse files
authored
fix(gui): refresh current provider data on user change (#1000)
1 parent b9c0331 commit 023e8c1

File tree

4 files changed

+88
-2
lines changed

4 files changed

+88
-2
lines changed

changelog.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
版本变更历史
22
----------------------
3+
5.1a0 (in development)
4+
""""""""""""""""""""""
5+
- 功能增强
6+
7+
- 当 provider 当前用户变化时,自动刷新头像与当前用户歌单(覆盖账号切换场景)
8+
39
5.0.0 (2026-01-24)
410
""""""""""""""""""""""
511
- 缺陷修复

feeluown/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from .consts import LOG_FILE
77

88

9-
__version__ = '5.0'
9+
__version__ = '5.1a0'
1010

1111

1212
dict_config = {

feeluown/gui/components/avatar.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ def on_clicked(self):
7575
def on_provider_added(self, provider: Provider):
7676
if isinstance(provider, SupportsCurrentUserChanged):
7777
provider.current_user_changed.connect(
78-
self.create_provider_current_user_changed_cb(provider), weak=False
78+
self.create_provider_current_user_changed_cb(provider),
79+
weak=False,
80+
aioqueue=True,
7981
)
8082

8183
def create_provider_current_user_changed_cb(self, provider: Provider):
@@ -85,6 +87,16 @@ def cb(user: UserModel):
8587
self._logging_state[provider.identifier] = user.name
8688
else:
8789
self._logging_state.pop(provider.identifier, None)
90+
91+
current_pvd_ui = self._app.current_pvd_ui_mgr.get()
92+
if user is not None and current_pvd_ui is not None:
93+
if current_pvd_ui.provider is provider:
94+
run_afn(self.show_pvd_ui_current_user)
95+
run_afn(
96+
self._app.ui.sidebar.show_provider_current_user_playlists,
97+
provider,
98+
)
99+
88100
if not self._app.current_pvd_ui_mgr.get():
89101
if self._logging_state:
90102
self._text = t("select-profile")
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from types import SimpleNamespace
2+
from unittest.mock import MagicMock
3+
4+
from feeluown.gui.components.avatar import Avatar
5+
6+
7+
class DummyProvider:
8+
def __init__(self, identifier="dummy"):
9+
self.identifier = identifier
10+
self.current_user_changed = SimpleNamespace(connect=MagicMock())
11+
12+
13+
def test_on_provider_added_connects_with_aioqueue(qtbot, app_mock):
14+
avatar = Avatar(app_mock)
15+
qtbot.addWidget(avatar)
16+
17+
provider = DummyProvider()
18+
avatar.on_provider_added(provider)
19+
20+
assert provider.current_user_changed.connect.call_count == 1
21+
_, kwargs = provider.current_user_changed.connect.call_args
22+
assert kwargs["weak"] is False
23+
assert kwargs["aioqueue"] is True
24+
25+
26+
def test_current_user_changed_refreshes_when_provider_is_current(
27+
qtbot, app_mock, monkeypatch
28+
):
29+
avatar = Avatar(app_mock)
30+
qtbot.addWidget(avatar)
31+
32+
provider = DummyProvider()
33+
app_mock.current_pvd_ui_mgr.get.return_value = SimpleNamespace(provider=provider)
34+
35+
run_afn_mock = MagicMock()
36+
monkeypatch.setattr("feeluown.gui.components.avatar.run_afn", run_afn_mock)
37+
38+
user = SimpleNamespace(name="tester")
39+
cb = avatar.create_provider_current_user_changed_cb(provider)
40+
cb(user)
41+
42+
assert avatar._logging_state[provider.identifier] == "tester"
43+
run_afn_mock.assert_any_call(avatar.show_pvd_ui_current_user)
44+
run_afn_mock.assert_any_call(
45+
app_mock.ui.sidebar.show_provider_current_user_playlists,
46+
provider,
47+
)
48+
49+
50+
def test_current_user_changed_skip_refresh_when_provider_not_current(
51+
qtbot, app_mock, monkeypatch
52+
):
53+
avatar = Avatar(app_mock)
54+
qtbot.addWidget(avatar)
55+
56+
provider = DummyProvider("dummy")
57+
other_provider = DummyProvider("other")
58+
app_mock.current_pvd_ui_mgr.get.return_value = SimpleNamespace(
59+
provider=other_provider
60+
)
61+
62+
run_afn_mock = MagicMock()
63+
monkeypatch.setattr("feeluown.gui.components.avatar.run_afn", run_afn_mock)
64+
65+
cb = avatar.create_provider_current_user_changed_cb(provider)
66+
cb(SimpleNamespace(name="tester"))
67+
68+
run_afn_mock.assert_not_called()

0 commit comments

Comments
 (0)