From e83700d23b362a82a45a0c4d1e2b256ea9dda77f Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Tue, 20 Feb 2024 10:42:37 +0100 Subject: [PATCH] Made server feed loading asyncronous --- melon/browse/server.py | 52 ++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/melon/browse/server.py b/melon/browse/server.py index e98811f..603ecaa 100644 --- a/melon/browse/server.py +++ b/melon/browse/server.py @@ -3,6 +3,7 @@ import gi gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw, Gio, Gdk, GLib +import threading from melon.servers.utils import get_servers_list, get_server_instance from melon.servers import SearchMode @@ -106,26 +107,49 @@ class Search(ViewStackPage): self.inner.append(self.results) class Feed(ViewStackPage): - def __init__(self, plugin, feed): - super().__init__(feed.id, feed.name, feed.icon) - self.instance = plugin - results = self.instance.get_public_feed_content(feed.id) + def update(self): + # show spinner + spinner = Gtk.Spinner() + spinner.set_size_request(50, 50) + spinner.start() + cb = Gtk.CenterBox() + cb.set_center_widget(spinner) + self.inner.set_child(cb) + # long task + results = self.instance.get_public_feed_content(self.feed.id) + # display results if len(results) == 0: # show empty feed page - self.widget = Adw.StatusPage() - self.widget.set_title("*crickets chirping*") - self.widget.set_description("This feed is empty") - self.widget.set_icon_name("weather-few-clouds-night-symbolic") + status = Adw.StatusPage() + status.set_title("*crickets chirping*") + status.set_description("This feed is empty") + status.set_icon_name("weather-few-clouds-night-symbolic") + self.inner.set_child(status) else: # render results - self.widget = Adw.Clamp() - self.scroll = Gtk.ScrolledWindow() - self.widget.set_child(self.scroll) - self.scrollable = Adw.PreferencesGroup() - self.scroll.set_child(self.scrollable) + scrollable = Adw.PreferencesGroup() + self.inner.set_child(scrollable) app_settings = get_app_settings() for item in results: - self.scrollable.add(AdaptiveFeedItem(item, app_settings["show_images_in_browse"])) + scrollable.add(AdaptiveFeedItem(item, app_settings["show_images_in_browse"])) + + thread = None + def do_update(self): + if not self.thread is None: + # wait for old thread to finish + self.thread.join() + self.thread = threading.Thread(target=self.update) + self.thread.daemon = True + self.thread.start() + + def __init__(self, plugin, feed): + super().__init__(feed.id, feed.name, feed.icon) + self.instance = plugin + self.feed = feed + self.widget = Adw.Clamp() + self.inner = Gtk.ScrolledWindow() + self.widget.set_child(self.inner) + self.do_update() class BrowseServerScreen(Adw.NavigationPage): def on_open_in_browser(self, arg): -- 2.38.5