]> code.delx.au - notipod/blobdiff - notipod_gui.py
Don't sync to folders that don't exist
[notipod] / notipod_gui.py
index ee97365fe05de5a0d2f6647b0f9b44e4d9f2c515..4c175a909f2cfd94625c9d334cf30e2f54c9cb74 100644 (file)
@@ -48,16 +48,23 @@ class PlaylistModel(NSObject):
                        return len(playlist.children)
 
        def outlineView_objectValueForTableColumn_byItem_(self, _, col, playlist):
-               col = col.identifier() if col else "playlist"
+               if not col:
+                       return
+               col = col.identifier()
 
                if col == "selected":
                        selected = NSApp.delegate().playlists()
                        return playlist.pid in selected
-               if col == None or col == "playlist":
+               if col == "icon":
+                       return NSImage.imageNamed_("playlist-" + playlist.ptype)
+               if col == "playlist":
                        return playlist.name
 
        def outlineView_setObjectValue_forTableColumn_byItem_(self, _, v, col, playlist):
-               col = col.identifier() if col else "playlist"
+               if not col:
+                       return
+               col = col.identifier()
+
 
                if col != "selected":
                        return
@@ -105,13 +112,20 @@ class FolderModel(NSObject):
 
 class NotiPodController(NSObject):
        window = objc.IBOutlet()
-       playlistModel = objc.IBOutlet()
-       folderModel = objc.IBOutlet()
+
        loadingSheet = objc.IBOutlet()
        loadingLabel = objc.IBOutlet()
+       loadingIndicator = objc.IBOutlet()
+
+       previewWindow = objc.IBOutlet()
+       previewText = objc.IBOutlet()
+
+       playlistModel = objc.IBOutlet()
+       folderModel = objc.IBOutlet()
+
 
        def awakeFromNib(self):
-               self.gen = None
+               self.runningGenerator = False
 
        # Delegate methods
        def applicationWillFinishLaunching_(self, _):
@@ -132,6 +146,9 @@ class NotiPodController(NSObject):
 
        # Utility methods
        def runGenerator(self, func, finish):
+               assert not self.runningGenerator
+               self.runningGenerator = True
+               self.loadingIndicator.startAnimation_(self)
                NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
                arg = (func(), finish)
                self.performSelectorInBackground_withObject_(self.runGeneratorThread, arg)
@@ -139,21 +156,55 @@ class NotiPodController(NSObject):
        def runGeneratorThread(self, (gen, finish)):
                pool = NSAutoreleasePool.alloc().init()
                for msg in gen:
+                       if not self.runningGenerator:
+                               break
                        self.loadingLabel.performSelectorOnMainThread_withObject_waitUntilDone_(
                                self.loadingLabel.setStringValue_, msg, True)
                self.performSelectorOnMainThread_withObject_waitUntilDone_(
                        self.stopGenerator, finish, True)
+               self.runningGenerator = False
                del pool
-       
+
        def stopGenerator(self, finish):
+               self.runningGenerator = False
                NSApp.endSheet_(self.loadingSheet)
                self.loadingSheet.orderOut_(self)
-               if finish:
-                       finish()
+               self.loadingIndicator.stopAnimation_(self)
+               finish()
 
        @objc.IBAction
        def doCancel_(self, sender):
-               self.stopGenerator(None)
+               self.runningGenerator = False
+
+       def doPreviewThread(self):
+               yield "Calculating changes..."
+
+               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)
+
+               gen = libnotipod.sync(
+                       dry_run=True,
+                       source=self.library.folder,
+                       dest=folder, 
+                       files_to_copy=all_tracks
+               )
+               self.previewResult = "\n".join(gen)
+
+       @objc.IBAction
+       def doPreview_(self, sender):
+               self.previewResult = ""
+               self.previewWindow.orderOut_(self)
+
+               def finish():
+                       self.previewText.textStorage().mutableString().setString_(self.previewResult)
+                       self.previewWindow.center()
+                       self.previewWindow.makeKeyAndOrderFront_(self)
+
+               self.runGenerator(self.doPreviewThread, finish)
 
        @objc.IBAction
        def doSync_(self, sender):