X-Git-Url: https://code.delx.au/notipod/blobdiff_plain/9b9d4091c893e58ee0f3a39b243fac098f11a4d6..2a63113c140f7b0d41c5980fab90af8510129d34:/NotiPod.py diff --git a/NotiPod.py b/NotiPod.py index df65459..4bb501d 100644 --- a/NotiPod.py +++ b/NotiPod.py @@ -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