]> code.delx.au - notipod/blobdiff - NotiPod.py
Fixed playlist
[notipod] / NotiPod.py
index df65459724b4f0a44deaeb8253bd1338498efd8a..4bb501dfee0c2ec870f717da1a3fc582cdb02b84 100644 (file)
@@ -104,16 +104,20 @@ class NotiPodAppDelegate(NSObject):
        playlistModel = objc.IBOutlet()
        folderModel = objc.IBOutlet()
        loadingSheet = objc.IBOutlet()
-       synchronizingSheet = objc.IBOutlet()
+       loadingLabel = objc.IBOutlet()
 
+       def awakeFromNib(self):
+               self.gen = None
 
        # Delegate methods
        def applicationWillFinishLaunching_(self, _):
                pass
 
        def applicationDidFinishLaunching_(self, _):
-               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
-               self.performSelectorInBackground_withObject_(self.loadFromThread, None)
+               self.library = libsyncitunes.ITunesLibrary.alloc().init()
+               def finish():
+                       self.playlistModel.setPlaylists(self.library.get_playlists())
+               self.runGenerator(lambda: self.library.load_(None), finish)
 
        def applicationWillTerminate_(self, _):
                self.prefs().synchronize()
@@ -122,25 +126,37 @@ class NotiPodAppDelegate(NSObject):
                return True
 
 
-       def loadFromThread(self):
-               pool = NSAutoreleasePool.alloc().init()
-               self.library = libsyncitunes.ITunesLibrary.alloc().init()
-               self.performSelectorOnMainThread_withObject_waitUntilDone_(self.finishLoading, None, True)
-               del pool
+       # Utility methods
+       def runGenerator(self, func, finish):
+               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
+               self.gen = func()
+               self.finish = finish
+               self.runGeneratorNext()
 
-       def finishLoading(self):
-               self.playlistModel.setPlaylists(self.library.get_playlists())
+       def runGeneratorNext(self):
+               if self.gen is None or self.finish is None:
+                       return
+               try:
+                       msg = self.gen.next()
+                       self.loadingLabel.setStringValue_(msg)
+                       self.performSelector_withObject_afterDelay_(
+                               self.runGeneratorNext, None, 0)
+               except StopIteration:
+                       self.stopGenerator()
+
+       def stopGenerator(self):
+               self.gen = None
                NSApp.endSheet_(self.loadingSheet)
-               self.loadingSheet.close()
+               self.loadingSheet.orderOut_(self)
+               self.finish()
+               self.finish = None
 
        @objc.IBAction
-       def doSync_(self, sender):
-               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.synchronizingSheet, self.window, None, None, None)
-               self.performSelectorInBackground_withObject_(self.syncFromThread, None)
-
-       def syncFromThread(self):
-               pool = NSAutoreleasePool.alloc().init()
+       def doCancel_(self, sender):
+               self.stopGenerator()
 
+       @objc.IBAction
+       def doSync_(self, sender):
                folder = self.folders()[0]
                playlists = [self.library.get_playlist_pid(pid) for pid in self.playlists()]
 
@@ -150,15 +166,19 @@ class NotiPodAppDelegate(NSObject):
                        libsyncitunes.export_m3u(dry_run=False, dest=folder, path_prefix="",
                                        playlist_name=playlist.name, files=playlist.tracks)
 
-               libsyncitunes.sync(dry_run=False,
-                       source=self.library.folder, dest=folder, files=all_tracks)
-
-               self.performSelectorOnMainThread_withObject_waitUntilDone_(self.finishSync, None, True)
-               del pool
-
-       def finishSync(self):
-               NSApp.endSheet_(self.synchronizingSheet)
-               self.synchronizingSheet.close()
+               def finish():
+                       NSRunAlertPanel("Complete!", "Synchronisation is complete", "Ok", None, None)
+               self.runGenerator(
+                       lambda:
+                               libsyncitunes.sync(
+                                       dry_run=False,
+                                       source=self.library.folder,
+                                       dest=folder, 
+                                       files_to_copy=all_tracks
+                               )
+                       ,
+                       finish
+               )
 
 
        # Public accessors