~comcloudway/melon

e83700d23b362a82a45a0c4d1e2b256ea9dda77f — Jakob Meier 7 months ago b942e97
Made server feed loading asyncronous
1 files changed, 38 insertions(+), 14 deletions(-)

M melon/browse/server.py
M melon/browse/server.py => melon/browse/server.py +38 -14
@@ 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):