diff --git a/kindlecomicconverter/KCC_gui.py b/kindlecomicconverter/KCC_gui.py index bc5c6e3..28e4d00 100644 --- a/kindlecomicconverter/KCC_gui.py +++ b/kindlecomicconverter/KCC_gui.py @@ -16,6 +16,11 @@ # OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. +from PySide6.QtCore import (QSize, QUrl, Qt, Signal, QIODeviceBase, QEvent, QThread, QSettings) +from PySide6.QtGui import (QColor, QIcon, QPixmap, QDesktopServices) +from PySide6.QtWidgets import (QApplication, QLabel, QListWidgetItem, QMainWindow, QApplication, QSystemTrayIcon, QFileDialog, QMessageBox, QDialog) +from PySide6.QtNetwork import (QLocalSocket, QLocalServer) + import os import re import sys @@ -25,9 +30,6 @@ from shutil import move, rmtree from subprocess import STDOUT, PIPE import requests -# noinspection PyUnresolvedReferences -from PySide6 import QtGui, QtCore, QtWidgets, QtNetwork -from PySide6.QtCore import Qt from xml.sax.saxutils import escape from psutil import Process from copy import copy @@ -44,18 +46,18 @@ from . import KCC_ui from . import KCC_ui_editor -class QApplicationMessaging(QtWidgets.QApplication): - messageFromOtherInstance = QtCore.Signal(bytes) +class QApplicationMessaging(QApplication): + messageFromOtherInstance = Signal(bytes) def __init__(self, argv): - QtWidgets.QApplication.__init__(self, argv) + QApplication.__init__(self, argv) self._key = 'KCC' self._timeout = 1000 self._locked = False - socket = QtNetwork.QLocalSocket(self) - socket.connectToServer(self._key, QtCore.QIODeviceBase.OpenModeFlag.WriteOnly) + socket = QLocalSocket(self) + socket.connectToServer(self._key, QIODeviceBase.OpenModeFlag.WriteOnly) if not socket.waitForConnected(self._timeout): - self._server = QtNetwork.QLocalServer(self) + self._server = QLocalServer(self) self._server.newConnection.connect(self.handleMessage) self._server.listen(self._key) else: @@ -67,11 +69,11 @@ class QApplicationMessaging(QtWidgets.QApplication): self._server.close() def event(self, e): - if e.type() == QtCore.QEvent.Type.FileOpen: + if e.type() == QEvent.Type.FileOpen: self.messageFromOtherInstance.emit(bytes(e.file(), 'UTF-8')) return True else: - return QtWidgets.QApplication.event(self, e) + return QApplication.event(self, e) def isRunning(self): return self._locked @@ -82,56 +84,56 @@ class QApplicationMessaging(QtWidgets.QApplication): self.messageFromOtherInstance.emit(socket.readAll().data()) def sendMessage(self, message): - socket = QtNetwork.QLocalSocket(self) - socket.connectToServer(self._key, QtCore.QIODeviceBase.OpenModeFlag.WriteOnly) + socket = QLocalSocket(self) + socket.connectToServer(self._key, QIODeviceBase.OpenModeFlag.WriteOnly) socket.waitForConnected(self._timeout) socket.write(bytes(message, 'UTF-8')) socket.waitForBytesWritten(self._timeout) socket.disconnectFromServer() -class QMainWindowKCC(QtWidgets.QMainWindow): - progressBarTick = QtCore.Signal(str) - modeConvert = QtCore.Signal(int) - addMessage = QtCore.Signal(str, str, bool) - addTrayMessage = QtCore.Signal(str, str) - showDialog = QtCore.Signal(str, str) - hideProgressBar = QtCore.Signal() - forceShutdown = QtCore.Signal() +class QMainWindowKCC(QMainWindow): + progressBarTick = Signal(str) + modeConvert = Signal(int) + addMessage = Signal(str, str, bool) + addTrayMessage = Signal(str, str) + showDialog = Signal(str, str) + hideProgressBar = Signal() + forceShutdown = Signal() class Icons: def __init__(self): - self.deviceKindle = QtGui.QIcon() - self.deviceKindle.addPixmap(QtGui.QPixmap(":/Devices/icons/Kindle.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.deviceKobo = QtGui.QIcon() - self.deviceKobo.addPixmap(QtGui.QPixmap(":/Devices/icons/Kobo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.deviceRmk = QtGui.QIcon() - self.deviceRmk.addPixmap(QtGui.QPixmap(":/Devices/icons/Rmk.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.deviceOther = QtGui.QIcon() - self.deviceOther.addPixmap(QtGui.QPixmap(":/Devices/icons/Other.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.deviceKindle = QIcon() + self.deviceKindle.addPixmap(QPixmap(":/Devices/icons/Kindle.png"), QIcon.Mode.Normal, QIcon.State.Off) + self.deviceKobo = QIcon() + self.deviceKobo.addPixmap(QPixmap(":/Devices/icons/Kobo.png"), QIcon.Mode.Normal, QIcon.State.Off) + self.deviceRmk = QIcon() + self.deviceRmk.addPixmap(QPixmap(":/Devices/icons/Rmk.png"), QIcon.Mode.Normal, QIcon.State.Off) + self.deviceOther = QIcon() + self.deviceOther.addPixmap(QPixmap(":/Devices/icons/Other.png"), QIcon.Mode.Normal, QIcon.State.Off) - self.MOBIFormat = QtGui.QIcon() - self.MOBIFormat.addPixmap(QtGui.QPixmap(":/Formats/icons/MOBI.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.CBZFormat = QtGui.QIcon() - self.CBZFormat.addPixmap(QtGui.QPixmap(":/Formats/icons/CBZ.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.EPUBFormat = QtGui.QIcon() - self.EPUBFormat.addPixmap(QtGui.QPixmap(":/Formats/icons/EPUB.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.MOBIFormat = QIcon() + self.MOBIFormat.addPixmap(QPixmap(":/Formats/icons/MOBI.png"), QIcon.Mode.Normal, QIcon.State.Off) + self.CBZFormat = QIcon() + self.CBZFormat.addPixmap(QPixmap(":/Formats/icons/CBZ.png"), QIcon.Mode.Normal, QIcon.State.Off) + self.EPUBFormat = QIcon() + self.EPUBFormat.addPixmap(QPixmap(":/Formats/icons/EPUB.png"), QIcon.Mode.Normal, QIcon.State.Off) - self.info = QtGui.QIcon() - self.info.addPixmap(QtGui.QPixmap(":/Status/icons/info.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.warning = QtGui.QIcon() - self.warning.addPixmap(QtGui.QPixmap(":/Status/icons/warning.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.error = QtGui.QIcon() - self.error.addPixmap(QtGui.QPixmap(":/Status/icons/error.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.info = QIcon() + self.info.addPixmap(QPixmap(":/Status/icons/info.png"), QIcon.Mode.Normal, QIcon.State.Off) + self.warning = QIcon() + self.warning.addPixmap(QPixmap(":/Status/icons/warning.png"), QIcon.Mode.Normal, QIcon.State.Off) + self.error = QIcon() + self.error.addPixmap(QPixmap(":/Status/icons/error.png"), QIcon.Mode.Normal, QIcon.State.Off) - self.programIcon = QtGui.QIcon() - self.programIcon.addPixmap(QtGui.QPixmap(":/Icon/icons/comic2ebook.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.programIcon = QIcon() + self.programIcon.addPixmap(QPixmap(":/Icon/icons/comic2ebook.png"), QIcon.Mode.Normal, QIcon.State.Off) -class VersionThread(QtCore.QThread): +class VersionThread(QThread): def __init__(self): - QtCore.QThread.__init__(self) + QThread.__init__(self) self.newVersion = '' self.md5 = '' self.barProgress = 0 @@ -160,9 +162,9 @@ class VersionThread(QtCore.QThread): self.answer = dialoganswer -class ProgressThread(QtCore.QThread): +class ProgressThread(QThread): def __init__(self): - QtCore.QThread.__init__(self) + QThread.__init__(self) self.running = False self.content = None self.progress = 0 @@ -184,9 +186,9 @@ class ProgressThread(QtCore.QThread): self.running = False -class WorkerThread(QtCore.QThread): +class WorkerThread(QThread): def __init__(self): - QtCore.QThread.__init__(self) + QThread.__init__(self) self.conversionAlive = False self.errors = False self.kindlegenErrorCode = [0] @@ -435,7 +437,7 @@ class WorkerThread(QtCore.QThread): MW.modeConvert.emit(1) -class SystemTrayIcon(QtWidgets.QSystemTrayIcon): +class SystemTrayIcon(QSystemTrayIcon): def __init__(self): super().__init__() if self.isSystemTrayAvailable(): @@ -448,7 +450,7 @@ class SystemTrayIcon(QtWidgets.QSystemTrayIcon): MW.activateWindow() def addTrayMessage(self, message, icon): - icon = getattr(QtWidgets.QSystemTrayIcon.MessageIcon, icon) + icon = getattr(QSystemTrayIcon.MessageIcon, icon) if self.supportsMessages() and not MW.isActiveWindow(): self.showMessage('Kindle Comic Converter', message, icon) @@ -458,7 +460,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): if self.needClean: self.needClean = False GUI.jobList.clear() - dname = QtWidgets.QFileDialog.getExistingDirectory(MW, 'Select directory', self.lastPath) + dname = QFileDialog.getExistingDirectory(MW, 'Select directory', self.lastPath) if dname != '': if sys.platform.startswith('win'): dname = dname.replace('/', '\\') @@ -471,10 +473,10 @@ class KCCGUI(KCC_ui.Ui_mainWindow): self.needClean = False GUI.jobList.clear() if self.tar or self.sevenzip: - fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, + fnames = QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, 'Comic (*.cbz *.cbr *.cb7 *.zip *.rar *.7z *.pdf);;All (*.*)') else: - fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, + fnames = QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, 'Comic (*.pdf);;All (*.*)') for fname in fnames[0]: if fname != '': @@ -486,8 +488,8 @@ class KCCGUI(KCC_ui.Ui_mainWindow): def selectFileMetaEditor(self): sname = '' - if QtWidgets.QApplication.keyboardModifiers() == QtCore.Qt.ShiftModifier: - dname = QtWidgets.QFileDialog.getExistingDirectory(MW, 'Select directory', self.lastPath) + if QApplication.keyboardModifiers() == Qt.ShiftModifier: + dname = QFileDialog.getExistingDirectory(MW, 'Select directory', self.lastPath) if dname != '': sname = os.path.join(dname, 'ComicInfo.xml') if sys.platform.startswith('win'): @@ -495,7 +497,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): self.lastPath = os.path.abspath(sname) else: if self.sevenzip: - fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, + fname = QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, 'Comic (*.cbz *.cbr *.cb7)') else: fname = [''] @@ -524,7 +526,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): def openWiki(self): # noinspection PyCallByClass - QtGui.QDesktopServices.openUrl(QtCore.QUrl('https://github.com/ciromattia/kcc/wiki')) + QDesktopServices.openUrl(QUrl('https://github.com/ciromattia/kcc/wiki')) def modeChange(self, mode): if mode == 1: @@ -559,16 +561,16 @@ class KCCGUI(KCC_ui.Ui_mainWindow): if enable == 1: self.conversionAlive = False self.worker.sync() - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(":/Other/icons/convert.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon = QIcon() + icon.addPixmap(QPixmap(":/Other/icons/convert.png"), QIcon.Mode.Normal, QIcon.State.Off) GUI.convertButton.setIcon(icon) GUI.convertButton.setText('Convert') GUI.centralWidget.setAcceptDrops(True) elif enable == 0: self.conversionAlive = True self.worker.sync() - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(":/Other/icons/clear.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon = QIcon() + icon.addPixmap(QPixmap(":/Other/icons/clear.png"), QIcon.Mode.Normal, QIcon.State.Off) GUI.convertButton.setIcon(icon) GUI.convertButton.setText('Abort') GUI.centralWidget.setAcceptDrops(False) @@ -684,15 +686,15 @@ class KCCGUI(KCC_ui.Ui_mainWindow): def addMessage(self, message, icon, replace=False): if icon != '': icon = getattr(self.icons, icon) - item = QtWidgets.QListWidgetItem(icon, ' ' + self.stripTags(message)) + item = QListWidgetItem(icon, ' ' + self.stripTags(message)) else: - item = QtWidgets.QListWidgetItem(' ' + self.stripTags(message)) + item = QListWidgetItem(' ' + self.stripTags(message)) if replace: GUI.jobList.takeItem(GUI.jobList.count() - 1) # Due to lack of HTML support in QListWidgetItem we overlay text field with QLabel # We still fill original text field with transparent content to trigger creation of horizontal scrollbar - item.setForeground(QtGui.QColor('transparent')) - label = QtWidgets.QLabel(message) + item.setForeground(QColor('transparent')) + label = QLabel(message) label.setOpenExternalLinks(True) GUI.jobList.addItem(item) GUI.jobList.setItemWidget(item, label) @@ -700,11 +702,11 @@ class KCCGUI(KCC_ui.Ui_mainWindow): def showDialog(self, message, kind): if kind == 'error': - QtWidgets.QMessageBox.critical(MW, 'KCC - Error', message, QtWidgets.QMessageBox.StandardButton.Ok) + QMessageBox.critical(MW, 'KCC - Error', message, QMessageBox.StandardButton.Ok) elif kind == 'question': - GUI.versionCheck.setAnswer(QtWidgets.QMessageBox.question(MW, 'KCC - Question', message, - QtWidgets.QMessageBox.Yes, - QtWidgets.QMessageBox.No)) + GUI.versionCheck.setAnswer(QMessageBox.question(MW, 'KCC - Question', message, + QMessageBox.Yes, + QMessageBox.No)) def updateProgressbar(self, command): if command == 'tick': @@ -728,8 +730,8 @@ class KCCGUI(KCC_ui.Ui_mainWindow): self.conversionAlive = False self.worker.sync() else: - if QtWidgets.QApplication.keyboardModifiers() == QtCore.Qt.KeyboardModifier.ShiftModifier: - dname = QtWidgets.QFileDialog.getExistingDirectory(MW, 'Select output directory', self.lastPath) + if QApplication.keyboardModifiers() == Qt.KeyboardModifier.ShiftModifier: + dname = QFileDialog.getExistingDirectory(MW, 'Select output directory', self.lastPath) if dname != '': if sys.platform.startswith('win'): dname = dname.replace('/', '\\') @@ -874,7 +876,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): self.setupUi(MW) self.editor = KCCGUI_MetaEditor() self.icons = Icons() - self.settings = QtCore.QSettings('ciromattia', 'kcc') + self.settings = QSettings('ciromattia', 'kcc') self.settingsVersion = self.settings.value('settingsVersion', '', type=str) self.lastPath = self.settings.value('lastPath', '', type=str) self.lastDevice = self.settings.value('lastDevice', 0, type=int) @@ -907,7 +909,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): elif sys.platform.startswith('darwin'): for element in ['editorButton', 'wikiButton', 'directoryButton', 'clearButton', 'fileButton', 'deviceBox', 'convertButton', 'formatBox']: - getattr(GUI, element).setMinimumSize(QtCore.QSize(0, 0)) + getattr(GUI, element).setMinimumSize(QSize(0, 0)) GUI.gridLayout.setContentsMargins(-1, -1, -1, -1) for element in ['gridLayout_2', 'gridLayout_3', 'gridLayout_4', 'horizontalLayout', 'horizontalLayout_2']: getattr(GUI, element).setContentsMargins(-1, 0, -1, 0) @@ -1050,11 +1052,11 @@ class KCCGUI(KCC_ui.Ui_mainWindow): "Kobo Mini/Touch", ] - statusBarLabel = QtWidgets.QLabel('HOMEPAGE - HOMEPAGE - DO' 'NATE - FORUM') - statusBarLabel.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + statusBarLabel.setAlignment(Qt.AlignmentFlag.AlignCenter) statusBarLabel.setOpenExternalLinks(True) GUI.statusBar.addPermanentWidget(statusBarLabel, 1) @@ -1218,15 +1220,15 @@ class KCCGUI_MetaEditor(KCC_ui_editor.Ui_editorDialog): return escape(s.strip()) def __init__(self): - self.ui = QtWidgets.QDialog() + self.ui = QDialog() self.parser = None self.setupUi(self.ui) - self.ui.setWindowFlags(self.ui.windowFlags() & ~QtCore.Qt.WindowType.WindowContextHelpButtonHint) + self.ui.setWindowFlags(self.ui.windowFlags() & ~Qt.WindowType.WindowContextHelpButtonHint) self.okButton.clicked.connect(self.saveData) self.cancelButton.clicked.connect(self.ui.close) if sys.platform.startswith('linux'): self.ui.resize(450, 260) - self.ui.setMinimumSize(QtCore.QSize(450, 260)) + self.ui.setMinimumSize(QSize(450, 260)) elif sys.platform.startswith('darwin'): self.ui.resize(450, 310) - self.ui.setMinimumSize(QtCore.QSize(450, 310)) + self.ui.setMinimumSize(QSize(450, 310))