diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index 09aac7b..89a38b5 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -27,6 +27,7 @@ import sys import shutil import traceback import urllib2 +import time import comic2ebook import kindlestrip from image import ProfileData @@ -101,6 +102,15 @@ class WorkerThread(QtCore.QThread): def __del__(self): self.wait() + def sync(self): + self.conversionAlive = self.parent.conversionAlive + + def clean(self): + self.parent.needClean = True + self.emit(QtCore.SIGNAL("hideProgressBar")) + self.emit(QtCore.SIGNAL("addMessage"), 'Conversion interrupted.', 'error') + self.emit(QtCore.SIGNAL("modeConvert"), True) + def run(self): self.emit(QtCore.SIGNAL("modeConvert"), False) profile = ProfileData.ProfileLabels[str(GUI.DeviceBox.currentText())] @@ -138,8 +148,11 @@ class WorkerThread(QtCore.QThread): argv.append("--forcecolor") for i in range(GUI.JobList.count()): currentJobs.append(str(GUI.JobList.item(i).text())) - GUI.JobList.clear() for job in currentJobs: + time.sleep(1) + if not self.conversionAlive: + self.clean() + return self.errors = False self.emit(QtCore.SIGNAL("addMessage"), 'Source: ' + job, 'info') if str(GUI.FormatBox.currentText()) == 'CBZ': @@ -152,15 +165,23 @@ class WorkerThread(QtCore.QThread): outputPath = comic2ebook.main(jobargv, self) self.emit(QtCore.SIGNAL("hideProgressBar")) except UserWarning as warn: - self.errors = True - self.emit(QtCore.SIGNAL("addMessage"), str(warn), 'warning') - self.emit(QtCore.SIGNAL("addMessage"), 'KCC failed to create output file!', 'warning') + if not self.conversionAlive: + self.clean() + return + else: + self.errors = True + self.emit(QtCore.SIGNAL("addMessage"), str(warn), 'warning') + self.emit(QtCore.SIGNAL("addMessage"), 'KCC failed to create output file!', 'warning') except Exception as err: self.errors = True type_, value_, traceback_ = sys.exc_info() self.emit(QtCore.SIGNAL("showDialog"), "Error during conversion %s:\n\n%s\n\nTraceback:\n%s" % (jobargv[-1], str(err), traceback.format_tb(traceback_))) self.emit(QtCore.SIGNAL("addMessage"), 'KCC failed to create EPUB!', 'error') + if not self.conversionAlive: + os.remove(outputPath) + self.clean() + return if not self.errors: if str(GUI.FormatBox.currentText()) == 'CBZ': self.emit(QtCore.SIGNAL("addMessage"), 'Creating CBZ file... Done!', 'info', True) @@ -188,6 +209,11 @@ class WorkerThread(QtCore.QThread): # ERROR: Unknown generic error self.kindlegenErrorCode = 1 continue + if not self.conversionAlive: + os.remove(outputPath) + os.remove(outputPath.replace('.epub', '.mobi')) + self.clean() + return if self.kindlegenErrorCode == 0: self.emit(QtCore.SIGNAL("addMessage"), 'Creating MOBI file... Done!', 'info', True) self.emit(QtCore.SIGNAL("addMessage"), 'Removing SRCS header...', 'info') @@ -343,19 +369,33 @@ class Ui_KCC(object): GUI.ClearButton.setEnabled(enable) GUI.FileButton.setEnabled(enable) GUI.DeviceBox.setEnabled(enable) - GUI.ConvertButton.setEnabled(enable) GUI.FormatBox.setEnabled(enable) GUI.OptionsBasic.setEnabled(enable) GUI.OptionsAdvanced.setEnabled(enable) GUI.OptionsAdvancedGamma.setEnabled(enable) GUI.OptionsExpert.setEnabled(enable) if enable: + self.conversionAlive = False + self.worker.sync() + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/Other/icons/convert.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + GUI.ConvertButton.setIcon(icon) + GUI.ConvertButton.setText('Convert') + GUI.ConvertButton.setEnabled(True) if self.currentMode == 1: self.modeBasic() elif self.currentMode == 2: self.modeAdvanced() elif self.currentMode == 3: self.modeExpert() + else: + self.conversionAlive = True + self.worker.sync() + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/Other/icons/clear.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + GUI.ConvertButton.setIcon(icon) + GUI.ConvertButton.setText('Abort') + GUI.ConvertButton.setEnabled(True) def changeGamma(self, value): value = float(value) @@ -441,19 +481,25 @@ class Ui_KCC(object): GUI.ProgressBar.setValue(GUI.ProgressBar.value() + 1) def convertStart(self): - if self.needClean: - self.needClean = False - GUI.JobList.clear() - if GUI.JobList.count() == 0: - self.addMessage('No files selected! Please choose files to convert.', 'error') - self.needClean = True - return - if self.currentMode > 2 and (str(GUI.customWidth.text()) == '' or str(GUI.customHeight.text()) == ''): - GUI.JobList.clear() - self.addMessage('Target resolution is not set!', 'error') - self.needClean = True - return - self.worker.start() + if self.conversionAlive: + GUI.ConvertButton.setEnabled(False) + self.addMessage('Process will be interrupted. Please wait.', 'warning') + self.conversionAlive = False + self.worker.sync() + else: + if self.needClean: + self.needClean = False + GUI.JobList.clear() + if GUI.JobList.count() == 0: + self.addMessage('No files selected! Please choose files to convert.', 'error') + self.needClean = True + return + if self.currentMode > 2 and (str(GUI.customWidth.text()) == '' or str(GUI.customHeight.text()) == ''): + GUI.JobList.clear() + self.addMessage('Target resolution is not set!', 'error') + self.needClean = True + return + self.worker.start() def hideProgressBar(self): GUI.ProgressBar.hide() @@ -494,6 +540,7 @@ class Ui_KCC(object): self.options = self.options.toPyObject() self.worker = WorkerThread(self) self.versionCheck = VersionThread(self) + self.conversionAlive = False self.needClean = True self.addMessage('Welcome!', 'info') @@ -577,3 +624,4 @@ class Ui_KCC(object): self.versionCheck.start() self.hideProgressBar() self.changeDevice(self.lastDevice) + self.worker.sync() diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 685cdde..43bc326 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -364,6 +364,10 @@ def dirImgProcess(path): queue.get(True, 1) except: pass + if not GUI.conversionAlive: + pool.terminate() + rmtree(path) + raise UserWarning("Conversion interrupted.") GUI.emit(QtCore.SIGNAL("progressBarTick")) pool.join() queue.close()