def awakeFromNib(self):
self.folderPopup.addItemsWithTitles_(NSApp.delegate().folders())
self.folderPopup.selectItemAtIndex_(2)
+ self.lastIndex = 2
@objc.IBAction
def doSelectFolder_(self, sender):
- if self.folderPopup.indexOfSelectedItem() >= 2:
+ currentIndex = self.folderPopup.indexOfSelectedItem()
+ if currentIndex >= 2:
+ self.lastIndex = currentIndex
NSApp.delegate().addFolder_(self.folderPopup.titleOfSelectedItem())
return
panel = NSOpenPanel.openPanel()
NSApp.delegate().addFolder_(folder)
self.folderPopup.insertItemWithTitle_atIndex_(folder, 2)
self.folderPopup.selectItemAtIndex_(2)
+ else:
+ self.folderPopup.selectItemAtIndex_(self.lastIndex)
class NotiPodAppDelegate(NSObject):
playlistModel = objc.IBOutlet()
folderModel = objc.IBOutlet()
loadingSheet = 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()
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 doCancel_(self, sender):
+ self.stopGenerator()
@objc.IBAction
def doSync_(self, sender):
all_tracks = []
for playlist in playlists:
- print playlist.name, playlist.tracks
all_tracks.extend(playlist.tracks)
- libsyncitunes.export_m3u(dry_run=True, dest=folder, path_prefix="",
+ libsyncitunes.export_m3u(dry_run=False, dest=folder, path_prefix="",
playlist_name=playlist.name, files=playlist.tracks)
- libsyncitunes.sync(dry_run=True,
- source=self.library.folder, dest=folder, files=all_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
+ )
# Public accessors
def main():
- logging.basicConfig(format="%(levelname)s: %(message)s")
- logging.getLogger().setLevel(logging.DEBUG)
+### logging.basicConfig(format="%(levelname)s: %(message)s")
+### logging.getLogger().setLevel(logging.DEBUG)
AppHelper.runEventLoop()
if __name__ == "__main__":