Пример #1
0
 def init_logger(self) -> None:
     try:
         log_path = self.get_app_config_path()
     except AttributeError:
         if sys.platform == 'win32':
             log_path = os.path.join(QDir.homePath(), 'AppData', 'Local',
                                     qApp.applicationName().lower())
         elif sys.platform == 'darwin':
             log_path = os.path.join(QDir.homePath(), 'Library',
                                     'Preferences',
                                     qApp.applicationName().lower())
         else:
             log_path = os.path.join(QDir.homePath(), '.config',
                                     qApp.applicationName().lower())
     os.makedirs(log_path, exist_ok=True)
     self.console = ConsoleWidget(self)
     # self.consoleLogger = ConsoleHandler(self.console)
     handlers = [
         logging.handlers.RotatingFileHandler(os.path.join(
             log_path, '%s.log' % qApp.applicationName().lower()),
                                              maxBytes=1000000,
                                              backupCount=1),
         self.consoleLogger
     ]
     if self.parser.isSet(self.debug_option) or self.verboseLogs:
         # noinspection PyTypeChecker
         handlers.append(logging.StreamHandler())
Пример #2
0
    def aboutInfo(self) -> None:
        about_html = '''<style>
    a { color:#441d4e; text-decoration:none; font-weight:bold; }
    a:hover { text-decoration:underline; }
</style>
<p style="font-size:26pt; font-weight:bold;">%s</p>
<p>
    <span style="font-size:13pt;"><b>Version: %s</b></span>
    <span style="font-size:10pt;position:relative;left:5px;">( %s )</span>
</p>
<p style="font-size:13px;">
    Copyright &copy; 2016 <a href="mailto:[email protected]">Pete Alexandrou</a>
    <br/>
    Website: <a href="%s">%s</a>
</p>
<p style="font-size:13px;">
    Thanks to the folks behind the <b>Qt</b>, <b>PyQt</b> and <b>FFmpeg</b>
    projects for all their hard and much appreciated work.
</p>
<p style="font-size:11px;">
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
</p>
<p style="font-size:11px;">
    This software uses libraries from the <a href="https://www.ffmpeg.org">FFmpeg</a> project under the
    <a href="https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html">LGPLv2.1</a>
</p>''' % (qApp.applicationName(), qApp.applicationVersion(),
           platform.architecture()[0], qApp.organizationDomain(),
           qApp.organizationDomain())
        QMessageBox.about(self.parent, 'About %s' % qApp.applicationName(),
                          about_html)
Пример #3
0
 def about_app(self) -> None:
     about_html = '''<style>
     a { color:#441d4e; text-decoration:none; font-weight:bold; }
     a:hover { text-decoration:underline; }
 </style>
 <p style="font-size:24pt; font-weight:bold; color:#6A687D;">%s</p>
 <p>
     <span style="font-size:13pt;"><b>Version: %s</b></span>
     <span style="font-size:10pt;position:relative;left:5px;">( %s )</span>
 </p>
 <p style="font-size:13px;">
     Copyright &copy; %s <a href="mailto:[email protected]">Pete Alexandrou</a>
     <br/>
     Web: <a href="%s">%s</a>
 </p>
 <p style="font-size:11px;">
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License
     as published by the Free Software Foundation; either version 2
     of the License, or (at your option) any later version.
 </p>''' % (qApp.applicationName(), qApp.applicationVersion(),
            platform.architecture()[0], datetime.now().year,
            qApp.organizationDomain(), qApp.organizationDomain())
     QMessageBox.about(self, 'About %s' % qApp.applicationName(),
                       about_html)
Пример #4
0
 def init_settings(self) -> None:
     try:
         settings_path = self.get_app_config_path()
     except AttributeError:
         if sys.platform == 'win32':
             settings_path = os.path.join(QDir.homePath(), 'AppData',
                                          'Local',
                                          qApp.applicationName().lower())
         elif sys.platform == 'darwin':
             settings_path = os.path.join(QDir.homePath(), 'Library',
                                          'Preferences',
                                          qApp.applicationName().lower())
         else:
             settings_path = os.path.join(QDir.homePath(), '.config',
                                          qApp.applicationName().lower())
     os.makedirs(settings_path, exist_ok=True)
     settings_file = '{}.ini'.format(qApp.applicationName().lower())
     self.settings = QSettings(os.path.join(settings_path, settings_file),
                               QSettings.IniFormat)
     if self.settings.value('geometry') is not None:
         self.restoreGeometry(self.settings.value('geometry'))
     if self.settings.value('windowState') is not None:
         self.restoreState(self.settings.value('windowState'))
     self.theme = self.settings.value('theme', 'light', type=str)
     self.startupvol = self.settings.value('volume', 100, type=int)
     self.verboseLogs = self.settings.value('verboseLogs', 'off',
                                            type=str) in {'on', 'true'}
Пример #5
0
 def init_settings(self) -> None:
     if sys.platform == 'darwin':
         QSettings.setDefaultFormat(QSettings.IniFormat)
         self.settings = QSettings(self)
     else:
         try:
             settings_path = QStandardPaths.writableLocation(
                 QStandardPaths.AppConfigLocation).lower()
         except AttributeError:
             if sys.platform == 'win32':
                 settings_path = os.path.join(
                     QDir.homePath(), 'AppData', 'Local',
                     qApp.applicationName().lower())
             elif sys.platform == 'darwin':
                 settings_path = os.path.join(
                     QDir.homePath(), 'Library', 'Preferences',
                     qApp.applicationName()).lower()
             else:
                 settings_path = os.path.join(
                     QDir.homePath(), '.config',
                     qApp.applicationName()).lower()
         os.makedirs(settings_path, exist_ok=True)
         settings_file = '%s.ini' % qApp.applicationName().lower()
         self.settings = QSettings(
             os.path.join(settings_path, settings_file),
             QSettings.IniFormat)
     if self.settings.value('geometry') is not None:
         self.restoreGeometry(self.settings.value('geometry'))
     if self.settings.value('windowState') is not None:
         self.restoreState(self.settings.value('windowState'))
     self.theme = self.settings.value('theme', 'light', type=str)
     self.startupvol = self.settings.value('volume', 100, type=int)
Пример #6
0
    def init_logger(self) -> None:
        try:
            log_path = QStandardPaths.writableLocation(
                QStandardPaths.AppConfigLocation).lower()
        except AttributeError:
            if sys.platform == 'win32':
                log_path = os.path.join(QDir.homePath(), 'AppData', 'Local',
                                        qApp.applicationName().lower())
            elif sys.platform == 'darwin':
                log_path = os.path.join(QDir.homePath(),
                                        'Library', 'Preferences',
                                        qApp.applicationName()).lower()
            else:
                log_path = os.path.join(QDir.homePath(), '.config',
                                        qApp.applicationName()).lower()

        os.makedirs(log_path, exist_ok=True)
        handlers = [
            logging.handlers.RotatingFileHandler(os.path.join(
                log_path, '%s.log' % qApp.applicationName().lower()),
                                                 maxBytes=1000000,
                                                 backupCount=1)
        ]
        if os.getenv('DEBUG', False):
            handlers.append(logging.StreamHandler())
        logging.basicConfig(
            handlers=handlers,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            datefmt='%Y-%m-%d %H:%M',
            level=logging.INFO)
        logging.captureWarnings(capture=True)
        sys.excepthook = self.log_uncaught_exceptions
Пример #7
0
 def notify_no_update(parent: QWidget) -> None:
     mbox = QMessageBox(parent)
     mbox.setIconPixmap(QIcon(':/images/thumbsup.png').pixmap(64, 64))
     mbox.setWindowTitle('%s UPDATER' % qApp.applicationName())
     mbox.setText('<h3 style="color:#6A4572;">%s %s</h3>' %
                  (qApp.applicationName(), qApp.applicationVersion()))
     mbox.setInformativeText(
         'You are already running the latest version.' +
         '<table width="350"><tr><td></td></tr></table>')
     mbox.setStandardButtons(QMessageBox.Close)
     mbox.setDefaultButton(QMessageBox.Close)
     return mbox.exec_()
Пример #8
0
 def init_styles(self) -> None:
     if sys.platform == 'darwin':
         qss_stylesheet = self.get_path('%s_osx.qss' %
                                        qApp.applicationName().lower())
     else:
         qss_stylesheet = self.get_path('%s.qss' %
                                        qApp.applicationName().lower())
     TVLinker.load_stylesheet(qss_stylesheet)
     QFontDatabase.addApplicationFont(':assets/fonts/opensans.ttf')
     QFontDatabase.addApplicationFont(':assets/fonts/opensans-bold.ttf')
     QFontDatabase.addApplicationFont(':assets/fonts/opensans-semibold.ttf')
     qApp.setFont(QFont('Open Sans',
                        12 if sys.platform == 'darwin' else 10))
Пример #9
0
 def get_app_config_path(self) -> str:
     if self.flatpak:
         confpath = QProcessEnvironment.systemEnvironment().value(
             'XDG_CONFIG_HOME', '')
         if len(confpath):
             return confpath
         else:
             return os.path.join(QDir.homePath(), '.var', 'app',
                                 vidcutter.__desktopid__, 'config')
     return QStandardPaths.writableLocation(
         QStandardPaths.AppConfigLocation).replace(
             qApp.applicationName(),
             qApp.applicationName().lower())
Пример #10
0
 def saveSettings(self):
     for setting in self.modified_settings:
         widget = self.findChild(QObject, setting)
         if setting == 'lineEditApiUrl':
             self.settings.setValue('server/api_base_url', widget.text())
         if setting == 'lineEditApiToken':
             if widget.text().strip() == '':
                 keyring.delete_password(qApp.applicationName(), 'Token')
             else:
                 keyring.set_password(qApp.applicationName(), 'Token',
                                      widget.text())
     self.settings.sync()
     self.modified_settings = []
     self.buttonBox.button(QDialogButtonBox.Apply).setEnabled(False)
Пример #11
0
 def notify_update(parent: QWidget, version: str) -> QMessageBox.ButtonRole:
     mbox = QMessageBox(parent)
     mbox.setIconPixmap(qApp.windowIcon().pixmap(64, 64))
     mbox.setWindowTitle('%s UPDATER' % qApp.applicationName())
     mbox.setText(
         '<table border="0" width="350"><tr><td><h4 align="center">Your Version: %s <br/> Available Version: %s'
         % (qApp.applicationVersion(), version) +
         '</h4></td></tr></table><br/>')
     mbox.setInformativeText(
         'A new version of %s has been detected. Would you like to update now?'
         % qApp.applicationName())
     install_btn = mbox.addButton('Install Update', QMessageBox.AcceptRole)
     reject_btn = mbox.addButton('Not Now', QMessageBox.RejectRole)
     mbox.setDefaultButton(install_btn)
     return mbox.exec_()
Пример #12
0
 def readSettings(self):
     # Load State and geometry
     sttgns = QSettings(qApp.organizationName(), qApp.applicationName())
     if sttgns.contains("geometry"):
         self.restoreGeometry(sttgns.value("geometry"))
     if sttgns.contains("windowState"):
         self.restoreState(sttgns.value("windowState"))
     else:
         self.dckCheatSheet.hide()
         self.dckSearch.hide()
     if sttgns.contains("metadataState"):
         state = [False if v == "false" else True for v in sttgns.value("metadataState")]
         self.redacMetadata.restoreState(state)
     if sttgns.contains("revisionsState"):
         state = [False if v == "false" else True for v in sttgns.value("revisionsState")]
         self.redacMetadata.revisions.restoreState(state)
     if sttgns.contains("splitterRedacH"):
         self.splitterRedacH.restoreState(sttgns.value("splitterRedacH"))
     if sttgns.contains("splitterRedacV"):
         self.splitterRedacV.restoreState(sttgns.value("splitterRedacV"))
     if sttgns.contains("toolbar"):
         # self.toolbar is not initialized yet, so we just store balue
         self._toolbarState = sttgns.value("toolbar")
     else:
         self._toolbarState = ""
Пример #13
0
 def __init__(self):
     super(MainWindow, self).__init__()
     self.video, self.devmode = '', False
     self.parse_cmdline()
     self.init_logger()
     self.init_settings()
     self.init_scale()
     self.init_cutter()
     self.setWindowTitle('%s' % qApp.applicationName())
     self.setContentsMargins(0, 0, 0, 0)
     self.statusBar().showMessage('Ready')
     self.statusBar().setStyleSheet('border: none; padding: 0; margin: 0;')
     self.setAcceptDrops(True)
     self.show()
     self.console.setGeometry(int(self.x() - (self.width() / 2)), self.y() + int(self.height() / 3), 750, 300)
     try:
         if len(self.video):
             if QFileInfo(self.video).suffix() == 'vcp':
                 self.cutter.openProject(project_file=self.video)
             else:
                 self.cutter.loadMedia(self.video)
     except (FileNotFoundError, PermissionError) as e:
         QMessageBox.critical(self, 'Error loading file', sys.exc_info()[0])
         logging.exception('Error loading file')
         qApp.restoreOverrideCursor()
         self.restart()
     if not self.cutter.ffmpeg_check():
         qApp.exit(1)
Пример #14
0
 def __init__(self):
     super(MainWindow, self).__init__()
     self.video, self.resizeTimer = '', 0
     self.parse_cmdline()
     self.init_settings()
     self.init_logger()
     self.init_scale()
     self.init_cutter()
     self.setWindowTitle(qApp.applicationName())
     self.setContentsMargins(0, 0, 0, 0)
     self.statusBar().showMessage('Ready')
     self.statusBar().setStyleSheet('border: none; padding: 0; margin: 0;')
     self.setAcceptDrops(True)
     self.show()
     if sys.platform == 'win32' and TaskbarProgress.isValidWinVer():
         self.win_taskbar_button = QWinTaskbarButton(self)
         self.win_taskbar_button.setWindow(self.windowHandle())
         self.win_taskbar_button.progress().setVisible(True)
         self.win_taskbar_button.progress().setValue(0)
     self.console.setGeometry(int(self.x() - (self.width() / 2)),
                              self.y() + int(self.height() / 3), 750, 300)
     if not self.video and os.path.isfile(
             os.path.join(QDir.tempPath(), MainWindow.TEMP_PROJECT_FILE)):
         self.video = os.path.join(QDir.tempPath(),
                                   MainWindow.TEMP_PROJECT_FILE)
     if self.video:
         self.file_opener(self.video)
Пример #15
0
 def __init__(self, settings: QSettings, parent=None):
     super(TVLinker, self).__init__(parent)
     self.firstrun = True
     self.rows, self.cols = 0, 0
     self.parent = parent
     self.settings = settings
     self.taskbar = TaskbarProgress(self)
     self.init_styles()
     self.init_settings()
     self.init_icons()
     if sys.platform.startswith('linux'):
         notify.init(qApp.applicationName())
     layout = QVBoxLayout()
     layout.setSpacing(0)
     layout.setContentsMargins(15, 15, 15, 0)
     form_groupbox = QGroupBox(self, objectName='mainForm')
     form_groupbox.setLayout(self.init_form())
     self.table = TVLinkerTable(0, 4, self)
     self.table.doubleClicked.connect(self.show_hosters)
     layout.addWidget(form_groupbox)
     layout.addWidget(self.table)
     layout.addLayout(self.init_metabar())
     self.setLayout(layout)
     qApp.setWindowIcon(self.icon_app)
     self.resize(FixedSettings.windowSize)
     self.show()
     self.start_scraping()
     self.firstrun = False
Пример #16
0
    def closeEvent(self, event):
        # Save State and geometry and other things
        sttgns = QSettings(qApp.organizationName(), qApp.applicationName())
        sttgns.setValue("geometry", self.saveGeometry())
        sttgns.setValue("windowState", self.saveState())
        sttgns.setValue("metadataState", self.redacMetadata.saveState())
        sttgns.setValue("revisionsState",
                        self.redacMetadata.revisions.saveState())
        sttgns.setValue("splitterRedacH", self.splitterRedacH.saveState())
        sttgns.setValue("splitterRedacV", self.splitterRedacV.saveState())
        sttgns.setValue("toolbar", self.toolbar.saveState())

        # Specific settings to save before quitting
        settings.lastTab = self.tabMain.currentIndex()

        if self.currentProject:
            # Remembering the current items (stores outlineItem's ID)
            sel = []
            for i in range(self.mainEditor.tab.count()):
                sel.append(
                    self.mdlOutline.ID(
                        self.mainEditor.tab.widget(i).currentIndex))
            settings.openIndexes = sel

        # Save data from models
        if self.currentProject and settings.saveOnQuit:
            self.saveDatas()
Пример #17
0
 def readSettings(self):
     # Load State and geometry
     sttgns = QSettings(qApp.organizationName(), qApp.applicationName())
     if sttgns.contains("geometry"):
         self.restoreGeometry(sttgns.value("geometry"))
     if sttgns.contains("windowState"):
         self.restoreState(sttgns.value("windowState"))
     else:
         self.dckCheatSheet.hide()
         self.dckSearch.hide()
     if sttgns.contains("metadataState"):
         state = [
             False if v == "false" else True
             for v in sttgns.value("metadataState")
         ]
         self.redacMetadata.restoreState(state)
     if sttgns.contains("revisionsState"):
         state = [
             False if v == "false" else True
             for v in sttgns.value("revisionsState")
         ]
         self.redacMetadata.revisions.restoreState(state)
     if sttgns.contains("splitterRedacH"):
         self.splitterRedacH.restoreState(sttgns.value("splitterRedacH"))
     if sttgns.contains("splitterRedacV"):
         self.splitterRedacV.restoreState(sttgns.value("splitterRedacV"))
     if sttgns.contains("toolbar"):
         # self.toolbar is not initialized yet, so we just store balue
         self._toolbarState = sttgns.value("toolbar")
     else:
         self._toolbarState = ""
Пример #18
0
 def __init__(self):
     super(MainWindow, self).__init__()
     self.edl, self.video = '', ''
     self.parse_cmdline()
     self.init_logger()
     self.init_cutter()
     self.setWindowTitle('%s' % qApp.applicationName())
     self.setContentsMargins(0, 0, 0, 0)
     self.statusBar().showMessage('Ready')
     statuslogo = QLabel(pixmap=QPixmap(':/images/vidcutter-emboss.png'),
                         objectName='logowidget')
     self.statusBar().addPermanentWidget(statuslogo)
     self.statusBar().setStyleSheet('border:none;')
     self.setAcceptDrops(True)
     self.setMinimumSize(900, 640)
     self.show()
     try:
         if len(self.video):
             self.cutter.loadMedia(self.video)
         if len(self.edl):
             self.cutter.openEDL(edlfile=self.edl)
     except (FileNotFoundError, PermissionError) as e:
         QMessageBox.critical(self, 'Error loading file', sys.exc_info()[0])
         logging.exception('Error loading file')
         qApp.restoreOverrideCursor()
         self.cutter.startNew()
     if not self.cutter.ffmpeg_check():
         self.close()
         sys.exit(1)
Пример #19
0
 def __init__(self, parent=None, flags=Qt.WindowCloseButtonHint):
     super(SettingsDialog, self).__init__(parent, flags)
     self.parent = parent
     self.settings = self.parent.settings
     self.theme = self.parent.theme
     self.setObjectName('settingsdialog')
     self.categories = QListWidget(self)
     self.categories.setResizeMode(QListView.Adjust)
     self.categories.setStyleSheet(
         'QListView::item { text-decoration: none; }')
     self.categories.setAttribute(Qt.WA_MacShowFocusRect, False)
     self.categories.setObjectName('settingsmenu')
     self.categories.setUniformItemSizes(True)
     self.categories.setMouseTracking(True)
     self.categories.setViewMode(QListView.IconMode)
     self.categories.setIconSize(QSize(90, 60))
     self.categories.setMovement(QListView.Static)
     self.categories.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
     self.pages = QStackedWidget(self)
     self.pages.addWidget(GeneralPage(self))
     self.pages.addWidget(VideoPage(self))
     self.pages.addWidget(ThemePage(self))
     self.initCategories()
     horizontalLayout = QHBoxLayout()
     horizontalLayout.addWidget(self.categories)
     horizontalLayout.addWidget(self.pages, 1)
     buttons = QDialogButtonBox(QDialogButtonBox.Ok, self)
     buttons.accepted.connect(self.close)
     mainLayout = QVBoxLayout()
     mainLayout.addLayout(horizontalLayout)
     mainLayout.addSpacing(12)
     mainLayout.addWidget(buttons)
     self.setLayout(mainLayout)
     self.setWindowTitle('Settings - {0}'.format(qApp.applicationName()))
     self.setFixedWidth(620)
Пример #20
0
 def init_cutter(self) -> None:
     self.cutter = VideoCutter(self)
     self.cutter.errorOccurred.connect(self.errorHandler)
     # qApp.setWindowIcon(QIcon(':/images/vidcutter.png'))
     qApp.setWindowIcon(
         QIcon.fromTheme(qApp.applicationName().lower(),
                         QIcon(':/images/vidcutter.png')))
     self.setCentralWidget(self.cutter)
Пример #21
0
 def getSettings(self):
     ## store in home directory
     orgName = qApp.organizationName()
     appName = qApp.applicationName()
     settings = QtCore.QSettings(QtCore.QSettings.IniFormat,
                                 QtCore.QSettings.UserScope, orgName,
                                 appName, self)
     return settings
Пример #22
0
def get_settings(parent=None):
    ## store in home directory
    orgName = qApp.organizationName()
    appName = qApp.applicationName()
    settings = QtCore.QSettings(QtCore.QSettings.IniFormat,
                                QtCore.QSettings.UserScope, orgName, appName,
                                parent)
    return settings
Пример #23
0
 def select_provider(self, index: int):
     if index == 0:
         self.provider = 'Scene-RLS'
         self.source_url = 'http://scene-rls.net/releases/index.php?p={0}&cat=TV%20Shows'
     elif index == 1:
         self.provider = 'TV-Release'
         self.source_url = 'http://tv-release.pw/?cat=TV'
     self.setWindowTitle('%s :: %s' %
                         (qApp.applicationName(), self.provider))
Пример #24
0
 def init_icons(self) -> None:
     self.icon_app = QIcon(
         self.get_path('images/%s.png' % qApp.applicationName().lower()))
     self.icon_faves_off = QIcon(':assets/images/star_off.png')
     self.icon_faves_on = QIcon(':assets/images/star_on.png')
     self.icon_refresh = QIcon(':assets/images/refresh.png')
     self.icon_menu = QIcon(':assets/images/menu.png')
     self.icon_settings = QIcon(':assets/images/cog.png')
     self.icon_updates = QIcon(':assets/images/cloud.png')
Пример #25
0
 def confirm_update(parent: QWidget, update_success: bool) -> None:
     if update_success and QMessageBox.question(
             parent,
             '%s UPDATER' % qApp.applicationName(),
             '<h3>UPDATE COMPLETE</h3><p>To begin using the newly installed '
             + 'version the application needs to be restarted.</p>' +
             '<p>Would you like to restart now?</p><br/>',
             buttons=(QMessageBox.Yes | QMessageBox.No)):
         Updater.restart_app()
Пример #26
0
 def loadSettings(self):
     if self.parent:
         settings = self.parent.settings
         self.lineEditApiUrl.setText(
             settings.value('server/api_base_url', type=str))
         if keyring.get_password(qApp.applicationName(), 'Token'):
             # Don't put the real token in there. Fill it with fluff.
             # http://bash.org/?244321=
             self.lineEditApiToken.setText('hunter2')
Пример #27
0
 def setAppFontSize(self, val):
     """
     Set application default font point size.
     """
     f = qApp.font()
     f.setPointSize(val)
     qApp.setFont(f)
     mainWindow().setFont(f)
     sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
     sttgs.setValue("appFontSize", val)
Пример #28
0
 def setAppFontSize(self, val):
     """
     Set application default font point size.
     """
     f = qApp.font()
     f.setPointSize(val)
     qApp.setFont(f)
     mainWindow().setFont(f)
     sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
     sttgs.setValue("appFontSize", val)
Пример #29
0
 def aria2_confirmation(self, success: bool) -> None:
     qApp.restoreOverrideCursor()
     if success:
         if sys.platform.startswith('linux'):
             self.notify(
                 title=qApp.applicationName(),
                 msg='Your download link has been unrestricted and now ' +
                 'queued in Aria2 RPC Daemon',
                 icon=self.NotifyIcon.SUCCESS)
         else:
             QMessageBox.information(
                 self, qApp.applicationName(),
                 'Download link has been queued in Aria2.', QMessageBox.Ok)
     else:
         QMessageBox.critical(
             self, 'Aria2 RPC Daemon',
             'Could not connect to Aria2 RPC Daemon. ' +
             'Check your %s settings and try again.' %
             qApp.applicationName(), QMessageBox.Ok)
Пример #30
0
 def init(self):
     self.app_name = qApp.applicationName().lower()
     self.app_dir = Path(
         QStandardPaths.writableLocation(QStandardPaths.AppConfigLocation))
     self.app_dir.mkdir(exist_ok=True)
     settings_file = f"{self.app_name}.ini"
     self.settings = QSettings(
         self.app_dir.joinpath(settings_file).as_posix(),
         QSettings.IniFormat)
     self.settings.sync()
Пример #31
0
    def init(self):
        self.app_name = qApp.applicationName().lower()
        self.app_dir = Path().home().joinpath('Library').joinpath(
            'Preferences').joinpath(self.app_name)
        self.app_dir.mkdir(exist_ok=True)
        settings_file = f"{self.app_name}.ini"
        self.settings = QSettings(
            self.app_dir.joinpath(settings_file).as_posix(),
            QSettings.IniFormat)

        self.settings.sync()
Пример #32
0
 def startNew(self) -> None:
     self.unsetCursor()
     self.clearList()
     self.seekSlider.setValue(0)
     self.seekSlider.setRange(0, 0)
     self.mediaPlayer.setMedia(QMediaContent())
     self.initNoVideo()
     self.videoLayout.replaceWidget(self.videoplayerWidget,
                                    self.novideoWidget)
     self.initMediaControls(False)
     self.parent.setWindowTitle('%s' % qApp.applicationName())
Пример #33
0
    def closeEvent(self, event):
        # Save State and geometry and other things
        sttgns = QSettings(qApp.organizationName(), qApp.applicationName())
        sttgns.setValue("geometry", self.saveGeometry())
        sttgns.setValue("windowState", self.saveState())
        sttgns.setValue("metadataState", self.redacMetadata.saveState())
        sttgns.setValue("revisionsState", self.redacMetadata.revisions.saveState())
        sttgns.setValue("splitterRedacH", self.splitterRedacH.saveState())
        sttgns.setValue("splitterRedacV", self.splitterRedacV.saveState())
        sttgns.setValue("toolbar", self.toolbar.saveState())

        # Specific settings to save before quitting
        settings.lastTab = self.tabMain.currentIndex()

        if self.currentProject:
            # Remembering the current items
            sel = []
            for i in range(self.mainEditor.tab.count()):
                sel.append(self.mdlOutline.pathToIndex(self.mainEditor.tab.widget(i).currentIndex))
            settings.openIndexes = sel

        # Save data from models
        if self.currentProject and settings.saveOnQuit:
            self.saveDatas()
Пример #34
0
    def __init__(self, mainWindow):
        QWidget.__init__(self)
        self.setupUi(self)
        self.mw = mainWindow

        # UI
        for i in range(self.lstMenu.count()):
            item = self.lstMenu.item(i)
            item.setSizeHint(QSize(item.sizeHint().width(), 42))
            item.setTextAlignment(Qt.AlignCenter)
        self.lstMenu.setMaximumWidth(150)

        # General
        self.cmbStyle.addItems(list(QStyleFactory.keys()))
        self.cmbStyle.setCurrentIndex([i.lower() for i in list(QStyleFactory.keys())].index(qApp.style().objectName()))
        self.cmbStyle.currentIndexChanged[str].connect(self.setStyle)

        self.cmbTranslation.clear()
        tr = OrderedDict()
        tr["English"] = ""
        tr["Français"] = "manuskript_fr.qm"
        tr["Español"] = "manuskript_es.qm"

        for name in tr:
            self.cmbTranslation.addItem(name, tr[name])

        sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
        if sttgs.contains("applicationTranslation") and sttgs.value("applicationTranslation") in tr.values():
            self.cmbTranslation.setCurrentText([i for i in tr if tr[i] == sttgs.value("applicationTranslation")][0])

        self.cmbTranslation.currentIndexChanged.connect(self.setTranslation)

        self.txtAutoSave.setValidator(QIntValidator(0, 999, self))
        self.txtAutoSaveNoChanges.setValidator(QIntValidator(0, 999, self))
        self.chkAutoSave.setChecked(settings.autoSave)
        self.chkAutoSaveNoChanges.setChecked(settings.autoSaveNoChanges)
        self.txtAutoSave.setText(str(settings.autoSaveDelay))
        self.txtAutoSaveNoChanges.setText(str(settings.autoSaveNoChangesDelay))
        self.chkSaveOnQuit.setChecked(settings.saveOnQuit)
        self.chkSaveToZip.setChecked(settings.saveToZip)
        self.chkAutoSave.stateChanged.connect(self.saveSettingsChanged)
        self.chkAutoSaveNoChanges.stateChanged.connect(self.saveSettingsChanged)
        self.chkSaveOnQuit.stateChanged.connect(self.saveSettingsChanged)
        self.chkSaveToZip.stateChanged.connect(self.saveSettingsChanged)
        self.txtAutoSave.textEdited.connect(self.saveSettingsChanged)
        self.txtAutoSaveNoChanges.textEdited.connect(self.saveSettingsChanged)
        autoLoad, last = self.mw.welcome.getAutoLoadValues()
        self.chkAutoLoad.setChecked(autoLoad)
        self.chkAutoLoad.stateChanged.connect(self.saveSettingsChanged)

        # Revisions
        opt = settings.revisions
        self.chkRevisionsKeep.setChecked(opt["keep"])
        self.chkRevisionsKeep.stateChanged.connect(self.revisionsSettingsChanged)
        self.chkRevisionRemove.setChecked(opt["smartremove"])
        self.chkRevisionRemove.toggled.connect(self.revisionsSettingsChanged)
        self.spnRevisions10Mn.setValue(60 / opt["rules"][10 * 60])
        self.spnRevisions10Mn.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsHour.setValue(60 * 10 / opt["rules"][60 * 60])
        self.spnRevisionsHour.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsDay.setValue(60 * 60 / opt["rules"][60 * 60 * 24])
        self.spnRevisionsDay.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsMonth.setValue(60 * 60 * 24 / opt["rules"][60 * 60 * 24 * 30])
        self.spnRevisionsMonth.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsEternity.setValue(60 * 60 * 24 * 7 / opt["rules"][None])
        self.spnRevisionsEternity.valueChanged.connect(self.revisionsSettingsChanged)

        # Views
        self.tabViews.setCurrentIndex(0)
        lst = ["Nothing", "POV", "Label", "Progress", "Compile"]
        for cmb in self.viewSettingsDatas():
            item, part = self.viewSettingsDatas()[cmb]
            cmb.setCurrentIndex(lst.index(settings.viewSettings[item][part]))
            cmb.currentIndexChanged.connect(self.viewSettingsChanged)

        for chk in self.outlineColumnsData():
            col = self.outlineColumnsData()[chk]
            chk.setChecked(col in settings.outlineViewColumns)
            chk.stateChanged.connect(self.outlineColumnsChanged)

        self.chkOutlinePOV.setVisible(settings.viewMode != "simple") #  Hides checkbox if non-fiction view mode

        for item, what, value in [
            (self.rdoTreeItemCount, "InfoFolder", "Count"),
            (self.rdoTreeWC, "InfoFolder", "WC"),
            (self.rdoTreeProgress, "InfoFolder", "Progress"),
            (self.rdoTreeSummary, "InfoFolder", "Summary"),
            (self.rdoTreeNothing, "InfoFolder", "Nothing"),
            (self.rdoTreeTextWC, "InfoText", "WC"),
            (self.rdoTreeTextProgress, "InfoText", "Progress"),
            (self.rdoTreeTextSummary, "InfoText", "Summary"),
            (self.rdoTreeTextNothing, "InfoText", "Nothing"),
        ]:
            item.setChecked(settings.viewSettings["Tree"][what] == value)
            item.toggled.connect(self.treeViewSettignsChanged)

        self.populatesCmbBackgrounds(self.cmbCorkImage)
        self.setCorkImageDefault()
        self.updateCorkColor()
        self.cmbCorkImage.currentIndexChanged.connect(self.setCorkBackground)
        self.btnCorkColor.clicked.connect(self.setCorkColor)

        # Text editor
        opt = settings.textEditor
        self.setButtonColor(self.btnEditorFontColor, opt["fontColor"])
        self.btnEditorFontColor.clicked.connect(self.choseEditorFontColor)
        self.setButtonColor(self.btnEditorMisspelledColor, opt["misspelled"])
        self.btnEditorMisspelledColor.clicked.connect(self.choseEditorMisspelledColor)
        self.setButtonColor(self.btnEditorBackgroundColor, opt["background"])
        self.btnEditorBackgroundColor.clicked.connect(self.choseEditorBackgroundColor)
        f = QFont()
        f.fromString(opt["font"])
        self.cmbEditorFontFamily.setCurrentFont(f)
        self.cmbEditorFontFamily.currentFontChanged.connect(self.updateEditorSettings)
        self.spnEditorFontSize.setValue(f.pointSize())
        self.spnEditorFontSize.valueChanged.connect(self.updateEditorSettings)
        self.cmbEditorLineSpacing.setCurrentIndex(
                0 if opt["lineSpacing"] == 100 else
                1 if opt["lineSpacing"] == 150 else
                2 if opt["lineSpacing"] == 200 else
                3)
        self.cmbEditorLineSpacing.currentIndexChanged.connect(self.updateEditorSettings)
        self.spnEditorLineSpacing.setValue(opt["lineSpacing"])
        self.spnEditorLineSpacing.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorLineSpacing.setEnabled(opt["lineSpacing"] not in [100, 150, 200])
        self.spnEditorLineSpacing.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorTabWidth.setValue(opt["tabWidth"])
        self.spnEditorTabWidth.valueChanged.connect(self.updateEditorSettings)
        self.chkEditorIndent.setChecked(opt["indent"])
        self.chkEditorIndent.stateChanged.connect(self.updateEditorSettings)
        self.spnEditorParaAbove.setValue(opt["spacingAbove"])
        self.spnEditorParaAbove.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorParaBelow.setValue(opt["spacingBelow"])
        self.spnEditorParaAbove.valueChanged.connect(self.updateEditorSettings)

        # Labels
        self.lstLabels.setModel(self.mw.mdlLabels)
        self.lstLabels.setRowHidden(0, True)
        self.lstLabels.clicked.connect(self.updateLabelColor)
        self.btnLabelAdd.clicked.connect(self.addLabel)
        self.btnLabelRemove.clicked.connect(self.removeLabel)
        self.btnLabelColor.clicked.connect(self.setLabelColor)

        # Statuses
        self.lstStatus.setModel(self.mw.mdlStatus)
        self.lstStatus.setRowHidden(0, True)
        self.btnStatusAdd.clicked.connect(self.addStatus)
        self.btnStatusRemove.clicked.connect(self.removeStatus)

        # Fullscreen
        self._editingTheme = None
        self.btnThemeEditOK.setIcon(qApp.style().standardIcon(QStyle.SP_DialogApplyButton))
        self.btnThemeEditOK.clicked.connect(self.saveTheme)
        self.btnThemeEditCancel.setIcon(qApp.style().standardIcon(QStyle.SP_DialogCancelButton))
        self.btnThemeEditCancel.clicked.connect(self.cancelEdit)
        self.cmbThemeEdit.currentIndexChanged.connect(self.themeEditStack.setCurrentIndex)
        self.cmbThemeEdit.setCurrentIndex(0)
        self.cmbThemeEdit.currentIndexChanged.emit(0)
        self.themeStack.setCurrentIndex(0)
        self.lstThemes.currentItemChanged.connect(self.themeSelected)
        self.populatesThemesList()
        self.btnThemeAdd.clicked.connect(self.newTheme)
        self.btnThemeEdit.clicked.connect(self.editTheme)
        self.btnThemeRemove.clicked.connect(self.removeTheme)
Пример #35
0
 def setTranslation(self, index):
     path = self.cmbTranslation.currentData()
     # Save settings
     sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
     sttgs.setValue("applicationTranslation", path)
Пример #36
0
def test_general(MWSampleProject):
    MW = MWSampleProject

    # Loading from mainWindow
    MW.actSettings.triggered.emit()
    assert MW.sw.isVisible()
    MW.sw.close()
    MW.actLabels.triggered.emit()
    assert MW.sw.isVisible()
    MW.sw.close()
    MW.actStatus.triggered.emit()
    assert MW.sw.isVisible()
    MW.sw.hide()
    MW.sw.setTab("General")

    SW = MW.sw

    # Imports
    from PyQt5.QtWidgets import qApp, QStyleFactory
    from PyQt5.QtCore import QSettings, Qt
    qS = QSettings(qApp.organizationName(), qApp.applicationName())
    from manuskript import settings as S

    # Style
    assert SW.cmbStyle.count() == len(list(QStyleFactory.keys()))
    if qS.value("applicationStyle"):
        assert SW.cmbStyle.currentText() == qS.value("applicationStyle")
    ## Seg fault when trying to set the style in tests:
    # for s in styles:
    #     SW.cmbStyle.setCurrentText(s)
        # assert S.value("applicationStyle") == s

    # Translations
    if qS.value("applicationTranslation"):
        assert (SW.cmbTranslation.currentData()
                == qS.value("applicationTranslation"))
    for name in SW.translations:
        SW.cmbTranslation.setCurrentText(name)
        if qS.value("applicationTranslation"):
            assert qS.value("applicationTranslation") == SW.translations[name]

    def switchCheckBoxAndAssert(chk, settings):
        """
        Asserts that the check state is that of settings, change checkstate
        and asserts settings has been changed.
        Settings is a function that returns the value.
        """
        state = settings()
        assert chk.isChecked() == state
        chk.setChecked(not state)
        assert chk.isChecked() is not state

    # Loading and Saving
    SW.txtAutoSave.setText("0")
    SW.txtAutoSaveNoChanges.setText("0")
    switchCheckBoxAndAssert(SW.chkAutoLoad,
                            lambda: qS.value("autoLoad", type=bool))
    switchCheckBoxAndAssert(SW.chkAutoSave,
                            lambda: S.autoSave)
    switchCheckBoxAndAssert(SW.chkAutoSaveNoChanges,
                            lambda: S.autoSaveNoChanges)
    switchCheckBoxAndAssert(SW.chkSaveOnQuit,
                            lambda: S.saveOnQuit)
    switchCheckBoxAndAssert(SW.chkSaveToZip,
                            lambda: S.saveToZip)

    # Revisions
    switchCheckBoxAndAssert(SW.chkRevisionsKeep,
                            lambda: S.revisions["keep"])
    switchCheckBoxAndAssert(SW.chkRevisionRemove,
                            lambda: S.revisions["smartremove"])

    # Views
    # Simple way here, we just call the functions.
    SW.cmbTreeIcon.currentIndexChanged.emit(0)
    SW.cmbOutlineIcon.currentIndexChanged.emit(0)
    SW.cmbCorkIcon.currentIndexChanged.emit(0)
    SW.chkOutlineTitle.setChecked(Qt.Checked)  #outlineColumnsChanged
    SW.chkOutlineTitle.setChecked(Qt.Unchecked)
    SW.chkOutlineTitle.setChecked(Qt.Checked)
    # Can't test because of the dialog
    # assert SW.setCorkColor() is None
    SW.sldTreeIconSize.setValue(SW.sldTreeIconSize.value() + 1)
    SW.rdoCorkNewStyle.toggled.emit(True)
    SW.cmbCorkImage.currentIndexChanged.emit(0)
    SW.cmbCorkImage.currentIndexChanged.emit(1)
    # Test editor: same problem as above
    # choseEditorFontColor
    # choseEditorMisspelledColor
    # choseEditorBackgroundColor
    # Test editor
    switchCheckBoxAndAssert(SW.chkEditorBackgroundTransparent,
                            lambda: S.textEditor["backgroundTransparent"])
    assert SW.restoreEditorColors() is None
    switchCheckBoxAndAssert(SW.chkEditorNoBlinking,
                            lambda: S.textEditor["cursorNotBlinking"])
    # Twice on purpose: set and restore
    switchCheckBoxAndAssert(SW.chkEditorNoBlinking,
                            lambda: S.textEditor["cursorNotBlinking"])
    # Manually call updateAllWidgets, because other wise timer of 250ms
    SW.updateAllWidgets()

    # Labels
    assert SW.updateLabelColor(MW.mdlLabels.item(1).index()) is None
    rc = MW.mdlLabels.rowCount()
    SW.addLabel()
    SW.lstLabels.setCurrentIndex(
        MW.mdlLabels.item(MW.mdlLabels.rowCount() - 1).index())
    SW.removeLabel()
    assert MW.mdlLabels.rowCount() == rc
    # setLabelColor # Same problem as above

    # Status
    rc = MW.mdlStatus.rowCount()
    SW.addStatus()
    SW.lstStatus.setCurrentIndex(
        MW.mdlStatus.item(MW.mdlStatus.rowCount() - 1).index())
    SW.removeStatus()
    assert MW.mdlStatus.rowCount() == rc

    # Fullscreen
    # self.lstThemes.currentItemChanged.connect(self.themeSelected)
    item = SW.lstThemes.item(0)
    SW.lstThemes.currentItemChanged.emit(item, None)
    assert S.fullScreenTheme in item.data(Qt.UserRole)
    SW.lstThemes.currentItemChanged.emit(None, None)
    count = SW.lstThemes.count()
    SW.newTheme()
    assert SW.lstThemes.count() == count + 1
    SW.newTheme() # theme with same name
    item = SW.lstThemes.item(SW.lstThemes.count() - 1)
    SW.lstThemes.setCurrentItem(item)
    SW.removeTheme()
    item = SW.lstThemes.item(count)
    SW.lstThemes.setCurrentItem(item)
    SW.editTheme()
    switchCheckBoxAndAssert(SW.chkThemeIndent,
                            lambda: SW._themeData["Spacings/IndentFirstLine"])
    SW.updateThemeFont(None)
    SW.updateThemeBackground(0)
    SW.updateThemeBackground(1)
    SW.spnThemeLineSpacing.setValue(123)
    for i in range(4):
        SW.updateLineSpacing(i)
        SW.updateUIFromTheme() # No time to wait on timer
    assert SW._editingTheme is not None
    SW.resize(SW.geometry().size()) # resizeEvent
    #TODO: other edit test (see SW.loadTheme
    SW.saveTheme()
    item = SW.lstThemes.item(count)
    SW.lstThemes.setCurrentItem(item)
    SW.editTheme()
    SW.cancelEdit()
    item = SW.lstThemes.item(count)
    SW.lstThemes.setCurrentItem(item)
    SW.removeTheme()
    assert SW.lstThemes.count() == count
Пример #37
0
    def __init__(self, mainWindow):
        QWidget.__init__(self)
        self.setupUi(self)
        self.mw = mainWindow

        # UI
        for l in [self.lblTitleGeneral,
                  self.lblTitleGeneral_2,
                  self.lblTitleViews,
                  self.lblTitleLabels,
                  self.lblTitleStatus,
                  self.lblTitleFullscreen,
                  ]:
            l.setStyleSheet(S.titleLabelSS())

        icons = [QIcon.fromTheme("configure"),
                 QIcon.fromTheme("history-view"),
                 QIcon.fromTheme("gnome-settings"),
                 themeIcon("label"),
                 themeIcon("status"),
                 QIcon.fromTheme("preferences-desktop-theme")
                ]
        for i in range(self.lstMenu.count()):
            item = self.lstMenu.item(i)
            item.setSizeHint(QSize(item.sizeHint().width(), 42))
            item.setTextAlignment(Qt.AlignCenter)
            if icons[i]:
                item.setIcon(icons[i])
        self.lstMenu.setMaximumWidth(140)
        self.lstMenu.setMinimumWidth(140)

        # General
        self.cmbStyle.addItems(list(QStyleFactory.keys()))
        self.cmbStyle.setCurrentIndex(
            [i.lower() for i in list(QStyleFactory.keys())]
            .index(qApp.style().objectName()))
        self.cmbStyle.currentIndexChanged[str].connect(self.setStyle)

        self.cmbTranslation.clear()
        tr = OrderedDict()
        tr["English"] = ""
        tr["Arabic (Saudi Arabia)"] = "manuskript_ar_SA.qm"
        tr["Deutsch"] = "manuskript_de.qm"
        tr["Español"] = "manuskript_es.qm"
        tr["Français"] = "manuskript_fr.qm"
        tr["Hungarian"] = "manuskript_hu.qm"
        tr["Indonesian"] = "manuskript_id.qm"
        tr["Italian"] = "manuskript_it.qm"
        tr["Norwegian Bokmål"] = "manuskript_nb_NO.qm"
        tr["Dutch"] = "manuskript_nl.qm"
        tr["Polish"] = "manuskript_pl.qm"
        tr["Portuguese (Brazil)"] = "manuskript_pt_BR.qm"
        tr["Portuguese (Portugal)"] = "manuskript_pt_PT.qm"
        tr["Russian"] = "manuskript_ru.qm"
        tr["Svenska"] = "manuskript_sv.qm"
        tr["Ukranian"] = "manuskript_uk.qm"
        tr["Chinese (Simplified)"] = "manuskript_zh_CN.qm"
        self.translations = tr

        for name in tr:
            self.cmbTranslation.addItem(name, tr[name])

        sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
        if (sttgs.contains("applicationTranslation")
            and sttgs.value("applicationTranslation") in tr.values()):
            # Sets the correct translation
            self.cmbTranslation.setCurrentText(
                [i for i in tr
                 if tr[i] == sttgs.value("applicationTranslation")][0])

        self.cmbTranslation.currentIndexChanged.connect(self.setTranslation)

        f = qApp.font()
        self.spnGeneralFontSize.setValue(f.pointSize())
        self.spnGeneralFontSize.valueChanged.connect(self.setAppFontSize)

        self.txtAutoSave.setValidator(QIntValidator(0, 999, self))
        self.txtAutoSaveNoChanges.setValidator(QIntValidator(0, 999, self))
        self.chkAutoSave.setChecked(settings.autoSave)
        self.chkAutoSaveNoChanges.setChecked(settings.autoSaveNoChanges)
        self.txtAutoSave.setText(str(settings.autoSaveDelay))
        self.txtAutoSaveNoChanges.setText(str(settings.autoSaveNoChangesDelay))
        self.chkSaveOnQuit.setChecked(settings.saveOnQuit)
        self.chkSaveToZip.setChecked(settings.saveToZip)
        self.chkAutoSave.stateChanged.connect(self.saveSettingsChanged)
        self.chkAutoSaveNoChanges.stateChanged.connect(self.saveSettingsChanged)
        self.chkSaveOnQuit.stateChanged.connect(self.saveSettingsChanged)
        self.chkSaveToZip.stateChanged.connect(self.saveSettingsChanged)
        self.txtAutoSave.textEdited.connect(self.saveSettingsChanged)
        self.txtAutoSaveNoChanges.textEdited.connect(self.saveSettingsChanged)
        autoLoad, last = self.mw.welcome.getAutoLoadValues()
        self.chkAutoLoad.setChecked(autoLoad)
        self.chkAutoLoad.stateChanged.connect(self.saveSettingsChanged)

        # Revisions
        opt = settings.revisions
        self.chkRevisionsKeep.setChecked(opt["keep"])
        self.chkRevisionsKeep.stateChanged.connect(self.revisionsSettingsChanged)
        self.chkRevisionRemove.setChecked(opt["smartremove"])
        self.chkRevisionRemove.toggled.connect(self.revisionsSettingsChanged)
        self.spnRevisions10Mn.setValue(60 / opt["rules"][10 * 60])
        self.spnRevisions10Mn.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsHour.setValue(60 * 10 / opt["rules"][60 * 60])
        self.spnRevisionsHour.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsDay.setValue(60 * 60 / opt["rules"][60 * 60 * 24])
        self.spnRevisionsDay.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsMonth.setValue(60 * 60 * 24 / opt["rules"][60 * 60 * 24 * 30])
        self.spnRevisionsMonth.valueChanged.connect(self.revisionsSettingsChanged)
        self.spnRevisionsEternity.setValue(60 * 60 * 24 * 7 / opt["rules"][None])
        self.spnRevisionsEternity.valueChanged.connect(self.revisionsSettingsChanged)

        # Views
        self.tabViews.setCurrentIndex(0)
        lst = ["Nothing", "POV", "Label", "Progress", "Compile"]
        for cmb in self.viewSettingsDatas():
            item, part = self.viewSettingsDatas()[cmb]
            cmb.setCurrentIndex(lst.index(settings.viewSettings[item][part]))
            cmb.currentIndexChanged.connect(self.viewSettingsChanged)

        for chk in self.outlineColumnsData():
            col = self.outlineColumnsData()[chk]
            chk.setChecked(col in settings.outlineViewColumns)
            chk.stateChanged.connect(self.outlineColumnsChanged)

        self.chkOutlinePOV.setVisible(settings.viewMode != "simple") #  Hides checkbox if non-fiction view mode

        for item, what, value in [
            (self.rdoTreeItemCount, "InfoFolder", "Count"),
            (self.rdoTreeWC, "InfoFolder", "WC"),
            (self.rdoTreeProgress, "InfoFolder", "Progress"),
            (self.rdoTreeSummary, "InfoFolder", "Summary"),
            (self.rdoTreeNothing, "InfoFolder", "Nothing"),
            (self.rdoTreeTextWC, "InfoText", "WC"),
            (self.rdoTreeTextProgress, "InfoText", "Progress"),
            (self.rdoTreeTextSummary, "InfoText", "Summary"),
            (self.rdoTreeTextNothing, "InfoText", "Nothing"),
        ]:
            item.setChecked(settings.viewSettings["Tree"][what] == value)
            item.toggled.connect(self.treeViewSettignsChanged)

        self.sldTreeIconSize.valueChanged.connect(self.treeViewSettignsChanged)
        self.sldTreeIconSize.valueChanged.connect(
            lambda v: self.lblTreeIconSize.setText("{}x{}".format(v, v)))
        self.sldTreeIconSize.setValue(settings.viewSettings["Tree"]["iconSize"])

        self.rdoCorkOldStyle.setChecked(settings.corkStyle == "old")
        self.rdoCorkNewStyle.setChecked(settings.corkStyle == "new")
        self.rdoCorkNewStyle.toggled.connect(self.setCorkStyle)
        self.rdoCorkOldStyle.toggled.connect(self.setCorkStyle)

        self.populatesCmbBackgrounds(self.cmbCorkImage)
        self.setCorkImageDefault()
        self.updateCorkColor()
        self.cmbCorkImage.currentIndexChanged.connect(self.setCorkBackground)
        self.btnCorkColor.clicked.connect(self.setCorkColor)

        # Text editor
        opt = settings.textEditor
            # Font
        self.setButtonColor(self.btnEditorFontColor, opt["fontColor"])
        self.btnEditorFontColor.clicked.connect(self.choseEditorFontColor)
        self.setButtonColor(self.btnEditorMisspelledColor, opt["misspelled"])
        self.btnEditorMisspelledColor.clicked.connect(self.choseEditorMisspelledColor)
        self.setButtonColor(self.btnEditorBackgroundColor, opt["background"])
        self.btnEditorBackgroundColor.clicked.connect(self.choseEditorBackgroundColor)
        self.chkEditorBackgroundTransparent.setChecked(opt["backgroundTransparent"])
        self.chkEditorBackgroundTransparent.stateChanged.connect(self.updateEditorSettings)
        self.btnEditorColorDefault.clicked.connect(self.restoreEditorColors)
        f = QFont()
        f.fromString(opt["font"])
        self.cmbEditorFontFamily.setCurrentFont(f)
        self.cmbEditorFontFamily.currentFontChanged.connect(self.updateEditorSettings)
        self.spnEditorFontSize.setValue(f.pointSize())
        self.spnEditorFontSize.valueChanged.connect(self.updateEditorSettings)
            # Cursor
        self.chkEditorCursorWidth.setChecked(opt["cursorWidth"] != 1)
        self.chkEditorCursorWidth.stateChanged.connect(self.updateEditorSettings)
        self.spnEditorCursorWidth.setValue(opt["cursorWidth"] if opt["cursorWidth"] != 1 else 9)
        self.spnEditorCursorWidth.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorCursorWidth.setEnabled(opt["cursorWidth"] != 1)
        self.chkEditorNoBlinking.setChecked(opt["cursorNotBlinking"])
        self.chkEditorNoBlinking.stateChanged.connect(self.setApplicationCursorBlinking)
        self.chkEditorTypeWriterMode.setChecked(opt["alwaysCenter"])
        self.chkEditorTypeWriterMode.stateChanged.connect(self.updateEditorSettings)
        self.cmbEditorFocusMode.setCurrentIndex(
                0 if not opt["focusMode"] else
                1 if opt["focusMode"] == "sentence" else
                2 if opt["focusMode"] == "line" else
                3)
        self.cmbEditorFocusMode.currentIndexChanged.connect(self.updateEditorSettings)
            # Text areas
        self.chkEditorMaxWidth.setChecked(opt["maxWidth"] != 0)
        self.chkEditorMaxWidth.stateChanged.connect(self.updateEditorSettings)
        self.spnEditorMaxWidth.setEnabled(opt["maxWidth"] != 0)
        self.spnEditorMaxWidth.setValue(500 if opt["maxWidth"] == 0 else opt["maxWidth"])
        self.spnEditorMaxWidth.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorMarginsLR.setValue(opt["marginsLR"])
        self.spnEditorMarginsLR.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorMarginsTB.setValue(opt["marginsTB"])
        self.spnEditorMarginsTB.valueChanged.connect(self.updateEditorSettings)
            # Paragraphs
        self.cmbEditorAlignment.setCurrentIndex(opt["textAlignment"])
        self.cmbEditorAlignment.currentIndexChanged.connect(self.updateEditorSettings)
        self.cmbEditorLineSpacing.setCurrentIndex(
                0 if opt["lineSpacing"] == 100 else
                1 if opt["lineSpacing"] == 150 else
                2 if opt["lineSpacing"] == 200 else
                3)
        self.cmbEditorLineSpacing.currentIndexChanged.connect(self.updateEditorSettings)
        self.spnEditorLineSpacing.setValue(opt["lineSpacing"])
        self.spnEditorLineSpacing.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorLineSpacing.setEnabled(opt["lineSpacing"] not in [100, 150, 200])
        self.spnEditorLineSpacing.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorTabWidth.setValue(opt["tabWidth"])
        self.spnEditorTabWidth.valueChanged.connect(self.updateEditorSettings)
        self.chkEditorIndent.setChecked(opt["indent"])
        self.chkEditorIndent.stateChanged.connect(self.updateEditorSettings)
        self.spnEditorParaAbove.setValue(opt["spacingAbove"])
        self.spnEditorParaAbove.valueChanged.connect(self.updateEditorSettings)
        self.spnEditorParaBelow.setValue(opt["spacingBelow"])
        self.spnEditorParaBelow.valueChanged.connect(self.updateEditorSettings)
        self.timerUpdateWidgets = QTimer()
        self.timerUpdateWidgets.setSingleShot(True)
        self.timerUpdateWidgets.setInterval(250)
        self.timerUpdateWidgets.timeout.connect(self.updateAllWidgets)

        # Labels
        self.lstLabels.setModel(self.mw.mdlLabels)
        self.lstLabels.setRowHidden(0, True)
        self.lstLabels.clicked.connect(self.updateLabelColor)
        self.btnLabelAdd.clicked.connect(self.addLabel)
        self.btnLabelRemove.clicked.connect(self.removeLabel)
        self.btnLabelColor.clicked.connect(self.setLabelColor)

        # Statuses
        self.lstStatus.setModel(self.mw.mdlStatus)
        self.lstStatus.setRowHidden(0, True)
        self.btnStatusAdd.clicked.connect(self.addStatus)
        self.btnStatusRemove.clicked.connect(self.removeStatus)

        # Fullscreen
        self._editingTheme = None
        self.btnThemeEditOK.setIcon(qApp.style().standardIcon(QStyle.SP_DialogApplyButton))
        self.btnThemeEditOK.clicked.connect(self.saveTheme)
        self.btnThemeEditCancel.setIcon(qApp.style().standardIcon(QStyle.SP_DialogCancelButton))
        self.btnThemeEditCancel.clicked.connect(self.cancelEdit)
        self.cmbThemeEdit.currentIndexChanged.connect(self.themeEditStack.setCurrentIndex)
        self.cmbThemeEdit.setCurrentIndex(0)
        self.cmbThemeEdit.currentIndexChanged.emit(0)
        self.themeStack.setCurrentIndex(0)
        self.lstThemes.currentItemChanged.connect(self.themeSelected)
        self.populatesThemesList()
        self.btnThemeAdd.clicked.connect(self.newTheme)
        self.btnThemeEdit.clicked.connect(self.editTheme)
        self.btnThemeRemove.clicked.connect(self.removeTheme)
        self.timerUpdateFSPreview = QTimer()
        self.timerUpdateFSPreview.setSingleShot(True)
        self.timerUpdateFSPreview.setInterval(250)
        self.timerUpdateFSPreview.timeout.connect(self.updatePreview)
Пример #38
0
 def setStyle(self, style):
     # Save style to Qt Settings
     sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
     sttgs.setValue("applicationStyle", style)
     qApp.setStyle(style)
Пример #39
0
def settings():
    return  QSettings(qApp.organizationName(), qApp.applicationName())