+ # 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 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.orderOut_(self)
+ self.finish()
+ self.finish = None
+
+ @objc.IBAction
+ 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()]
+
+ all_tracks = []
+ for playlist in playlists:
+ all_tracks.extend(playlist.tracks)
+ libsyncitunes.export_m3u(dry_run=False, dest=folder, path_prefix="",
+ playlist_name=playlist.name, files=playlist.tracks)
+
+ 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
+ )
+
+