# 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
+ arg = (func(), finish)
+ self.performSelectorInBackground_withObject_(self.runGeneratorThread, arg)
+
+ def runGeneratorThread(self, (gen, finish)):
+ pool = NSAutoreleasePool.alloc().init()
+ for msg in gen:
+ self.loadingLabel.performSelectorOnMainThread_withObject_waitUntilDone_(
+ self.loadingLabel.setStringValue_, msg, True)
+ self.performSelectorOnMainThread_withObject_waitUntilDone_(
+ self.stopGenerator, finish, True)
+ del pool
+
+ def stopGenerator(self, finish):
NSApp.endSheet_(self.loadingSheet)
self.loadingSheet.orderOut_(self)
- self.finish()
- self.finish = None
+ if finish:
+ finish()
@objc.IBAction
def doCancel_(self, sender):
- self.stopGenerator()
+ self.stopGenerator(None)
@objc.IBAction
def doSync_(self, sender):