From e969889ab95fa14e6d03527e7451724739b6b614 Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Tue, 5 Dec 2023 20:34:49 +0100 Subject: [PATCH 1/8] Begin UI redesign work --- .../frontend/{pages => tabs}/__init__.py | 0 .../library_page.py => tabs/library_tab.py} | 2 +- .../queue_page.py => tabs/queue_tab.py} | 3 +- source/monophony/frontend/tabs/search_tab.py | 49 ++++++++++++++ .../monophony/frontend/windows/main_window.py | 65 ++++++++----------- 5 files changed, 78 insertions(+), 41 deletions(-) rename source/monophony/frontend/{pages => tabs}/__init__.py (100%) rename source/monophony/frontend/{pages/library_page.py => tabs/library_tab.py} (99%) rename source/monophony/frontend/{pages/queue_page.py => tabs/queue_tab.py} (94%) create mode 100644 source/monophony/frontend/tabs/search_tab.py diff --git a/source/monophony/frontend/pages/__init__.py b/source/monophony/frontend/tabs/__init__.py similarity index 100% rename from source/monophony/frontend/pages/__init__.py rename to source/monophony/frontend/tabs/__init__.py diff --git a/source/monophony/frontend/pages/library_page.py b/source/monophony/frontend/tabs/library_tab.py similarity index 99% rename from source/monophony/frontend/pages/library_page.py rename to source/monophony/frontend/tabs/library_tab.py index 9635a85..3867f17 100644 --- a/source/monophony/frontend/pages/library_page.py +++ b/source/monophony/frontend/tabs/library_tab.py @@ -11,7 +11,7 @@ gi.require_version('Gtk', '4.0') from gi.repository import Adw, GLib, Gtk -class MonophonyLibraryPage(Gtk.Box): +class MonophonyLibraryTab(Gtk.Box): def __init__(self, player: object): super().__init__(orientation=Gtk.Orientation.VERTICAL) diff --git a/source/monophony/frontend/pages/queue_page.py b/source/monophony/frontend/tabs/queue_tab.py similarity index 94% rename from source/monophony/frontend/pages/queue_page.py rename to source/monophony/frontend/tabs/queue_tab.py index b21b3bd..d2f546b 100644 --- a/source/monophony/frontend/pages/queue_page.py +++ b/source/monophony/frontend/tabs/queue_tab.py @@ -6,7 +6,7 @@ gi.require_version('Gtk', '4.0') from gi.repository import Adw, GLib, Gtk -class MonophonyQueuePage(Gtk.Box): +class MonophonyQueueTab(Gtk.Box): def __init__(self, player: object): super().__init__(orientation=Gtk.Orientation.VERTICAL) @@ -21,7 +21,6 @@ class MonophonyQueuePage(Gtk.Box): self.box_meta.set_valign(Gtk.Align.FILL) self.append(self.box_meta) self.box_queue = Adw.PreferencesGroup() - self.box_queue.set_title(_('Queue')) self.box_meta.add(self.box_queue) GLib.timeout_add(100, self.update) diff --git a/source/monophony/frontend/tabs/search_tab.py b/source/monophony/frontend/tabs/search_tab.py new file mode 100644 index 0000000..099ea8d --- /dev/null +++ b/source/monophony/frontend/tabs/search_tab.py @@ -0,0 +1,49 @@ +from monophony.frontend.pages.results_page import MonophonyResultsPage + +import gi +gi.require_version('Adw', '1') +gi.require_version('Gtk', '4.0') +from gi.repository import Adw, GLib, Gtk + + +class MonophonySearchTab(Gtk.Box): + def __init__(self, player: object): + super().__init__(orientation=Gtk.Orientation.VERTICAL) + + ent_search = Gtk.SearchEntry() + ent_search.set_placeholder_text(_('Search...')) + ent_search.set_hexpand(True) + ent_search.set_halign(Gtk.Align.FILL) + ent_search.set_margin_start(10) + ent_search.set_margin_end(10) + ent_search.connect('activate', lambda e: self._on_search(e.get_text())) + + clm_search = Adw.Clamp() + clm_search.set_child(ent_search) + + search_bar = Gtk.SearchBar() + search_bar.set_show_close_button(False) + search_bar.set_search_mode(True) + search_bar.set_child(clm_search) + search_bar.set_key_capture_widget(ent_search) + self.append(search_bar) + + self.pge_results = None + self.pge_detail_results = None + + self.set_vexpand(True) + self.player = player + + + def _on_search(self, text: str): + if not text: + return + + if self.pge_results: + self.remove(self.pge_results) + + self.pge_results = MonophonyResultsPage(self.player, text) + self.pge_results.set_vexpand(True) + self.pge_results.set_valign(Gtk.Align.FILL) + self.append(self.pge_results) + diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index 05a3635..3833b90 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -5,9 +5,9 @@ import monophony.backend.playlists import monophony.backend.settings from monophony import __version__, APP_ID from monophony.frontend.pages.artist_page import MonophonyArtistPage -from monophony.frontend.pages.library_page import MonophonyLibraryPage -from monophony.frontend.pages.queue_page import MonophonyQueuePage -from monophony.frontend.pages.results_page import MonophonyResultsPage +from monophony.frontend.tabs.library_tab import MonophonyLibraryTab +from monophony.frontend.tabs.queue_tab import MonophonyQueueTab +from monophony.frontend.tabs.search_tab import MonophonySearchTab from monophony.frontend.widgets.player import MonophonyPlayer from monophony.frontend.windows.add_window import MonophonyAddWindow from monophony.frontend.windows.import_window import MonophonyImportWindow @@ -31,22 +31,31 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.removed_playlists = [] GLib.Thread.new(None, monophony.backend.mpris.init, self.player) - self.stack = Adw.Leaflet() - self.stack.set_can_navigate_forward(False) - self.stack.set_can_navigate_back(False) - self.stack.set_can_unfold(False) - pge_library = MonophonyLibraryPage(self.player) - self.stack.append(pge_library) - self.stack.set_visible_child(pge_library) + self.stack = Adw.ViewStack() + self.stack.add_titled_with_icon( + MonophonyLibraryTab(self.player), + 'library', + _('Library'), + 'emblem-music-symbolic' + ) + self.stack.add_titled_with_icon( + MonophonySearchTab(self.player), + 'search', + _('Search'), + 'system-search-symbolic' + ) + self.stack.add_titled_with_icon( + MonophonyQueueTab(self.player), + 'queue', + _('Queue'), + 'view-list-symbolic' + ) + + self.stack.set_visible_child_name('library') self.toaster = Adw.ToastOverlay.new() self.toaster.set_child(self.stack) - self.btn_back = Gtk.Button.new_from_icon_name('go-previous-symbolic') - self.btn_back.set_tooltip_text(_('Go back')) - self.btn_back.set_visible(False) - self.btn_back.connect('clicked', self._on_back_clicked) - mnu_main = Gio.Menu() mnu_main.append(_('Import Playlist'), 'import-custom-playlist') self.install_action( @@ -62,17 +71,11 @@ class MonophonyMainWindow(Adw.ApplicationWindow): btn_menu.set_icon_name('open-menu-symbolic') btn_menu.set_menu_model(mnu_main) - self.ent_search = Gtk.SearchEntry() - self.ent_search.set_property('placeholder-text', _('Search for Content...')) - self.ent_search.set_hexpand(True) - self.ent_search.set_halign(Gtk.Align.FILL) - self.ent_search.connect('activate', self._on_search) - clm_search = Adw.Clamp.new() - clm_search.set_child(self.ent_search) + switcher = Adw.ViewSwitcher() + switcher.set_stack(self.stack) header_bar = Adw.HeaderBar() - header_bar.pack_start(self.btn_back) - header_bar.set_title_widget(clm_search) + header_bar.set_title_widget(switcher) header_bar.pack_end(btn_menu) self.player_revealer = Gtk.Revealer() @@ -114,26 +117,12 @@ class MonophonyMainWindow(Adw.ApplicationWindow): monophony.backend.settings.set_value('window-width', size.width) monophony.backend.settings.set_value('window-height', size.height) - def _on_search(self, ent: Gtk.Entry): - self.append_page(MonophonyResultsPage(self.player, ent.get_text())) - - def _on_show_more(self, query: str, category: str): - self.append_page( - MonophonyResultsPage(self.player, query=query, filter_=category) - ) - def _on_show_artist(self, artist: str): self.append_page(MonophonyArtistPage(self.player, artist)) def _on_show_queue(self): self.append_page(MonophonyQueuePage(self.player)) - def _on_back_clicked(self, _b): - self.stack.navigate(Adw.NavigationDirection.BACK) - if not self.stack.get_adjacent_child(Adw.NavigationDirection.BACK): - self.btn_back.set_visible(False) - self.ent_search.set_text('') - def _on_about_clicked(self): win_about = Adw.AboutWindow.new() win_about.set_application_icon(APP_ID) -- GitLab From 91d19461f48c699c872433c1a4020565d08d4277 Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Fri, 8 Dec 2023 16:44:18 +0100 Subject: [PATCH 2/8] Work on transition to tab system --- source/monophony/frontend/tabs/queue_tab.py | 14 +++++++++++++- source/monophony/frontend/tabs/search_tab.py | 2 +- source/monophony/frontend/windows/main_window.py | 14 ++++++++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/source/monophony/frontend/tabs/queue_tab.py b/source/monophony/frontend/tabs/queue_tab.py index d2f546b..7391a36 100644 --- a/source/monophony/frontend/tabs/queue_tab.py +++ b/source/monophony/frontend/tabs/queue_tab.py @@ -16,13 +16,22 @@ class MonophonyQueueTab(Gtk.Box): self.queue_widgets = [] self.set_vexpand(True) + self.pge_status = Adw.StatusPage() + self.pge_status.set_vexpand(True) + self.pge_status.set_valign(Gtk.Align.FILL) + self.pge_status.set_icon_name('view-list-symbolic') + self.pge_status.set_title(_('Queue Empty')) + self.pge_status.set_visible(False) + self.box_meta = Adw.PreferencesPage.new() self.box_meta.set_vexpand(True) self.box_meta.set_valign(Gtk.Align.FILL) - self.append(self.box_meta) self.box_queue = Adw.PreferencesGroup() self.box_meta.add(self.box_queue) + self.append(self.box_meta) + self.append(self.pge_status) + GLib.timeout_add(100, self.update) def update(self) -> True: @@ -32,6 +41,9 @@ class MonophonyQueueTab(Gtk.Box): for widget in self.queue_widgets: self.box_queue.remove(widget) + self.box_meta.set_visible(bool(new_queue)) + self.pge_status.set_visible(not bool(new_queue)) + self.queue_widgets = [] self.old_queue = new_queue self.old_index = new_index diff --git a/source/monophony/frontend/tabs/search_tab.py b/source/monophony/frontend/tabs/search_tab.py index 099ea8d..57369c3 100644 --- a/source/monophony/frontend/tabs/search_tab.py +++ b/source/monophony/frontend/tabs/search_tab.py @@ -3,7 +3,7 @@ from monophony.frontend.pages.results_page import MonophonyResultsPage import gi gi.require_version('Adw', '1') gi.require_version('Gtk', '4.0') -from gi.repository import Adw, GLib, Gtk +from gi.repository import Adw, Gtk class MonophonySearchTab(Gtk.Box): diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index 3833b90..cbae9df 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -4,7 +4,6 @@ import monophony.backend.player import monophony.backend.playlists import monophony.backend.settings from monophony import __version__, APP_ID -from monophony.frontend.pages.artist_page import MonophonyArtistPage from monophony.frontend.tabs.library_tab import MonophonyLibraryTab from monophony.frontend.tabs.queue_tab import MonophonyQueueTab from monophony.frontend.tabs.search_tab import MonophonySearchTab @@ -56,6 +55,12 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.toaster = Adw.ToastOverlay.new() self.toaster.set_child(self.stack) + + self.btn_back = Gtk.Button.new_from_icon_name('go-previous-symbolic') + self.btn_back.set_tooltip_text(_('Go back')) + self.btn_back.set_visible(False) + self.btn_back.connect('clicked', lambda _b: self._on_back_clicked()) + mnu_main = Gio.Menu() mnu_main.append(_('Import Playlist'), 'import-custom-playlist') self.install_action( @@ -75,6 +80,7 @@ class MonophonyMainWindow(Adw.ApplicationWindow): switcher.set_stack(self.stack) header_bar = Adw.HeaderBar() + header_bar.pack_start(self.btn_back) header_bar.set_title_widget(switcher) header_bar.pack_end(btn_menu) @@ -118,10 +124,10 @@ class MonophonyMainWindow(Adw.ApplicationWindow): monophony.backend.settings.set_value('window-height', size.height) def _on_show_artist(self, artist: str): - self.append_page(MonophonyArtistPage(self.player, artist)) + pass - def _on_show_queue(self): - self.append_page(MonophonyQueuePage(self.player)) + def _on_back_clicked(self): + pass def _on_about_clicked(self): win_about = Adw.AboutWindow.new() -- GitLab From 82d5bd3b443241029bbfa9b97a1cc08e745fe39b Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Fri, 8 Dec 2023 22:41:32 +0100 Subject: [PATCH 3/8] Complete layout prototype --- source/monophony/frontend/tabs/search_tab.py | 49 +++++++++++++++++-- .../monophony/frontend/windows/main_window.py | 21 +++----- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/source/monophony/frontend/tabs/search_tab.py b/source/monophony/frontend/tabs/search_tab.py index 57369c3..3ead11c 100644 --- a/source/monophony/frontend/tabs/search_tab.py +++ b/source/monophony/frontend/tabs/search_tab.py @@ -1,3 +1,4 @@ +from monophony.frontend.pages.artist_page import MonophonyArtistPage from monophony.frontend.pages.results_page import MonophonyResultsPage import gi @@ -14,12 +15,22 @@ class MonophonySearchTab(Gtk.Box): ent_search.set_placeholder_text(_('Search...')) ent_search.set_hexpand(True) ent_search.set_halign(Gtk.Align.FILL) - ent_search.set_margin_start(10) - ent_search.set_margin_end(10) ent_search.connect('activate', lambda e: self._on_search(e.get_text())) + self.btn_back = Gtk.Button.new_from_icon_name('go-previous-symbolic') + self.btn_back.set_tooltip_text(_('Go back')) + self.btn_back.set_visible(False) + self.btn_back.connect('clicked', lambda _b: self._on_back_clicked()) + + box_search = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + box_search.set_spacing(5) + box_search.set_margin_start(10) + box_search.set_margin_end(10) + box_search.append(self.btn_back) + box_search.append(ent_search) + clm_search = Adw.Clamp() - clm_search.set_child(ent_search) + clm_search.set_child(box_search) search_bar = Gtk.SearchBar() search_bar.set_show_close_button(False) @@ -34,6 +45,34 @@ class MonophonySearchTab(Gtk.Box): self.set_vexpand(True) self.player = player + def _on_back_clicked(self): + self.btn_back.set_visible(False) + self.pge_results.set_visible(True) + if self.pge_detail_results: + self.remove(self.pge_detail_results) + self.pge_detail_results = None + + def show_artist(self, artist: str): + self.btn_back.set_visible(True) + self.pge_results.set_visible(False) + if self.pge_detail_results: + self.remove(self.pge_detail_results) + + self.pge_detail_results = MonophonyArtistPage(self.player, artist) + self.pge_detail_results.set_vexpand(True) + self.pge_detail_results.set_valign(Gtk.Align.FILL) + self.append(self.pge_detail_results) + + def show_more(self, query: str, filter_: str): + self.btn_back.set_visible(True) + self.pge_results.set_visible(False) + if self.pge_detail_results: + self.remove(self.pge_detail_results) + + self.pge_detail_results = MonophonyResultsPage(self.player, query, filter_) + self.pge_detail_results.set_vexpand(True) + self.pge_detail_results.set_valign(Gtk.Align.FILL) + self.append(self.pge_detail_results) def _on_search(self, text: str): if not text: @@ -41,9 +80,11 @@ class MonophonySearchTab(Gtk.Box): if self.pge_results: self.remove(self.pge_results) + if self.pge_detail_results: + self.remove(self.pge_detail_results) + self.pge_detail_results = None self.pge_results = MonophonyResultsPage(self.player, text) self.pge_results.set_vexpand(True) self.pge_results.set_valign(Gtk.Align.FILL) self.append(self.pge_results) - diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index cbae9df..845104d 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -49,18 +49,11 @@ class MonophonyMainWindow(Adw.ApplicationWindow): _('Queue'), 'view-list-symbolic' ) - self.stack.set_visible_child_name('library') self.toaster = Adw.ToastOverlay.new() self.toaster.set_child(self.stack) - - self.btn_back = Gtk.Button.new_from_icon_name('go-previous-symbolic') - self.btn_back.set_tooltip_text(_('Go back')) - self.btn_back.set_visible(False) - self.btn_back.connect('clicked', lambda _b: self._on_back_clicked()) - mnu_main = Gio.Menu() mnu_main.append(_('Import Playlist'), 'import-custom-playlist') self.install_action( @@ -80,7 +73,6 @@ class MonophonyMainWindow(Adw.ApplicationWindow): switcher.set_stack(self.stack) header_bar = Adw.HeaderBar() - header_bar.pack_start(self.btn_back) header_bar.set_title_widget(switcher) header_bar.pack_end(btn_menu) @@ -116,18 +108,19 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.stack.append(widget) self.stack.navigate(Adw.NavigationDirection.FORWARD) - self.btn_back.set_visible(True) def _on_quit(self): size = self.get_default_size() monophony.backend.settings.set_value('window-width', size.width) monophony.backend.settings.set_value('window-height', size.height) - def _on_show_artist(self, artist: str): - pass + def _on_show_more(self, query: str, filter_: str): + self.stack.set_visible_child_name('search') + self.stack.get_visible_child().show_more(query, filter_) - def _on_back_clicked(self): - pass + def _on_show_artist(self, artist: str): + self.stack.set_visible_child_name('search') + self.stack.get_visible_child().show_artist(artist) def _on_about_clicked(self): win_about = Adw.AboutWindow.new() @@ -140,7 +133,7 @@ class MonophonyMainWindow(Adw.ApplicationWindow): 'ytmusicapi', 'Copyright © 2020 sigma67', Gtk.License.MIT_X11 ) win_about.add_legal_section( - 'mpris_server','Copyright © Alex DeLorenzo', Gtk.License.AGPL_3_0 + 'mpris_server', 'Copyright © Alex DeLorenzo', Gtk.License.AGPL_3_0 ) win_about.set_translator_credits(_('translator-credits')) win_about.set_issue_url('https://gitlab.com/zehkira/monophony/-/issues') -- GitLab From 0428c588a0ab71c94027f2eafe27ed82ea77bca8 Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Sat, 9 Dec 2023 13:58:34 +0100 Subject: [PATCH 4/8] Fix search bar appearance and back button --- source/monophony/frontend/tabs/search_tab.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/monophony/frontend/tabs/search_tab.py b/source/monophony/frontend/tabs/search_tab.py index 3ead11c..84119e0 100644 --- a/source/monophony/frontend/tabs/search_tab.py +++ b/source/monophony/frontend/tabs/search_tab.py @@ -24,8 +24,6 @@ class MonophonySearchTab(Gtk.Box): box_search = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) box_search.set_spacing(5) - box_search.set_margin_start(10) - box_search.set_margin_end(10) box_search.append(self.btn_back) box_search.append(ent_search) @@ -78,6 +76,7 @@ class MonophonySearchTab(Gtk.Box): if not text: return + self.btn_back.set_visible(False) if self.pge_results: self.remove(self.pge_results) if self.pge_detail_results: -- GitLab From e40ff267c09d6b04fe61dc3d98b03ac6144480c2 Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Sat, 9 Dec 2023 17:23:22 +0100 Subject: [PATCH 5/8] Finalize redesign --- source/monophony/backend/playlists.py | 8 +-- source/monophony/backend/yt.py | 23 +------ .../monophony/frontend/pages/artist_page.py | 11 +-- .../monophony/frontend/pages/results_page.py | 35 +++++----- .../frontend/popovers/song_popover.py | 2 +- source/monophony/frontend/rows/artist_row.py | 4 +- source/monophony/frontend/tabs/library_tab.py | 39 +++++++---- source/monophony/frontend/tabs/search_tab.py | 5 +- .../monophony/frontend/widgets/big_spinner.py | 34 +++++++++ source/monophony/frontend/widgets/player.py | 69 +++++++++---------- .../frontend/widgets/progress_bar.py | 20 ------ .../monophony/frontend/windows/main_window.py | 25 +++---- 12 files changed, 134 insertions(+), 141 deletions(-) create mode 100644 source/monophony/frontend/widgets/big_spinner.py delete mode 100644 source/monophony/frontend/widgets/progress_bar.py diff --git a/source/monophony/backend/playlists.py b/source/monophony/backend/playlists.py index 351a6be..7700d83 100644 --- a/source/monophony/backend/playlists.py +++ b/source/monophony/backend/playlists.py @@ -129,16 +129,14 @@ def remove_external_playlist(name: str): ) -def update_external_playlists(loader: object): - loader.lock.lock() +def update_external_playlists(lock: object): + lock.lock() lists = read_external_playlists() - loader.target = len(lists) for playlist in lists: import_playlist(playlist['title'], playlist['id'], False, True) - loader.progress() clean_up_playlists() - loader.lock.unlock() + lock.unlock() def clean_up_playlists(): diff --git a/source/monophony/backend/yt.py b/source/monophony/backend/yt.py index f6bd20d..f09c11d 100644 --- a/source/monophony/backend/yt.py +++ b/source/monophony/backend/yt.py @@ -3,23 +3,15 @@ import traceback, random, subprocess import ytmusicapi -def _parse_results(data: list, loader: object=None) -> list: +def _parse_results(data: list) -> list: try: yt = ytmusicapi.YTMusic() except: return [] - if loader: - loader.lock.lock() - loader.set_text(_('Parsing Results...')) - loader.target = len(data) - results = [] expected_types = {'album', 'song', 'video', 'playlist', 'artist', 'single'} for result in data: - if loader: - loader.progress() - if 'resultType' not in result or result['resultType'] not in expected_types: continue @@ -108,9 +100,6 @@ def _parse_results(data: list, loader: object=None) -> list: results.append(item) - if loader: - loader.lock.unlock() - return results @@ -241,9 +230,7 @@ def get_artist(browse_id: str) -> list: return _parse_results(data) -def search(query: str, filter_: str='', loader: object=None) -> list: - if loader: - loader.lock.lock() +def search(query: str, filter_: str='') -> list: try: yt = ytmusicapi.YTMusic() if filter_: @@ -251,10 +238,6 @@ def search(query: str, filter_: str='', loader: object=None) -> list: else: data = yt.search(query) except: - if loader: - loader.lock.unlock() return [] - if loader: - loader.lock.unlock() - return _parse_results(data, loader=loader) + return _parse_results(data) diff --git a/source/monophony/frontend/pages/artist_page.py b/source/monophony/frontend/pages/artist_page.py index 3f53546..37eaac4 100644 --- a/source/monophony/frontend/pages/artist_page.py +++ b/source/monophony/frontend/pages/artist_page.py @@ -1,7 +1,7 @@ import monophony.backend.yt from monophony.frontend.rows.importable_group_row import MonophonyImportableGroupRow from monophony.frontend.rows.locked_group_row import MonophonyLockedGroupRow -from monophony.frontend.widgets.progress_bar import MonophonyProgressBar +from monophony.frontend.widgets.big_spinner import MonophonyBigSpinner import gi gi.require_version('Adw', '1') @@ -27,14 +27,9 @@ class MonophonyArtistPage(Gtk.Box): self.pge_results.set_visible(False) self.append(self.pge_results) - self.bar_loading = MonophonyProgressBar(_('Loading...')) - self.bar_loading.target = 2 - self.bar_loading.set_halign(Gtk.Align.CENTER) - self.bar_loading.set_valign(Gtk.Align.CENTER) - self.bar_loading.set_vexpand(True) self.box_loading = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.box_loading.set_margin_bottom(10) - self.box_loading.append(self.bar_loading) + self.box_loading.append(MonophonyBigSpinner()) self.box_loading.set_visible(True) self.append(self.box_loading) @@ -49,9 +44,7 @@ class MonophonyArtistPage(Gtk.Box): def do_get_artist(self): self.search_lock.lock() - self.bar_loading.progress() results = monophony.backend.yt.get_artist(self.artist) - self.bar_loading.progress() if not results: self.pge_status.set_title(_('Artist Not Found')) self.box_loading.set_visible(False) diff --git a/source/monophony/frontend/pages/results_page.py b/source/monophony/frontend/pages/results_page.py index c7a2628..0177ee4 100644 --- a/source/monophony/frontend/pages/results_page.py +++ b/source/monophony/frontend/pages/results_page.py @@ -2,7 +2,7 @@ import monophony.backend.yt from monophony.frontend.rows.importable_group_row import MonophonyImportableGroupRow from monophony.frontend.rows.song_row import MonophonySongRow from monophony.frontend.rows.artist_row import MonophonyArtistRow -from monophony.frontend.widgets.progress_bar import MonophonyProgressBar +from monophony.frontend.widgets.big_spinner import MonophonyBigSpinner import gi gi.require_version('Adw', '1') @@ -28,13 +28,9 @@ class MonophonyResultsPage(Gtk.Box): self.pge_results.set_visible(False) self.append(self.pge_results) - bar_loading = MonophonyProgressBar(_('Searching...')) - bar_loading.set_halign(Gtk.Align.CENTER) - bar_loading.set_valign(Gtk.Align.CENTER) - bar_loading.set_vexpand(True) self.box_loading = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.box_loading.set_margin_bottom(10) - self.box_loading.append(bar_loading) + self.box_loading.append(MonophonyBigSpinner()) self.box_loading.set_visible(bool(query)) self.append(self.box_loading) @@ -45,14 +41,16 @@ class MonophonyResultsPage(Gtk.Box): self.search_lock = GLib.Mutex() self.player = player - GLib.Thread.new(None, self.do_search) - GLib.timeout_add(500, self.await_results) + if query: + GLib.Thread.new(None, self.do_search) + GLib.timeout_add(500, self.await_results) + else: + self.pge_status.set_visible(True) + self.pge_status.set_title('') def do_search(self): self.search_lock.lock() - self.results = monophony.backend.yt.search( - self.query, self.filter, self.box_loading.get_last_child() - ) + self.results = monophony.backend.yt.search(self.query, self.filter) self.search_lock.unlock() def await_results(self) -> bool: @@ -78,7 +76,8 @@ class MonophonyResultsPage(Gtk.Box): window = self.get_ancestor(Gtk.Window) if not self.filter: - btn_more = Gtk.Button.new_with_label(_('More')) + btn_more = Gtk.Button.new_from_icon_name('go-next-symbolic') + btn_more.set_tooltip_text(_('Show all')) btn_more.connect( 'clicked', lambda _b, f: window._on_show_more(self.query, f), @@ -86,7 +85,8 @@ class MonophonyResultsPage(Gtk.Box): ) box_songs.set_header_suffix(btn_more) - btn_more = Gtk.Button.new_with_label(_('More')) + btn_more = Gtk.Button.new_from_icon_name('go-next-symbolic') + btn_more.set_tooltip_text(_('Show all')) btn_more.connect( 'clicked', lambda _b, f: window._on_show_more(self.query, f), @@ -94,7 +94,8 @@ class MonophonyResultsPage(Gtk.Box): ) box_albums.set_header_suffix(btn_more) - btn_more = Gtk.Button.new_with_label(_('More')) + btn_more = Gtk.Button.new_from_icon_name('go-next-symbolic') + btn_more.set_tooltip_text(_('Show all')) btn_more.connect( 'clicked', lambda _b, f: window._on_show_more(self.query, f), @@ -102,7 +103,8 @@ class MonophonyResultsPage(Gtk.Box): ) box_playlists.set_header_suffix(btn_more) - btn_more = Gtk.Button.new_with_label(_('More')) + btn_more = Gtk.Button.new_from_icon_name('go-next-symbolic') + btn_more.set_tooltip_text(_('Show all')) btn_more.connect( 'clicked', lambda _b, f: window._on_show_more(self.query, f), @@ -110,7 +112,8 @@ class MonophonyResultsPage(Gtk.Box): ) box_videos.set_header_suffix(btn_more) - btn_more = Gtk.Button.new_with_label(_('More')) + btn_more = Gtk.Button.new_from_icon_name('go-next-symbolic') + btn_more.set_tooltip_text(_('Show all')) btn_more.connect( 'clicked', lambda _b, f: window._on_show_more(self.query, f), diff --git a/source/monophony/frontend/popovers/song_popover.py b/source/monophony/frontend/popovers/song_popover.py index 1bb335b..8fee2b2 100644 --- a/source/monophony/frontend/popovers/song_popover.py +++ b/source/monophony/frontend/popovers/song_popover.py @@ -39,7 +39,7 @@ class MonophonySongPopover(Gtk.PopoverMenu): None, lambda w, *_: w._on_add_clicked(song) ) - menu.append(_('Show Artist'), 'show-artist') + menu.append(_('View Artist'), 'show-artist') window.install_action( 'show-artist', None, diff --git a/source/monophony/frontend/rows/artist_row.py b/source/monophony/frontend/rows/artist_row.py index ec6a251..148c85b 100644 --- a/source/monophony/frontend/rows/artist_row.py +++ b/source/monophony/frontend/rows/artist_row.py @@ -11,7 +11,7 @@ class MonophonyArtistRow(Adw.ActionRow): self.artist = artist btn_view = Gtk.Button.new_from_icon_name('go-next-symbolic') - btn_view.set_tooltip_text(_('View Artist')) + btn_view.set_tooltip_text(_('View artist')) btn_view.set_vexpand(False) btn_view.set_valign(Gtk.Align.CENTER) btn_view.set_has_frame(False) @@ -20,7 +20,7 @@ class MonophonyArtistRow(Adw.ActionRow): lambda b: b.get_ancestor(Gtk.Window)._on_show_artist(self.artist['id']), ) self.add_suffix(btn_view) - self.set_tooltip_text(_('View Artist')) + self.set_tooltip_text(_('View artist')) self.set_property('activatable', True) self.connect( 'activated', diff --git a/source/monophony/frontend/tabs/library_tab.py b/source/monophony/frontend/tabs/library_tab.py index 3867f17..c634497 100644 --- a/source/monophony/frontend/tabs/library_tab.py +++ b/source/monophony/frontend/tabs/library_tab.py @@ -3,7 +3,7 @@ import monophony.backend.playlists from monophony.frontend.rows.local_group_row import MonophonyLocalGroupRow from monophony.frontend.rows.external_group_row import MonophonyExternalGroupRow from monophony.frontend.rows.song_row import MonophonySongRow -from monophony.frontend.widgets.progress_bar import MonophonyProgressBar +from monophony.frontend.widgets.big_spinner import MonophonyBigSpinner import gi gi.require_version('Adw', '1') @@ -19,6 +19,7 @@ class MonophonyLibraryTab(Gtk.Box): self.playlist_widgets = [] self.recents_widgets = [] self.old_recents = [] + self.loading_lock = GLib.Mutex() self.set_vexpand(True) self.box_meta = Adw.PreferencesPage.new() @@ -31,28 +32,34 @@ class MonophonyLibraryTab(Gtk.Box): self.pge_status.set_vexpand(True) self.pge_status.set_visible(False) self.pge_status.set_valign(Gtk.Align.FILL) - self.pge_status.set_icon_name('io.gitlab.zehkira.Monophony') + self.pge_status.set_icon_name('emblem-music-symbolic') self.pge_status.set_title(_('Your Library is Empty')) - self.pge_status.set_description( - _('Find songs to play using the search bar above') - ) self.append(self.pge_status) - bar_loading = MonophonyProgressBar(_('Loading Library...')) - bar_loading.set_halign(Gtk.Align.CENTER) - bar_loading.set_valign(Gtk.Align.CENTER) - bar_loading.set_vexpand(True) self.box_loading = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.box_loading.set_margin_bottom(10) - self.box_loading.append(bar_loading) + self.box_loading.append(MonophonyBigSpinner()) self.box_loading.set_visible(True) self.append(self.box_loading) - self.btn_play = Gtk.Button.new_with_label(_('Play All')) + btn_import = Gtk.Button.new_from_icon_name('list-add-symbolic') + btn_import.set_tooltip_text(_('Import playlist')) + btn_import.connect( + 'clicked', lambda _b: self.get_ancestor(Gtk.Window)._on_import_clicked() + ) + + self.btn_play = Gtk.Button.new_from_icon_name('media-playback-start-symbolic') + self.btn_play.set_tooltip_text(_('Play all')) self.btn_play.connect('clicked', self._on_play_all) + + box_suffix = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + box_suffix.set_spacing(5) + box_suffix.append(btn_import) + box_suffix.append(self.btn_play) + self.box_playlists = Adw.PreferencesGroup() self.box_playlists.set_title(_('Your Playlists')) - self.box_playlists.set_header_suffix(self.btn_play) + self.box_playlists.set_header_suffix(box_suffix) self.box_meta.add(self.box_playlists) self.box_recents = Adw.PreferencesGroup() @@ -61,7 +68,9 @@ class MonophonyLibraryTab(Gtk.Box): self.box_meta.add(self.box_recents) GLib.Thread.new( - None, monophony.backend.playlists.update_external_playlists, bar_loading + None, + monophony.backend.playlists.update_external_playlists, + self.loading_lock ) GLib.timeout_add(100, self.update) @@ -75,9 +84,9 @@ class MonophonyLibraryTab(Gtk.Box): GLib.Thread.new(None, self.player.play_queue, all_songs, 0) def update(self) -> bool: - if not self.box_loading.get_last_child().lock.trylock(): + if not self.loading_lock.trylock(): return True - self.box_loading.get_last_child().lock.unlock() + self.loading_lock.unlock() self.box_loading.set_visible(False) new_playlists = monophony.backend.playlists.read_playlists() diff --git a/source/monophony/frontend/tabs/search_tab.py b/source/monophony/frontend/tabs/search_tab.py index 84119e0..889f900 100644 --- a/source/monophony/frontend/tabs/search_tab.py +++ b/source/monophony/frontend/tabs/search_tab.py @@ -37,7 +37,10 @@ class MonophonySearchTab(Gtk.Box): search_bar.set_key_capture_widget(ent_search) self.append(search_bar) - self.pge_results = None + self.pge_results = MonophonyResultsPage(player) + self.pge_results.set_vexpand(True) + self.pge_results.set_valign(Gtk.Align.FILL) + self.append(self.pge_results) self.pge_detail_results = None self.set_vexpand(True) diff --git a/source/monophony/frontend/widgets/big_spinner.py b/source/monophony/frontend/widgets/big_spinner.py new file mode 100644 index 0000000..6c10e29 --- /dev/null +++ b/source/monophony/frontend/widgets/big_spinner.py @@ -0,0 +1,34 @@ +import gi +gi.require_version('Gtk', '4.0') +from gi.repository import Gdk, GObject, Gtk + + +class MonophonyBigSpinner(Gtk.Spinner): + def __init__(self): + super().__init__() + + self.set_halign(Gtk.Align.CENTER) + self.set_valign(Gtk.Align.CENTER) + self.set_hexpand(True) + self.set_vexpand(True) + + self.add_css_class('big-spinner') + css = Gtk.CssProvider.new() + css.load_from_data(''' + .big-spinner { + min-height: 72px; + min-width: 72px; + } + ''', -1) + Gtk.StyleContext.add_provider_for_display( + Gdk.Display.get_default(), + css, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ) + + self.bind_property( + 'visible', + self, + 'spinning', + GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL + ) diff --git a/source/monophony/frontend/widgets/player.py b/source/monophony/frontend/widgets/player.py index d4b524f..63be7ef 100644 --- a/source/monophony/frontend/widgets/player.py +++ b/source/monophony/frontend/widgets/player.py @@ -8,6 +8,17 @@ from gi.repository import Gdk, Gio, GLib, GObject, Gtk, Pango class MonophonyPlayer(Gtk.Box): + playback_icons = { + monophony.backend.player.PlaybackMode.NORMAL: + 'media-playlist-consecutive-symbolic', + monophony.backend.player.PlaybackMode.LOOP: + 'media-playlist-repeat-symbolic', + monophony.backend.player.PlaybackMode.SHUFFLE: + 'media-playlist-shuffle-symbolic', + monophony.backend.player.PlaybackMode.RADIO: + 'io.gitlab.zehkira.Monophony-symbolic', + } + def __init__(self, window: Gtk.Window, player: object): super().__init__(orientation=Gtk.Orientation.VERTICAL) volume = float(monophony.backend.settings.get_value('volume', 1)) @@ -96,12 +107,12 @@ class MonophonyPlayer(Gtk.Box): btn_prev.connect('clicked', self._on_previous_clicked) btn_prev.set_has_frame(False) - btn_more = Gtk.MenuButton() - btn_more.set_valign(Gtk.Align.CENTER) - btn_more.set_icon_name('view-more-symbolic') - btn_more.set_tooltip_text(_('More actions')) - btn_more.set_create_popup_func(self.build_menu_popup) - btn_more.set_has_frame(False) + self.btn_mode = Gtk.MenuButton() + self.btn_mode.set_valign(Gtk.Align.CENTER) + self.btn_mode.set_icon_name(MonophonyPlayer.playback_icons[player.mode]) + self.btn_mode.set_tooltip_text(_('Playback mode')) + self.btn_mode.set_create_popup_func(self.build_menu_popup) + self.btn_mode.set_has_frame(False) box_controls = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) box_controls.set_spacing(2) @@ -113,7 +124,7 @@ class MonophonyPlayer(Gtk.Box): box_controls.append(self.btn_pause) box_controls.append(self.spn_loading) box_controls.append(btn_next) - box_controls.append(btn_more) + box_controls.append(self.btn_mode) box_meta = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) box_meta.set_margin_top(10) @@ -181,30 +192,7 @@ class MonophonyPlayer(Gtk.Box): GLib.timeout_add(250, self.update) def build_menu_popup(self, btn: Gtk.MenuButton): - current_song = self.player.get_current_song() mnu_more = Gio.Menu() - if current_song: - sec_actions = Gio.Menu() - sec_actions.append(_('Add to...'), 'add-song-to') - self.window.install_action( - 'add-song-to', - None, - lambda w, *_: w._on_add_clicked(current_song) - ) - sec_actions.append(_('Show Queue'), 'show-queue') - self.window.install_action( - 'show-queue', - None, - lambda w, *_: w._on_show_queue() - ) - sec_actions.append(_('Show Artist'), 'show-artist') - self.install_action( - 'show-artist', - None, - lambda p, *_: p._on_show_artist_clicked() - ) - mnu_more.append_section(None, sec_actions) - sec_settings = Gio.Menu() chk_normal = Gtk.CheckButton.new_with_label(_('Normal Playback')) chk_normal.set_active( self.player.mode == monophony.backend.player.PlaybackMode.NORMAL @@ -242,11 +230,10 @@ class MonophonyPlayer(Gtk.Box): itm_shuffle.set_attribute_value( 'custom', GLib.Variant.new_string('shuffle') ) - sec_settings.append_item(itm_normal) - sec_settings.append_item(itm_loop) - sec_settings.append_item(itm_shuffle) - sec_settings.append_item(itm_autoplay) - mnu_more.append_section(None, sec_settings) + mnu_more.append_item(itm_normal) + mnu_more.append_item(itm_loop) + mnu_more.append_item(itm_shuffle) + mnu_more.append_item(itm_autoplay) pop_menu = Gtk.PopoverMenu() pop_menu.set_menu_model(mnu_more) pop_menu.add_child(chk_normal, 'normal') @@ -272,24 +259,36 @@ class MonophonyPlayer(Gtk.Box): mode = monophony.backend.player.PlaybackMode.SHUFFLE self.player.mode = mode monophony.backend.settings.set_value('mode', mode) + self.btn_mode.set_icon_name( + MonophonyPlayer.playback_icons[self.player.mode] + ) def _on_loop_toggled(self, btn: Gtk.CheckButton): if btn.get_active(): mode = monophony.backend.player.PlaybackMode.LOOP self.player.mode = mode monophony.backend.settings.set_value('mode', mode) + self.btn_mode.set_icon_name( + MonophonyPlayer.playback_icons[self.player.mode] + ) def _on_normal_toggled(self, btn: Gtk.CheckButton): if btn.get_active(): mode = monophony.backend.player.PlaybackMode.NORMAL self.player.mode = mode monophony.backend.settings.set_value('mode', mode) + self.btn_mode.set_icon_name( + MonophonyPlayer.playback_icons[self.player.mode] + ) def _on_radio_toggled(self, btn: Gtk.CheckButton): if btn.get_active(): mode = monophony.backend.player.PlaybackMode.RADIO self.player.mode = mode monophony.backend.settings.set_value('mode', mode) + self.btn_mode.set_icon_name( + MonophonyPlayer.playback_icons[self.player.mode] + ) def _on_show_artist_clicked(self): song = self.player.get_current_song() diff --git a/source/monophony/frontend/widgets/progress_bar.py b/source/monophony/frontend/widgets/progress_bar.py deleted file mode 100644 index fc8f46d..0000000 --- a/source/monophony/frontend/widgets/progress_bar.py +++ /dev/null @@ -1,20 +0,0 @@ -import gi -gi.require_version('Gtk', '4.0') -from gi.repository import GLib, Gtk - - -class MonophonyProgressBar(Gtk.ProgressBar): - def __init__(self, text: str=''): - super().__init__() - - self.lock = GLib.Mutex() - self.target = 100 - self._progress = 0 - - if text: - self.set_text(text) - self.set_show_text(True) - - def progress(self, step: int=1): - self._progress += step - self.set_fraction(self._progress / self.target) diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index 845104d..d45a284 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -14,7 +14,7 @@ from monophony.frontend.windows.import_window import MonophonyImportWindow import gi gi.require_version('Adw', '1') gi.require_version('Gtk', '4.0') -from gi.repository import Adw, Gio, GLib, Gtk +from gi.repository import Adw, GLib, Gtk class MonophonyMainWindow(Adw.ApplicationWindow): @@ -54,27 +54,16 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.toaster = Adw.ToastOverlay.new() self.toaster.set_child(self.stack) - mnu_main = Gio.Menu() - mnu_main.append(_('Import Playlist'), 'import-custom-playlist') - self.install_action( - 'import-custom-playlist', None, (lambda w, _a, _t: w._on_import_clicked()) - ) - mnu_main.append(_('About Monophony'), 'about-app') - self.install_action( - 'about-app', None, (lambda w, _a, _t: w._on_about_clicked()) - ) - btn_menu = Gtk.MenuButton() - btn_menu.set_tooltip_text(_('Primary Menu')) - btn_menu.set_primary(True) - btn_menu.set_icon_name('open-menu-symbolic') - btn_menu.set_menu_model(mnu_main) + btn_about = Gtk.Button.new_from_icon_name('help-about-symbolic') + btn_about.set_tooltip_text(_('About')) + btn_about.connect('clicked', lambda _b: self._on_about_clicked()) switcher = Adw.ViewSwitcher() switcher.set_stack(self.stack) header_bar = Adw.HeaderBar() header_bar.set_title_widget(switcher) - header_bar.pack_end(btn_menu) + header_bar.pack_start(btn_about) self.player_revealer = Gtk.Revealer() self.player_revealer.set_property('overflow', Gtk.Overflow.VISIBLE) @@ -91,7 +80,9 @@ class MonophonyMainWindow(Adw.ApplicationWindow): 'quit-app', None, (lambda w, *_: w.close()) ) self.install_action( - 'focus-search', None, (lambda w, *_: w.ent_search.grab_focus()) + 'focus-search', + None, + (lambda w, *_: w.stack.set_visible_child_name('search')) ) self.install_action( 'playlist-delete-undo', None, (lambda w, *_: w._on_undo_deletion()) -- GitLab From 9c47faaa2834512dc7cc2560e030a776644386af Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Sat, 9 Dec 2023 18:00:14 +0100 Subject: [PATCH 6/8] Make all artist names appear --- source/monophony/backend/yt.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/monophony/backend/yt.py b/source/monophony/backend/yt.py index f09c11d..021790a 100644 --- a/source/monophony/backend/yt.py +++ b/source/monophony/backend/yt.py @@ -39,7 +39,7 @@ def _parse_results(data: list) -> list: elif result['resultType'] == 'album': try: album = yt.get_album(result['browseId']) - item['author'] = result['artists'][0]['name'] + item['author'] = ', '.join([a['name'] for a in result['artists']]) item['id'] = result['browseId'] item['title'] = result['title'] item['contents'] = [ @@ -47,7 +47,7 @@ def _parse_results(data: list) -> list: 'id': str(s['videoId']), 'title': s['title'], 'type': 'song', - 'author': s['artists'][0]['name'], + 'author': ', '.join([a['name'] for a in s['artists']]), 'author_id': s['artists'][0]['id'], 'length': s['duration'], 'thumbnail': album['thumbnails'][0]['url'] @@ -68,7 +68,7 @@ def _parse_results(data: list) -> list: 'id': str(s['videoId']), 'title': s['title'], 'type': 'song', - 'author': s['artists'][0]['name'], + 'author': ', '.join([a['name'] for a in s['artists']]), 'author_id': s['artists'][0]['id'], 'length': s['duration'], 'thumbnail': s['thumbnails'][0]['url'] @@ -84,7 +84,7 @@ def _parse_results(data: list) -> list: continue item['id'] = str(result['videoId']) item['title'] = result['title'] - item['author'] = result['artists'][0]['name'] + item['author'] = ', '.join([a['name'] for a in result['artists']]) item['author_id'] = result['artists'][0]['id'] if 'duration' in result: item['length'] = result['duration'] @@ -137,7 +137,7 @@ def get_similar_song(video_id: str, ignore: list=None) -> dict: for item in data: track = { 'title': item['title'], - 'author': item['artists'][0]['name'], + 'author': ', '.join([a['name'] for a in item['artists']]), 'author_id': item['artists'][0]['id'], 'length': item['length'], 'id': item['videoId'], @@ -171,7 +171,7 @@ def get_recommendations() -> dict: if 'videoId' in item: songs.append({ 'title': item['title'], - 'author': item['artists'][0]['name'], + 'author': ', '.join([a['name'] for a in item['artists']]), 'author_id': item['artists'][0]['id'], 'id': item['videoId'], }) -- GitLab From 11560ff536d1653eb9220d1bd0453108f50c6808 Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Sat, 9 Dec 2023 18:27:15 +0100 Subject: [PATCH 7/8] Tweak player margins --- source/monophony/frontend/widgets/player.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/monophony/frontend/widgets/player.py b/source/monophony/frontend/widgets/player.py index 63be7ef..a0d5e52 100644 --- a/source/monophony/frontend/widgets/player.py +++ b/source/monophony/frontend/widgets/player.py @@ -28,7 +28,7 @@ class MonophonyPlayer(Gtk.Box): self.player.set_volume(volume, False) box_info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - box_info.set_margin_start(16) + box_info.set_margin_start(11) box_info.set_spacing(5) box_info.set_margin_end(5) box_info.set_halign(Gtk.Align.START) @@ -130,7 +130,7 @@ class MonophonyPlayer(Gtk.Box): box_meta.set_margin_top(10) box_meta.set_margin_bottom(10) box_meta.set_margin_start(5) - box_meta.set_margin_end(5) + box_meta.set_margin_end(8) box_meta.set_valign(Gtk.Align.END) box_meta.set_halign(Gtk.Align.FILL) box_meta.set_hexpand(True) -- GitLab From 69a72f44cf2fa3764adb4a6747af7544d1135a88 Mon Sep 17 00:00:00 2001 From: zehkira <9485872-zehkira@users.noreply.gitlab.com> Date: Sat, 9 Dec 2023 18:28:07 +0100 Subject: [PATCH 8/8] Make playlists box always visible --- source/monophony/frontend/tabs/library_tab.py | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/source/monophony/frontend/tabs/library_tab.py b/source/monophony/frontend/tabs/library_tab.py index c634497..35ac225 100644 --- a/source/monophony/frontend/tabs/library_tab.py +++ b/source/monophony/frontend/tabs/library_tab.py @@ -8,7 +8,7 @@ from monophony.frontend.widgets.big_spinner import MonophonyBigSpinner import gi gi.require_version('Adw', '1') gi.require_version('Gtk', '4.0') -from gi.repository import Adw, GLib, Gtk +from gi.repository import Adw, GLib, GObject, Gtk class MonophonyLibraryTab(Gtk.Box): @@ -28,20 +28,21 @@ class MonophonyLibraryTab(Gtk.Box): self.box_meta.set_valign(Gtk.Align.FILL) self.append(self.box_meta) - self.pge_status = Adw.StatusPage() - self.pge_status.set_vexpand(True) - self.pge_status.set_visible(False) - self.pge_status.set_valign(Gtk.Align.FILL) - self.pge_status.set_icon_name('emblem-music-symbolic') - self.pge_status.set_title(_('Your Library is Empty')) - self.append(self.pge_status) - self.box_loading = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.box_loading.set_margin_bottom(10) self.box_loading.append(MonophonyBigSpinner()) self.box_loading.set_visible(True) self.append(self.box_loading) + self.box_meta.bind_property( + 'visible', + self.box_loading, + 'visible', + GObject.BindingFlags.SYNC_CREATE | + GObject.BindingFlags.INVERT_BOOLEAN | + GObject.BindingFlags.BIDIRECTIONAL + ) + btn_import = Gtk.Button.new_from_icon_name('list-add-symbolic') btn_import.set_tooltip_text(_('Import playlist')) btn_import.connect( @@ -119,8 +120,6 @@ class MonophonyLibraryTab(Gtk.Box): self.playlist_widgets.append(new_widget) self.box_playlists.add(new_widget) - self.box_playlists.set_visible(len(self.playlist_widgets) > 0) - # player could be adding to recents at this moment if self.player.is_busy(): return True @@ -140,10 +139,6 @@ class MonophonyLibraryTab(Gtk.Box): self.box_recents.add(widget) self.recents_widgets.append(widget) - self.box_meta.set_visible( - self.box_playlists.get_visible() or self.box_recents.get_visible() - ) - self.pge_status.set_visible( - not (self.box_meta.get_visible() or self.box_loading.get_visible()) - ) + self.box_recents.set_visible(bool(new_recents)) + return True -- GitLab