Fixed the final two synchronous calls I could find
[jamaendo] / jamaui / showalbum.py
index 218d998..7d0eed3 100644 (file)
@@ -34,8 +34,11 @@ from settings import settings
 from postoffice import postoffice
 import util
 import logging
+import thread
+import gobject
 from albumlist import TrackList
 from playlists import add_to_playlist
+from fetcher import Fetcher
 
 import webbrowser
 
@@ -46,6 +49,7 @@ class ShowAlbum(hildon.StackableWindow):
         hildon.StackableWindow.__init__(self)
         self.set_title(album.artist_name)
         self.album = album
+        self.fetcher = None
 
         self.connect('destroy', self.on_destroy)
 
@@ -70,9 +74,10 @@ class ShowAlbum(hildon.StackableWindow):
         self.tracks = TrackList(numbers=True)
         self.tracks.connect('row-activated', self.row_activated)
 
-        self.tracklist = jamaendo.get_tracks(album.ID)
-        for track in self.tracklist:
-            self.tracks.add_track(track)
+        self.tracklist = []
+        #self.tracklist = jamaendo.get_tracks(album.ID)
+        #for track in self.tracklist:
+        # self.tracks.add_track(track)
 
         top_hbox.pack_start(vbox1, False)
         top_hbox.pack_start(vbox2, True)
@@ -92,6 +97,7 @@ class ShowAlbum(hildon.StackableWindow):
         postoffice.notify('request-album-cover', self.album.ID, 300)
 
         self.create_menu()
+        self.start_track_fetcher()
 
     def create_menu(self):
         def on_player(*args):
@@ -111,12 +117,34 @@ class ShowAlbum(hildon.StackableWindow):
 
     def on_destroy(self, wnd):
         postoffice.disconnect('album-cover', self)
+        if self.fetcher:
+            self.fetcher.stop()
+            self.fetcher = None
+
+    def start_track_fetcher(self):
+        if self.fetcher:
+            self.fetcher.stop()
+            self.fetcher = None
+        self.fetcher = Fetcher(lambda: jamaendo.get_tracks(self.album.ID), self,
+                               on_item = self.on_track_result,
+                               on_ok = self.on_track_complete,
+                               on_fail = self.on_track_complete)
+        self.fetcher.start()
+
+    def on_track_result(self, wnd, item):
+        if wnd is self:
+            self.tracklist.append(item)
+            self.tracks.add_track(item)
+
+    def on_track_complete(self, wnd, error=None):
+        if wnd is self:
+            self.fetcher.stop()
+            self.fetcher = None
 
     def on_album_cover(self, albumid, size, cover):
         if albumid == self.album.ID and size == 300:
             self.cover.set_from_file(cover)
 
-
     def on_add_to_playlist(self, button, user_data=None):
         add_to_playlist(self, self.tracklist)
 
@@ -133,8 +161,19 @@ class ShowAlbum(hildon.StackableWindow):
         return btn
 
     def on_goto_artist(self, btn):
-        artist = jamaendo.get_artist(int(self.album.artist_id))
-        self.open_item(artist)
+        def threadfun(wnd, artist_id):
+            try:
+                artist = jamaendo.get_artist(artist_id)
+                def oncomplete(wnd, artist):
+                    wnd.open_item(artist)
+                    hildon.hildon_gtk_window_set_progress_indicator(wnd, 0)
+                gobject.idle_add(oncomplete, wnd, artist)
+            except:
+                def onfail(wnd):
+                    hildon.hildon_gtk_window_set_progress_indicator(wnd, 0)
+                gobject.idle_add(onfail, wnd)
+        hildon.hildon_gtk_window_set_progress_indicator(self, 1)
+        thread.start_new_thread(threadfun, (self, int(self.album.artist_id)))
 
     def on_download(self, btn):
         banner = hildon.hildon_banner_show_information(self, '', "Opening in web browser")
@@ -158,6 +197,7 @@ class ShowAlbum(hildon.StackableWindow):
         self.open_item(self.album)
 
     def row_activated(self, treeview, path, view_column):
+        # TODO: wait for all tracks to load
         _id = self.tracks.get_track_id(path)
         playlist = Playlist(self.tracklist)
         playlist.jump_to(_id)