class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        # load util
        self.util = Util()
        self.org_file = None
        self.pred = None
        # set ui
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.retranslateUi(self)
        # set actions
        self.ui.actionOpen.triggered.connect(self.open)
        self.ui.runButton.clicked.connect(self.run)
        self.ui.actionSave.triggered.connect(self.save)

    @Slot()
    def open(self):
        self.org_file = QFileDialog.getOpenFileName(self, "Open File Dialog",
                                                    "C:")[0]
        # open image file then show
        pixmap = QPixmap(self.org_file)
        self.ui.label_2.setPixmap(pixmap)

    @Slot()
    def run(self):
        if self.org_file is None:
            return
        self.pred = self.util.predict(self.org_file)
        if self.pred.flags['C_CONTIGUOUS'] == False:
            self.pred = np.ascontiguousarray(self.pred)
        rows, cols = self.pred.shape
        pred_image = QImage(self.pred, cols, rows, cols,
                            QImage.Format_Grayscale8)
        pixmap = QPixmap.fromImage(pred_image)
        self.ui.label.setPixmap(pixmap)

    @Slot()
    def save(self):
        if self.pred is None:
            return
        save_name = QFileDialog.getSaveFileName(self, 'Save File Dialog',
                                                'C:')[0]
        save_img = Image.fromarray(self.pred)
        try:
            save_img.save(save_name)
        except ValueError:
            save_img.save(save_name + '.jpg')
Exemple #2
0
class MainWindow(QMainWindow):
    switch_window = Signal()
    signal_exit = Signal()
    signal_close = Signal()
    signal_new = Signal()
    signal_open = Signal()

    MaxRecentFiles = 10

    @dispatch(Audiobook)
    def __init__(self, book):
        super(MainWindow, self).__init__()

        self.book = book

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self._translate = QCoreApplication.translate
        # MenuBar CSS
        self.ui.menubar.setStyleSheet(
            'QMenuBar::item { color: #FFFFFF } QMenuBar::item::selected { background: #383838; color: #FFFFFF } '
            'QMenu::item { color: #FFFFFF } QMenu::item::selected { background: #383838; color: #FFFFFF }'
        )
        # MainWindow Title
        self.setWindowTitle(self._translate("MainWindow", "Audiobook Editor"))
        # Set Window Icon
        # self.setWindowIcon(QIcon(':/pic/icon/audiobook-editor-logo.ico'))
        # Hide Minimize & Maximize buttons
        # self.setWindowFlags(self.windowFlags() & ~Qt.WindowMaximizeButtonHint)  # WindowMinMaxButtonsHint)

        # Magic to make title bar disappear
        self.ui.dockWidget_Left.setTitleBarWidget(QWidget(None))
        self.ui.dockWidget_CoverPreviewWidget.setTitleBarWidget(QWidget(None))
        self.ui.dockWidget_SupplementalList.setTitleBarWidget(QWidget(None))

        layout = QVBoxLayout(self.ui.tab_Metadata)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setAlignment(Qt.AlignTop | Qt.AlignLeft)
        self.metadataWidget = MetadataWidget(self, self.book.getManifestDict())
        layout.addWidget(self.metadataWidget)

        layout = QVBoxLayout(self.ui.dockWidgetContents)
        layout.setContentsMargins(0, 0, 0, 0)
        self.coverPreviewWidget = CoverPreviewWidget(self.book.getCoverDict(),
                                                     self.book.getBookDir(),
                                                     self)
        layout.addWidget(self.coverPreviewWidget, 1)

        w = QWidget()
        layout = QHBoxLayout(w)
        layout.setContentsMargins(0, 0, 0, 0)
        self.readingOrderWidget = ReadingOrderWidget(
            self.book.getReadingOrderList(), self.book.getBookDir(), self)
        self.readingOrderWidget.signal_Duration_Changed.connect(
            self.metadataWidget.onDurationChanged)
        layout.addWidget(self.readingOrderWidget)
        self.setCentralWidget(w)
        self.readingOrderWidget.getDuration()

        layout = QVBoxLayout(self.ui.tab_TOC)
        layout.setContentsMargins(0, 0, 0, 0)
        self.tocWidget = TOCListWidget(self, self.book.getTOCList())
        layout.addWidget(self.tocWidget)

        layout = QVBoxLayout(self.ui.dockWidgetContents_2)
        layout.setContentsMargins(0, 0, 0, 0)
        self.supplementalListWidget = SupplementalListWidgetWithWidgets(
            self.book.getSupplementalList(), self)
        layout.addWidget(self.supplementalListWidget, 1)

        self.supplementalListWidget.signal_Add_Resource_to_TOC.connect(
            self.tocWidget.add_Resource_to_TOC_triggered)
        self.readingOrderWidget.signal_Add_Resource_to_TOC.connect(
            self.tocWidget.add_Resource_to_TOC_triggered)

        self.ui.action_New.triggered.connect(self._new)
        self.ui.action_Open.triggered.connect(self._open)
        self.ui.action_Exit.triggered.connect(self._exit)
        self.ui.action_Save.triggered.connect(self._save)
        self.ui.action_Close.triggered.connect(self._close)
        self.ui.action_Validate.triggered.connect(self._validate)
        self.ui.action_Pack.triggered.connect(self._pack)

        logging.debug(self.supplementalListWidget.ui.listWidget.objectName())
        logging.debug(self.supplementalListWidget.ui.listWidget.geometry())

        logging.debug(
            self.supplementalListWidget.ui.listWidget.parent().objectName())
        logging.debug(
            self.supplementalListWidget.ui.listWidget.parent().geometry())

        logging.debug(self.supplementalListWidget.objectName())
        logging.debug(self.supplementalListWidget.geometry())
        logging.debug(self.supplementalListWidget.parent().objectName())
        logging.debug(self.supplementalListWidget.parent().geometry())
        logging.debug(
            self.supplementalListWidget.parent().parent().objectName())
        logging.debug(self.supplementalListWidget.parent().parent().geometry())

        self.settings = QSettings()
        self.recentFilesOrDirectoriesInSettings = ''

        self.ui.action_EN.triggered.connect(
            lambda: self.changeUILanguage('EN', self.ui.action_EN))
        self.ui.action_TC.triggered.connect(
            lambda: self.changeUILanguage('TC', self.ui.action_TC))

        app = QApplication.instance()
        for action in self.ui.menu_Language.actions():
            if action.objectName() == 'action_' + app.ui_Language:
                action.setChecked(True)
            else:
                action.setChecked(False)

        self.updateSettings()

    @dispatch(dict)
    def __init__(self, dict_New):
        super(MainWindow, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self._translate = QCoreApplication.translate
        # MenuBar CSS
        self.ui.menubar.setStyleSheet(
            'QMenuBar::item { color: #FFFFFF } QMenuBar::item::selected { background: #383838; color: #FFFFFF } '
            'QMenu::item { color: #FFFFFF } QMenu::item::selected { background: #383838; color: #FFFFFF }'
        )
        # MainWindow Title
        self.setWindowTitle('Audiobook Editor')
        # Set Window Icon
        # self.setWindowIcon(QIcon(':/pic/icon/audiobook-editor-logo.ico'))
        # Hide Minimize & Maximize buttons
        # self.setWindowFlags(self.windowFlags() & ~Qt.WindowMaximizeButtonHint)  # WindowMinMaxButtonsHint)

        # Magic to make title bar disappear
        self.ui.dockWidget_Left.setTitleBarWidget(QWidget(None))
        self.ui.dockWidget_CoverPreviewWidget.setTitleBarWidget(QWidget(None))
        self.ui.dockWidget_SupplementalList.setTitleBarWidget(QWidget(None))

        # self.ui.action_Qt.triggered.connect(self.on_action_Qt_triggered)
        self.book = Audiobook.getInstance()

        layout = QVBoxLayout(self.ui.tab_Metadata)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setAlignment(Qt.AlignTop | Qt.AlignLeft)
        self.metadataWidget = MetadataWidget(self, dict_New)
        layout.addWidget(self.metadataWidget)

        # Magic to make title bar disappear
        self.ui.dockWidget_Left.setTitleBarWidget(QWidget(None))
        self.ui.dockWidget_CoverPreviewWidget.setTitleBarWidget(QWidget(None))
        self.ui.dockWidget_SupplementalList.setTitleBarWidget(QWidget(None))

        layout = QVBoxLayout(self.ui.dockWidgetContents)
        layout.setContentsMargins(0, 0, 0, 0)
        self.coverPreviewWidget = CoverPreviewWidget(self)
        layout.addWidget(self.coverPreviewWidget)

        w = QWidget()
        layout = QHBoxLayout(w)
        layout.setContentsMargins(0, 0, 0, 0)
        self.readingOrderWidget = ReadingOrderWidget(self)
        layout.addWidget(self.readingOrderWidget)
        # layout.addStretch(0)
        self.setCentralWidget(w)

        layout = QVBoxLayout(self.ui.tab_TOC)
        self.tocWidget = TOCListWidget(self)
        layout.addWidget(self.tocWidget)
        self.readingOrderWidget.signal_Add_Resource_to_TOC.connect(
            self.tocWidget.add_Resource_to_TOC_triggered)
        self.readingOrderWidget.signal_Duration_Changed.connect(
            self.metadataWidget.onDurationChanged)

        layout = QVBoxLayout(self.ui.dockWidgetContents_2)
        layout.setContentsMargins(0, 0, 0, 0)
        self.supplementalListWidget = SupplementalListWidgetWithWidgets(self)
        layout.addWidget(self.supplementalListWidget)
        self.supplementalListWidget.signal_Add_Resource_to_TOC.connect(
            self.tocWidget.add_Resource_to_TOC_triggered)

        # self.supplementalListWidget.addItems(1)
        self.ui.action_New.triggered.connect(self._new)
        self.ui.action_Open.triggered.connect(self._open)
        self.ui.action_Exit.triggered.connect(self._exit)
        self.ui.action_Save.triggered.connect(self._save)
        self.ui.action_Close.triggered.connect(self._close)
        self.ui.action_Validate.triggered.connect(self._validate)
        self.ui.action_Pack.triggered.connect(self._pack)

        self.settings = QSettings()
        self.recentFilesOrDirectoriesInSettings = ''

        self.ui.action_EN.triggered.connect(
            lambda: self.changeUILanguage('EN', self.ui.action_EN))
        self.ui.action_TC.triggered.connect(
            lambda: self.changeUILanguage('TC', self.ui.action_TC))

        app = QApplication.instance()
        for action in self.ui.menu_Language.actions():
            if action.objectName() == 'action_' + app.ui_Language:
                action.setChecked(True)
            else:
                action.setChecked(False)

    @Slot()
    def on_action_Qt_triggered(self):
        self.mask = MaskWidget(self)
        self.mask.show()

        QApplication.aboutQt()
        self.mask.close()

    @Slot()
    def on_action_Thanks_triggered(self):
        self._openAlertWindow(
            "backports.tempfile, beautifulsoup4, html5lib, jsonschema, multipledispatch, tinytag,"
            " PySide2, Python, Qt5, regex, requests, urllib3",
            self._translate("MainWindow", "Special thanks"))

    @Slot()
    def on_action_Version_triggered(self):
        app = QApplication.instance()
        self._openAlertWindow(
            "<center>" + self._translate("MainWindow", "Audiobook Editor") +
            "</center>" + "<center>" + app.applicationVersion() + "</center>" +
            "<center>" +
            self._translate("MainWindow", "Hyweb Technology CO., LTD.") +
            "</center>", self._translate("MainWindow", "Version information"))

    @Slot()
    def on_action_Issues_triggered(self):
        QDesktopServices.openUrl(
            QUrl('https://github.com/hywebr00/audiobook-editor/issues'))

    @Slot()
    def on_action_License_triggered(self):
        QDesktopServices.openUrl(QUrl.fromLocalFile('about_licenses.html'))

    def _openAlertWindow(self, str_Msg, str_Title):
        self.mask = MaskWidget(self)
        self.mask.show()

        self.alert = Alert(str_Msg, str_Title)
        self.alert.move(
            self.geometry().x() + self.geometry().width() / 2 -
            self.alert.geometry().width() / 2,
            self.geometry().y() + self.geometry().height() / 2 -
            self.alert.geometry().height() / 2)

        result = self.alert.exec_()
        self.mask.close()
        return result

    def _exit(self):
        self.signal_exit.emit()

    def _pack(self):

        book = Audiobook.getInstance()
        try:
            self._save(flag_Pack=True)
            book.on_action_Pack_triggered(self)
        except Exception as ex:
            logging.debug("{0}".format(ex))

    def _save(self, flag_Pack=False):
        logging.debug("_save()")

        # required fields should be checked first
        manifest = self.metadataWidget.save()

        if manifest == {}:
            if not flag_Pack:
                return
            else:
                raise Exception('Some necessary fields are empty!')

        toc = self.tocWidget.save()

        if toc == {}:
            if not flag_Pack:
                return
            else:
                raise Exception('Some necessary fields are empty!')

        cover = self.coverPreviewWidget.save()

        readingOrder = self.readingOrderWidget.save()

        supplementalList = self.supplementalListWidget.save()

        logging.debug(manifest)
        self.book.setManifestDict(manifest)

        logging.debug(readingOrder)
        self.book.setReadingOrderList(readingOrder)

        logging.debug(toc)
        self.book.setTOCList(toc)

        logging.debug(cover)
        self.book.setCoverDict(cover)

        logging.debug(supplementalList)
        self.book.setSupplementalList(supplementalList)
        self.updateSettings()

        self.book.on_action_Save_Audiobook_triggered()

    def refreshToc(self):
        tocList = []
        return tocList

    def refreshManifest(self):
        return {}

    def _new(self):
        """
        toc_refreshed = refreshToc()
        manifest_refreshed = refreshManifest()
        """
        # self.book.on_action_Save_Audiobook_triggered()
        self.updateSettings()
        self.signal_new.emit()

    def updateSettings(self):
        self.settings = QSettings()
        self.recentFilesOrDirectoriesInSettings = self.settings.value(
            'RecentlyOpenedFilesOrDirectories', '', type=str)
        logging.debug(self.recentFilesOrDirectoriesInSettings)
        self.recentFilesOrDirectoriesInSettings = self.recentFilesOrDirectoriesInSettings[:
                                                                                          -1]
        self.recentFilesOrDirectoriesInSettings = self.recentFilesOrDirectoriesInSettings[
            1:]
        if len(self.recentFilesOrDirectoriesInSettings) > 0:
            self.recentFilesOrDirectoriesInSettings = [
                json.loads(obj)
                for obj in self.recentFilesOrDirectoriesInSettings.split(';')
            ]
        else:
            self.recentFilesOrDirectoriesInSettings = []
        bookPath = self.book.getBookDir()
        coverFile = self.book.getCoverDict()
        manifest = self.book.getManifestDict()

        logging.debug(bookPath)
        logging.debug(coverFile)
        logging.debug(manifest)

        dict_One = {}

        if self.book.is_LPF:

            dict_One = next(
                (one for one in self.recentFilesOrDirectoriesInSettings
                 if one["bookPath"] == self.book.getLPFFilename()), None)
            logging.debug(dict_One)
            if dict_One is None:
                self.recentFilesOrDirectoriesInSettings.insert(
                    0, {
                        "bookPath": self.book.getLPFFilename(),
                        "coverFile": coverFile.get("url", ""),
                        "bookTitle": manifest.get("name", ""),
                        "lastOpenedDate": QDate.currentDate().toString(
                            Qt.ISODate)
                    })
            else:
                self.recentFilesOrDirectoriesInSettings.remove(dict_One)
                dict_One["lastOpenedDate"] = QDate.currentDate().toString(
                    Qt.ISODate)
                dict_One["coverFile"] = coverFile.get('url', "")
                dict_One["bookTitle"] = manifest.get("name", "")
                self.recentFilesOrDirectoriesInSettings.insert(0, dict_One)

        else:
            dict_One = next((one
                             for one in self.recentFilesOrDirectoriesInSettings
                             if one["bookPath"] == bookPath), None)
            logging.debug(dict_One)
            if dict_One is None:
                dict_Str = json.dumps(
                    {
                        "bookPath": bookPath,
                        "coverFile": coverFile.get("url", ""),
                        "bookTitle": manifest.get("name", ""),
                        "lastOpenedDate": QDate.currentDate().toString(
                            Qt.ISODate)
                    },
                    ensure_ascii=False)
                self.recentFilesOrDirectoriesInSettings.insert(
                    0, {
                        "bookPath": bookPath,
                        "coverFile": coverFile.get("url", ""),
                        "bookTitle": manifest.get("name", ""),
                        "lastOpenedDate": QDate.currentDate().toString(
                            Qt.ISODate)
                    })
            else:
                self.recentFilesOrDirectoriesInSettings.remove(dict_One)
                dict_One["lastOpenedDate"] = QDate.currentDate().toString(
                    Qt.ISODate)
                dict_One["coverFile"] = coverFile.get("url", "")
                dict_One["bookTitle"] = manifest.get("name", "")
                self.recentFilesOrDirectoriesInSettings.insert(0, dict_One)

        logging.debug(self.recentFilesOrDirectoriesInSettings)
        self.settings.setValue(
            'RecentlyOpenedFilesOrDirectories', '[' + ';'.join([
                json.dumps(o) for o in self.recentFilesOrDirectoriesInSettings
            ]) + ']')

    def _open(self):
        self.updateSettings()
        self.signal_open.emit()

    def _close(self):
        self.book.on_action_Save_Audiobook_triggered()
        self.updateSettings()
        self.signal_close.emit()

    def _validate(self):
        logging.debug("_validate")
        try:
            self._save(True)
        except Exception as ex:
            logging.debug('omit validation process')
            return

        manifestForTest = self.book.getManifestDict()
        logging.debug(manifestForTest)

        self.mask = MaskWidget(self)
        self.mask.show()

        with open(
                os.path.join(os.path.dirname(__file__),
                             'audiobooks.schema.json')) as f:
            schemaData = f.read()
        schema = json.loads(schemaData)

        self.validator = Validator(
            self._translate('MainWindow', 'Please wait...\n'),
            self._translate('MainWindow', 'Validation begins:'), schema,
            manifestForTest)

        self.validator.move(
            self.geometry().x() + self.geometry().width() / 2 -
            self.validator.geometry().width() / 2,
            self.geometry().y() + self.geometry().height() / 2 -
            self.validator.geometry().height() / 2)

        result = self.validator.exec_()

        self.mask.close()

    def changeUILanguage(self, lang, action):
        logging.debug('changeUILanguage')
        translator = QTranslator()
        app = QApplication.instance()
        app.removeTranslator(app.ui_Translator)

        for act in self.ui.menu_Language.actions():
            if act == action:
                action.setChecked(True)
            else:
                act.setChecked(False)

        # EN, TC
        translator.load(
            os.path.dirname(__file__) + '/Language/appLang_' + lang + '.qm')
        app.ui_Language = lang
        app.installTranslator(translator)
        app.ui_Translator = translator

        self.ui.retranslateUi(self)

        settings = QSettings(app.organizationName(), app.applicationName())

        settings.setValue('Language', lang)

    def mousePressEvent(self, event):
        logging.debug('mousePressEvent')
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        if hasattr(self, "oldPos"):
            logging.debug('mouseMoveEvent with oldPos')
            delta = QPoint(event.globalPos() - self.oldPos)
            self.move(self.x() + delta.x(), self.y() + delta.y())
            self.oldPos = event.globalPos()
            screenCount = QApplication.instance().desktop().screenCount()
            for screenNo in range(screenCount):
                if QApplication.instance().screens()[screenNo] == self.screen(
                ):
                    logging.debug(
                        'mouseMoveEvent on screen {}'.format(screenNo))
                    break
            # logging.debug('mouseMoveEvent on screen {}'.format(self.screen()))

    def resizeEvent(self, event):
        width, height = event.size().width(), event.size().height()

        # logging.debug('resizeEvent with {}'.format(event.size()))
        # screenNo = QApplication.instance().screenAt(self.pos())
        screenCount = QApplication.instance().desktop().screenCount()
        for screenNo in range(screenCount):
            if QApplication.instance().screens()[screenNo] == self.screen():
                logging.debug('resizeEvent {} on screen {} with {}'.format(
                    event.size(), screenNo,
                    self.screen().size()))
                sWidth, sHeight = self.screen().size().width(), self.screen(
                ).size().height()
                break
        minWidth, minHeight = self.minimumWidth(), self.minimumHeight()
        if minWidth <= sWidth and minHeight <= sHeight:
            event.accept()
        else:
            event.accept()
            self.showMaximized()
 def retranslateUi(self, MainWindow):
     Ui_MainWindow.retranslateUi(self, MainWindow)
     MainWindow.setWindowTitle(self.tr("MainWindow").arg("PySPA"))
 def retranslateUi(self, MainWindow):
     Ui_MainWindow.retranslateUi(self, MainWindow)
     MainWindow.setWindowTitle(self.tr("MainWindow").arg("PySPA"))
Exemple #5
0
class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.retranslateUi(self)
Exemple #6
0
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent = None, flags = 0):
        super(MainWindow, self).__init__(parent, QtCore.Qt.WindowFlags(flags))
        self.languages = QtGui.QMenu()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.fillLanguages()
        self.retranslate()

    def changeEvent(self, event):
        if event.type() == QtCore.QEvent.LanguageChange:
            # all designed forms have a retranslateUi() method
            self.ui.retranslateUi(self)
            # retranslate other widgets which weren't added in the designer
            self.retranslate()
        super(MainWindow, self).changeEvent(event)

    @QtCore.pyqtSlot(QtGui.QAction)
    def setLanguage(self, action):
        Application.setLanguage(action.data())

    def fillLanguages(self):
        self.languages = self.menuBar().addMenu("")
        # make a group of language actions
        actions = QtGui.QActionGroup(self)
        actions.triggered.connect(self.setLanguage)
        system = QtCore.QLocale.system()
        default = None
        for lang in Application.availableLanguages():
            # figure out nice names for locales
            locale = QtCore.QLocale(lang)
            language = QtCore.QLocale.languageToString(locale.language())
            country = QtCore.QLocale.countryToString(locale.country())
            name = "%s (%s)" % (language, country)
            # create an action
            action = self.languages.addAction(name)
            action.setData(lang)
            action.setCheckable(True)
            if lang == system.name():
                # language match the current system
                action.setChecked(True)
                Application.setLanguage(lang)
                default = lang
            actions.addAction(action)
        if default is None:
            # no exact match found, try language only
            for lang in Application.availableLanguages():
                locale = QtCore.QLocale(lang)
                if locale.language() == system.language():
                    # at least a language match
                    for action in actions.actions():
                        if lang == action.data():
                            # use first entry of this language
                            action.setChecked(True)
                            Application.setLanguage(lang)
                            default = lang
                            break
                    if default is not None:
                        break
        return default

    def retranslate(self):
        self.languages.setTitle(self.tr("Language"))