From 72362746fff252c1fb8b93467c13fcf54767d843 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Fri, 8 Mar 2024 15:01:32 +0100 Subject: [PATCH] load feeds on separate thread & draw widgets on main thread --- melon/browse/server.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/melon/browse/server.py b/melon/browse/server.py index 51f224e..88aa947 100644 --- a/melon/browse/server.py +++ b/melon/browse/server.py @@ -117,9 +117,11 @@ class Feed(ViewStackPage): cb.set_center_widget(spinner) self.inner.set_child(cb) # long task - results = self.instance.get_public_feed_content(self.feed.id) + self.results = self.instance.get_public_feed_content(self.feed.id) + GLib.idle_add(self.display) + def display(self): # display results - if len(results) == 0: + if len(self.results) == 0: # show empty feed page status = Adw.StatusPage() status.set_title(_("*crickets chirping*")) @@ -131,14 +133,9 @@ class Feed(ViewStackPage): scrollable = Adw.PreferencesGroup() self.inner.set_child(scrollable) app_settings = get_app_settings() - for item in results: + for item in self.results: 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() @@ -161,6 +158,16 @@ class BrowseServerScreen(Adw.NavigationPage): return url = self.instance.get_external_url() Gtk.UriLauncher.new(uri=url).launch() + def render_feeds(self): + # runs on main + for feed in self.feeds: + widg = Feed(self.instance, feed) + widg.bind_to(self.view_stack) + def load_feeds(self): + # runs in thread + self.feeds = self.instance.get_public_feeds() + GLib.idle_add(self.render_feeds) + def __init__(self, id, window=None, *args, **kwargs): super().__init__(*args, **kwargs) server = get_servers_list()[id] @@ -172,11 +179,6 @@ class BrowseServerScreen(Adw.NavigationPage): self.search = Search(self.instance) self.search.bind_to(self.view_stack) - self.feeds = self.instance.get_public_feeds() - for feed in self.feeds: - widg = Feed(self.instance, feed) - widg.bind_to(self.view_stack) - # top bar self.switcher = Adw.ViewSwitcher() self.switcher.set_policy(Adw.ViewSwitcherPolicy.WIDE) @@ -200,3 +202,8 @@ class BrowseServerScreen(Adw.NavigationPage): if not window is None: window.breakpoint.add_setter(self.header_bar, "title-widget", Gtk.Box()) window.breakpoint.add_setter(self.bottom_bar, "reveal", True) + + # start load_feeds thread + self.thread = threading.Thread(target=self.load_feeds) + self.thread.daemon = True + self.thread.start() -- 2.38.5