@@ 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):