~comcloudway/melon

72362746fff252c1fb8b93467c13fcf54767d843 — Jakob Meier 6 months ago 44ae144
load feeds on separate thread & draw widgets on main thread
1 files changed, 20 insertions(+), 13 deletions(-)

M melon/browse/server.py
M melon/browse/server.py => melon/browse/server.py +20 -13
@@ 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()