diff --git a/feeluown/gui/components/avatar.py b/feeluown/gui/components/avatar.py index c98dd13fd3..df9e808ad3 100644 --- a/feeluown/gui/components/avatar.py +++ b/feeluown/gui/components/avatar.py @@ -3,10 +3,11 @@ from PyQt5.QtWidgets import QMenu, QAction from PyQt5.QtGui import QPainter, QIcon, QPalette, QContextMenuEvent -from feeluown.library import NoUserLoggedIn +from feeluown.library import NoUserLoggedIn, UserModel from feeluown.models.uri import reverse from feeluown.utils.aio import run_afn, run_fn -from feeluown.gui.provider_ui import UISupportsLoginOrGoHome, ProviderUiItem +from feeluown.gui.provider_ui import UISupportsLoginOrGoHome, ProviderUiItem, \ + UISupportsLoginEvent from feeluown.gui.widgets import SelfPaintAbstractSquareButton from feeluown.gui.drawers import PixmapDrawer, AvatarIconDrawer @@ -70,8 +71,18 @@ def contextMenuEvent(self, e) -> None: menu.exec_(e.globalPos()) + def on_provider_ui_login_event(self, provider_ui, event): + if event in (1, 2): + run_afn(self.show_pvd_ui_current_user) + run_afn( + self._app.ui.sidebar.show_provider_current_user_playlists, + provider_ui.provider + ) + def on_pvd_ui_selected(self, pvd_ui): self._app.current_pvd_ui_mgr.set(pvd_ui) + if isinstance(pvd_ui, UISupportsLoginEvent): + pvd_ui.login_event.connect(self.on_provider_ui_login_event) if isinstance(pvd_ui, UISupportsLoginOrGoHome): pvd_ui.login_or_go_home() run_afn(self.show_pvd_ui_current_user) @@ -105,7 +116,7 @@ async def _show_provider_current_user(self, name): if user is None: return None - if user.avatar_url: + if isinstance(user, UserModel) and user.avatar_url: img_data = await run_afn(self._app.img_mgr.get, user.avatar_url, reverse(user)) if img_data: diff --git a/feeluown/gui/provider_ui.py b/feeluown/gui/provider_ui.py index 192cad265c..60c400f713 100644 --- a/feeluown/gui/provider_ui.py +++ b/feeluown/gui/provider_ui.py @@ -19,6 +19,23 @@ def login_or_go_home(self): ... +@runtime_checkable +class UISupportsLoginEvent(Protocol): + + @property + @abstractmethod + def login_event(self): + """ + event: + 0: first login failed + 1: first login ok + 2: re-login ok + + :return: Signal(provider_ui, event) + """ + ... + + @runtime_checkable class UISupportsDiscovery(Protocol): diff --git a/feeluown/gui/uimain/sidebar.py b/feeluown/gui/uimain/sidebar.py index 7bce864262..24cead71dd 100644 --- a/feeluown/gui/uimain/sidebar.py +++ b/feeluown/gui/uimain/sidebar.py @@ -13,6 +13,8 @@ ) from feeluown.collection import CollectionAlreadyExists, CollectionType from feeluown.utils import aio +from feeluown.utils.reader import create_reader +from feeluown.utils.aio import run_fn from feeluown.gui.widgets import ( DiscoveryButton, HomeButton, @@ -99,6 +101,16 @@ def sizeHint(self): width = min(self._app.width() * 22 // 100, 240) return QSize(width, size.height()) + async def show_provider_current_user_playlists(self, provider): + self.p.playlists_con.show() + self._app.pl_uimgr.clear() + + playlists = await run_fn(provider.current_user_list_playlists) + reader = await run_fn(provider.current_user_fav_create_playlists_rd) + fav_playlists = create_reader(reader).readall() + self._app.pl_uimgr.add(playlists) + self._app.pl_uimgr.add(fav_playlists, is_fav=True) + class _LeftPanel(QFrame): diff --git a/feeluown/library/provider_protocol.py b/feeluown/library/provider_protocol.py index cc03394f09..eb29ddb11e 100644 --- a/feeluown/library/provider_protocol.py +++ b/feeluown/library/provider_protocol.py @@ -315,6 +315,15 @@ def get_current_user(self) -> UserModel: """ +@runtime_checkable +class SupportsCurrentUserListPlaylists(Protocol): + @abstractmethod + def current_user_list_playlists(self): + """ + : raises NoUserLoggedIn: + """ + + # # Protocols for current user favorites/collections #