manuskript/manuskript/settingsWindow.py

1003 lines
46 KiB
Python
Raw Normal View History

#!/usr/bin/env python
2016-02-07 00:34:22 +13:00
# --!-- coding: utf8 --!--
2015-06-18 06:45:24 +12:00
import os
import shutil
from collections import OrderedDict
2015-06-18 06:45:24 +12:00
from PyQt5.QtCore import QSize, QSettings, QRegExp, QTranslator, QObject
from PyQt5.QtCore import Qt, QTimer
2016-02-07 00:34:22 +13:00
from PyQt5.QtGui import QIntValidator, QIcon, QFont, QColor, QPixmap, QStandardItem, QPainter
from PyQt5.QtGui import QStyleHints
from PyQt5.QtWidgets import QStyleFactory, QWidget, QStyle, QColorDialog, QListWidgetItem, QMessageBox
from PyQt5.QtWidgets import qApp, QFileDialog
2016-02-07 00:34:22 +13:00
# Spell checker support
2016-02-07 00:34:22 +13:00
from manuskript import settings
from manuskript.enums import Outline
2016-03-25 01:42:47 +13:00
from manuskript.functions import allPaths, iconColor, writablePath, appPath, findWidgetsOfClass
2017-10-16 21:48:04 +13:00
from manuskript.functions import mainWindow, findBackground, themeIcon
2016-04-12 01:14:24 +12:00
from manuskript.ui.editors.tabSplitter import tabSplitter
2016-02-07 00:34:22 +13:00
from manuskript.ui.editors.themes import createThemePreview
from manuskript.ui.editors.themes import getThemeName
from manuskript.ui.editors.themes import loadThemeDatas
from manuskript.ui.settings_ui import Ui_Settings
2016-03-25 01:42:47 +13:00
from manuskript.ui.views.outlineView import outlineView
2016-02-07 00:34:22 +13:00
from manuskript.ui.views.textEditView import textEditView
from manuskript.ui.welcome import welcome
from manuskript.ui import style as S
2016-02-07 00:34:22 +13:00
class settingsWindow(QWidget, Ui_Settings):
def __init__(self, mainWindow):
QWidget.__init__(self)
self.setupUi(self)
self.mw = mainWindow
2016-02-07 00:34:22 +13:00
2015-06-18 06:45:24 +12:00
# UI
2017-11-15 02:48:28 +13:00
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"),
2017-10-16 21:48:04 +13:00
QIcon.fromTheme("gnome-settings"),
themeIcon("label"),
themeIcon("status"),
QIcon.fromTheme("preferences-desktop-theme")
]
2015-06-18 06:45:24 +12:00
for i in range(self.lstMenu.count()):
item = self.lstMenu.item(i)
item.setSizeHint(QSize(item.sizeHint().width(), 42))
item.setTextAlignment(Qt.AlignCenter)
2017-10-16 01:53:05 +13:00
if icons[i]:
2017-10-16 21:48:04 +13:00
item.setIcon(icons[i])
self.lstMenu.setMaximumWidth(140)
self.lstMenu.setMinimumWidth(140)
2016-02-07 00:34:22 +13:00
lowerKeys = [i.lower() for i in list(QStyleFactory.keys())]
# General
self.cmbStyle.addItems(list(QStyleFactory.keys()))
try:
self.cmbStyle.setCurrentIndex(lowerKeys.index(qApp.style().objectName()))
except ValueError:
self.cmbStyle.setCurrentIndex(0)
self.cmbStyle.currentIndexChanged[str].connect(self.setStyle)
2016-02-07 00:34:22 +13:00
self.cmbTranslation.clear()
tr = OrderedDict()
tr["English"] = ""
tr["Arabic (Saudi Arabia)"] = "manuskript_ar_SA.qm"
tr["German"] = "manuskript_de.qm"
tr["English (Great Britain)"] = "manuskript_en_GB.qm"
tr["Spanish"] = "manuskript_es.qm"
tr["Persian"] = "manuskript_fa.qm"
tr["French"] = "manuskript_fr.qm"
tr["Hungarian"] = "manuskript_hu.qm"
tr["Indonesian"] = "manuskript_id.qm"
tr["Italian"] = "manuskript_it.qm"
tr["Japanese"] = "manuskript_ja.qm"
tr["Korean"] = "manuskript_ko.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["Romanian"] = "manuskript_ro.qm"
tr["Russian"] = "manuskript_ru.qm"
tr["Svenska"] = "manuskript_sv.qm"
tr["Turkish"] = "manuskript_tr.qm"
tr["Ukrainian"] = "manuskript_uk.qm"
tr["Chinese (Simplified)"] = "manuskript_zh_CN.qm"
tr["Chinese (Traditional)"] = "manuskript_zh_HANT.qm"
2017-11-21 10:24:47 +13:00
self.translations = tr
for name in tr:
self.cmbTranslation.addItem(name, tr[name])
sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
2017-11-21 10:24:47 +13:00
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.chkProgressChars.setChecked(settings.progressChars);
self.chkProgressChars.stateChanged.connect(self.charSettingsChanged)
self.txtAutoSave.setValidator(QIntValidator(0, 999, self))
2015-06-18 04:40:55 +12:00
self.txtAutoSaveNoChanges.setValidator(QIntValidator(0, 999, self))
self.chkAutoSave.setChecked(settings.autoSave)
2015-06-18 04:40:55 +12:00
self.chkAutoSaveNoChanges.setChecked(settings.autoSaveNoChanges)
self.txtAutoSave.setText(str(settings.autoSaveDelay))
2015-06-18 04:40:55 +12:00
self.txtAutoSaveNoChanges.setText(str(settings.autoSaveNoChangesDelay))
self.chkSaveOnQuit.setChecked(settings.saveOnQuit)
self.chkSaveToZip.setChecked(settings.saveToZip)
self.chkAutoSave.stateChanged.connect(self.saveSettingsChanged)
2015-06-18 04:40:55 +12:00
self.chkAutoSaveNoChanges.stateChanged.connect(self.saveSettingsChanged)
self.chkSaveOnQuit.stateChanged.connect(self.saveSettingsChanged)
self.chkSaveToZip.stateChanged.connect(self.saveSettingsChanged)
self.txtAutoSave.textEdited.connect(self.saveSettingsChanged)
2015-06-18 04:40:55 +12:00
self.txtAutoSaveNoChanges.textEdited.connect(self.saveSettingsChanged)
2015-06-24 04:22:39 +12:00
autoLoad, last = self.mw.welcome.getAutoLoadValues()
self.chkAutoLoad.setChecked(autoLoad)
self.chkAutoLoad.stateChanged.connect(self.saveSettingsChanged)
2016-02-07 00:34:22 +13:00
2015-07-04 09:00:54 +12:00
# 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(int(60 / opt["rules"][10 * 60]))
2015-07-04 09:00:54 +12:00
self.spnRevisions10Mn.valueChanged.connect(self.revisionsSettingsChanged)
self.spnRevisionsHour.setValue(int(60 * 10 / opt["rules"][60 * 60]))
2015-07-04 09:00:54 +12:00
self.spnRevisionsHour.valueChanged.connect(self.revisionsSettingsChanged)
self.spnRevisionsDay.setValue(int(60 * 60 / opt["rules"][60 * 60 * 24]))
2015-07-04 09:00:54 +12:00
self.spnRevisionsDay.valueChanged.connect(self.revisionsSettingsChanged)
self.spnRevisionsMonth.setValue(int(60 * 60 * 24 / opt["rules"][60 * 60 * 24 * 30]))
2015-07-04 09:00:54 +12:00
self.spnRevisionsMonth.valueChanged.connect(self.revisionsSettingsChanged)
self.spnRevisionsEternity.setValue(int(60 * 60 * 24 * 7 / opt["rules"][None]))
2015-07-04 09:00:54 +12:00
self.spnRevisionsEternity.valueChanged.connect(self.revisionsSettingsChanged)
2016-02-07 00:34:22 +13:00
2015-06-18 04:40:55 +12:00
# Views
2015-06-18 06:45:24 +12:00
self.tabViews.setCurrentIndex(0)
2015-06-18 04:40:55 +12:00
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)
2016-02-07 00:34:22 +13:00
2015-06-18 04:40:55 +12:00
for chk in self.outlineColumnsData():
col = self.outlineColumnsData()[chk]
chk.setChecked(col in settings.outlineViewColumns)
chk.stateChanged.connect(self.outlineColumnsChanged)
2016-02-07 00:34:22 +13:00
2016-03-25 01:42:47 +13:00
self.chkOutlinePOV.setVisible(settings.viewMode != "simple") # Hides checkbox if non-fiction view mode
2015-06-21 20:44:11 +12:00
for item, what, value in [
(self.rdoTreeItemCount, "InfoFolder", "Count"),
(self.rdoTreeWC, "InfoFolder", "WC"),
(self.rdoTreeCC, "InfoFolder", "CC"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeProgress, "InfoFolder", "Progress"),
2016-02-10 05:52:25 +13:00
(self.rdoTreeSummary, "InfoFolder", "Summary"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeNothing, "InfoFolder", "Nothing"),
(self.rdoTreeTextWC, "InfoText", "WC"),
(self.rdoTreeTextCC, "InfoText", "CC"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeTextProgress, "InfoText", "Progress"),
2016-02-10 05:52:25 +13:00
(self.rdoTreeTextSummary, "InfoText", "Summary"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeTextNothing, "InfoText", "Nothing"),
2016-02-07 00:34:22 +13:00
]:
2015-06-21 20:44:11 +12:00
item.setChecked(settings.viewSettings["Tree"][what] == value)
item.toggled.connect(self.treeViewSettignsChanged)
2017-10-24 01:40:55 +13:00
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.chkCountSpaces.setChecked(settings.countSpaces);
self.chkCountSpaces.stateChanged.connect(self.countSpacesChanged)
2017-10-15 04:11:17 +13:00
self.rdoCorkOldStyle.setChecked(settings.corkStyle == "old")
self.rdoCorkNewStyle.setChecked(settings.corkStyle == "new")
self.rdoCorkNewStyle.toggled.connect(self.setCorkStyle)
self.rdoCorkOldStyle.toggled.connect(self.setCorkStyle)
2015-06-19 07:28:47 +12:00
self.populatesCmbBackgrounds(self.cmbCorkImage)
self.setCorkImageDefault()
2015-06-18 06:45:24 +12:00
self.updateCorkColor()
self.cmbCorkImage.currentIndexChanged.connect(self.setCorkBackground)
self.btnCorkColor.clicked.connect(self.setCorkColor)
2016-02-07 00:34:22 +13:00
2015-06-26 03:06:07 +12:00
# Text editor
opt = settings.textEditor
# Font
2015-06-26 03:06:07 +12:00
self.setButtonColor(self.btnEditorFontColor, opt["fontColor"])
self.btnEditorFontColor.clicked.connect(self.choseEditorFontColor)
self.setButtonColor(self.btnEditorMisspelledColor, opt["misspelled"])
self.btnEditorMisspelledColor.clicked.connect(self.choseEditorMisspelledColor)
2015-07-02 00:51:43 +12:00
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)
2015-06-26 03:06:07 +12:00
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
2017-10-18 21:44:05 +13:00
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)
2017-11-28 22:26:43 +13:00
self.chkEditorTypeWriterMode.setChecked(opt["alwaysCenter"])
self.chkEditorTypeWriterMode.stateChanged.connect(self.updateEditorSettings)
2017-12-06 11:18:32 +13:00
self.cmbEditorFocusMode.setCurrentIndex(
0 if not opt["focusMode"] else
1 if opt["focusMode"] == "sentence" else
2 if opt["focusMode"] == "line" else
3)
2017-12-06 11:18:32 +13:00
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)
2015-06-26 03:06:07 +12:00
self.cmbEditorLineSpacing.setCurrentIndex(
2016-02-07 00:34:22 +13:00
0 if opt["lineSpacing"] == 100 else
1 if opt["lineSpacing"] == 150 else
2 if opt["lineSpacing"] == 200 else
3)
2015-06-26 03:06:07 +12:00
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"])
2016-04-02 00:56:17 +13:00
self.spnEditorParaBelow.valueChanged.connect(self.updateEditorSettings)
self.timerUpdateWidgets = QTimer()
self.timerUpdateWidgets.setSingleShot(True)
self.timerUpdateWidgets.setInterval(250)
self.timerUpdateWidgets.timeout.connect(self.updateAllWidgets)
2016-02-07 00:34:22 +13:00
# 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)
2016-02-07 00:34:22 +13:00
2015-06-11 01:57:44 +12:00
# Statuses
self.lstStatus.setModel(self.mw.mdlStatus)
self.lstStatus.setRowHidden(0, True)
self.btnStatusAdd.clicked.connect(self.addStatus)
self.btnStatusRemove.clicked.connect(self.removeStatus)
2016-02-07 00:34:22 +13:00
2015-06-19 00:38:26 +12:00
# Fullscreen
2015-06-19 07:28:47 +12:00
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)
2015-06-19 00:38:26 +12:00
self.cmbThemeEdit.setCurrentIndex(0)
self.cmbThemeEdit.currentIndexChanged.emit(0)
2015-06-19 07:28:47 +12:00
self.themeStack.setCurrentIndex(0)
self.lstThemes.currentItemChanged.connect(self.themeSelected)
2015-06-20 04:47:45 +12:00
self.populatesThemesList()
2015-06-19 07:28:47 +12:00
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)
2016-02-07 00:34:22 +13:00
2015-06-18 06:45:24 +12:00
def setTab(self, tab):
2016-02-07 00:34:22 +13:00
2015-06-18 06:45:24 +12:00
tabs = {
2016-02-07 00:34:22 +13:00
"General": 0,
"Views": 1,
"Labels": 2,
"Status": 3,
"Fullscreen": 4,
}
2015-06-18 06:45:24 +12:00
if tab in tabs:
self.lstMenu.setCurrentRow(tabs[tab])
else:
self.lstMenu.setCurrentRow(tab)
2016-02-07 00:34:22 +13:00
####################################################################################################
# GENERAL #
####################################################################################################
def setStyle(self, style):
2016-02-07 00:34:22 +13:00
# Save style to Qt Settings
2015-06-24 04:22:39 +12:00
sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
sttgs.setValue("applicationStyle", style)
qApp.setStyle(style)
2016-02-07 00:34:22 +13:00
def setTranslation(self, index):
path = self.cmbTranslation.currentData()
# Save settings
sttgs = QSettings(qApp.organizationName(), qApp.applicationName())
sttgs.setValue("applicationTranslation", path)
# QMessageBox.information(self, "Warning", "You'll have to restart manuskript.")
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)
def charSettingsChanged(self):
settings.progressChars = True if self.chkProgressChars.checkState() else False
self.mw.mainEditor.updateStats()
def saveSettingsChanged(self):
if self.txtAutoSave.text() in ["", "0"]:
self.txtAutoSave.setText("1")
2015-06-18 04:40:55 +12:00
if self.txtAutoSaveNoChanges.text() in ["", "0"]:
self.txtAutoSaveNoChanges.setText("1")
2016-02-07 00:34:22 +13:00
2015-06-24 04:22:39 +12:00
sttgs = QSettings()
sttgs.setValue("autoLoad", True if self.chkAutoLoad.checkState() else False)
sttgs.sync()
2016-02-07 00:34:22 +13:00
settings.autoSave = True if self.chkAutoSave.checkState() else False
2015-06-18 04:40:55 +12:00
settings.autoSaveNoChanges = True if self.chkAutoSaveNoChanges.checkState() else False
settings.saveOnQuit = True if self.chkSaveOnQuit.checkState() else False
settings.saveToZip = True if self.chkSaveToZip.checkState() else False
settings.autoSaveDelay = int(self.txtAutoSave.text())
2015-06-18 04:40:55 +12:00
settings.autoSaveNoChangesDelay = int(self.txtAutoSaveNoChanges.text())
2015-06-17 22:00:03 +12:00
self.mw.saveTimer.setInterval(settings.autoSaveDelay * 60 * 1000)
2015-06-18 04:40:55 +12:00
self.mw.saveTimerNoChanges.setInterval(settings.autoSaveNoChangesDelay * 1000)
2016-02-07 00:34:22 +13:00
####################################################################################################
# REVISION #
####################################################################################################
2015-07-04 09:00:54 +12:00
def revisionsSettingsChanged(self):
opt = settings.revisions
opt["keep"] = True if self.chkRevisionsKeep.checkState() else False
opt["smartremove"] = self.chkRevisionRemove.isChecked()
opt["rules"][10 * 60] = 60 / self.spnRevisions10Mn.value()
opt["rules"][60 * 60] = 60 * 10 / self.spnRevisionsHour.value()
opt["rules"][60 * 60 * 24] = 60 * 60 / self.spnRevisionsDay.value()
opt["rules"][60 * 60 * 24 * 30] = 60 * 60 * 24 / self.spnRevisionsMonth.value()
opt["rules"][None] = 60 * 60 * 24 * 7 / self.spnRevisionsEternity.value()
2016-02-07 00:34:22 +13:00
####################################################################################################
# VIEWS #
####################################################################################################
2015-06-18 04:40:55 +12:00
def viewSettingsDatas(self):
return {
self.cmbTreeIcon: ("Tree", "Icon"),
self.cmbTreeText: ("Tree", "Text"),
self.cmbTreeBackground: ("Tree", "Background"),
self.cmbOutlineIcon: ("Outline", "Icon"),
self.cmbOutlineText: ("Outline", "Text"),
self.cmbOutlineBackground: ("Outline", "Background"),
self.cmbCorkIcon: ("Cork", "Icon"),
self.cmbCorkText: ("Cork", "Text"),
self.cmbCorkBackground: ("Cork", "Background"),
self.cmbCorkBorder: ("Cork", "Border"),
self.cmbCorkCorner: ("Cork", "Corner")
2016-02-07 00:34:22 +13:00
}
2015-06-18 04:40:55 +12:00
def viewSettingsChanged(self):
cmb = self.sender()
lst = ["Nothing", "POV", "Label", "Progress", "Compile"]
item, part = self.viewSettingsDatas()[cmb]
element = lst[cmb.currentIndex()]
self.mw.setViewSettings(item, part, element)
2016-03-25 01:42:47 +13:00
self.mw.generateViewMenu()
2016-02-07 00:34:22 +13:00
2015-06-18 04:40:55 +12:00
def outlineColumnsData(self):
return {
2017-11-16 08:58:12 +13:00
self.chkOutlineTitle: Outline.title,
self.chkOutlinePOV: Outline.POV,
self.chkOutlineLabel: Outline.label,
self.chkOutlineStatus: Outline.status,
self.chkOutlineCompile: Outline.compile,
self.chkOutlineWordCount: Outline.wordCount,
self.chkOutlineGoal: Outline.goal,
self.chkOutlinePercentage: Outline.goalPercentage,
2016-02-07 00:34:22 +13:00
}
2015-06-18 04:40:55 +12:00
def outlineColumnsChanged(self):
chk = self.sender()
val = True if chk.checkState() else False
col = self.outlineColumnsData()[chk]
if val and not col in settings.outlineViewColumns:
settings.outlineViewColumns.append(col)
elif not val and col in settings.outlineViewColumns:
settings.outlineViewColumns.remove(col)
2016-02-07 00:34:22 +13:00
2015-06-18 04:40:55 +12:00
# Update views
2016-03-25 01:42:47 +13:00
for w in findWidgetsOfClass(outlineView):
w.hideColumns()
2016-02-07 00:34:22 +13:00
2015-06-21 20:44:11 +12:00
def treeViewSettignsChanged(self):
for item, what, value in [
(self.rdoTreeItemCount, "InfoFolder", "Count"),
(self.rdoTreeWC, "InfoFolder", "WC"),
(self.rdoTreeCC, "InfoFolder", "CC"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeProgress, "InfoFolder", "Progress"),
2016-02-10 05:52:25 +13:00
(self.rdoTreeSummary, "InfoFolder", "Summary"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeNothing, "InfoFolder", "Nothing"),
(self.rdoTreeTextWC, "InfoText", "WC"),
(self.rdoTreeTextCC, "InfoText", "CC"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeTextProgress, "InfoText", "Progress"),
2016-02-10 05:52:25 +13:00
(self.rdoTreeTextSummary, "InfoText", "Summary"),
2015-06-21 20:44:11 +12:00
(self.rdoTreeTextNothing, "InfoText", "Nothing"),
2016-02-07 00:34:22 +13:00
]:
2015-06-21 20:44:11 +12:00
if item.isChecked():
settings.viewSettings["Tree"][what] = value
2016-02-07 00:34:22 +13:00
2017-10-24 01:40:55 +13:00
iconSize = self.sldTreeIconSize.value()
if iconSize != settings.viewSettings["Tree"]["iconSize"]:
settings.viewSettings["Tree"]["iconSize"] = iconSize
self.mw.treeRedacOutline.setIconSize(QSize(iconSize, iconSize))
2015-06-21 20:44:11 +12:00
self.mw.treeRedacOutline.viewport().update()
2016-02-07 00:34:22 +13:00
def countSpacesChanged(self):
settings.countSpaces = True if self.chkCountSpaces.checkState() else False
self.mw.mainEditor.updateStats()
2015-06-18 06:45:24 +12:00
def setCorkColor(self):
color = QColor(settings.corkBackground["color"])
self.colorDialog = QColorDialog(color, self)
color = self.colorDialog.getColor(color)
2015-06-18 07:17:12 +12:00
if color.isValid():
settings.corkBackground["color"] = color.name()
self.updateCorkColor()
# Update Cork view
2015-06-30 00:33:30 +12:00
self.mw.mainEditor.updateCorkBackground()
2017-10-15 04:11:17 +13:00
def setCorkStyle(self):
settings.corkStyle = "new" if self.rdoCorkNewStyle.isChecked() else "old"
self.mw.mainEditor.updateCorkView()
2016-02-07 00:34:22 +13:00
2015-06-18 06:45:24 +12:00
def updateCorkColor(self):
self.btnCorkColor.setStyleSheet("background:{};".format(settings.corkBackground["color"]))
2016-02-07 00:34:22 +13:00
2015-06-18 06:45:24 +12:00
def setCorkBackground(self, i):
# Check if combobox was reset
if i == -1:
return
2015-06-18 06:45:24 +12:00
img = self.cmbCorkImage.itemData(i)
img = os.path.basename(img)
2015-06-18 06:45:24 +12:00
if img:
2015-06-19 01:03:16 +12:00
settings.corkBackground["image"] = img
2015-06-18 06:45:24 +12:00
else:
txt = self.cmbCorkImage.itemText(i)
if txt == "":
settings.corkBackground["image"] = ""
else:
img = self.addBackgroundImage()
if img:
self.populatesCmbBackgrounds(self.cmbCorkImage)
settings.corkBackground["image"] = img
self.setCorkImageDefault()
# Update Cork view
2015-06-30 00:33:30 +12:00
self.mw.mainEditor.updateCorkBackground()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def populatesCmbBackgrounds(self, cmb):
2016-02-07 00:34:22 +13:00
# self.cmbDelegate = cmbPixmapDelegate()
# self.cmbCorkImage.setItemDelegate(self.cmbDelegate)
paths = allPaths(os.path.join("resources", "backgrounds"))
2015-06-19 07:28:47 +12:00
cmb.clear()
cmb.addItem(QIcon.fromTheme("list-remove"), "", "")
2015-06-19 01:03:16 +12:00
for p in paths:
lst = os.listdir(p)
for l in lst:
if l.lower()[-4:] in [".jpg", ".png"] or \
2016-02-07 00:34:22 +13:00
l.lower()[-5:] in [".jpeg"]:
2015-06-19 01:03:16 +12:00
px = QPixmap(os.path.join(p, l)).scaled(128, 64, Qt.KeepAspectRatio)
2015-06-19 07:28:47 +12:00
cmb.addItem(QIcon(px), "", os.path.join(p, l))
2016-02-07 00:34:22 +13:00
cmb.addItem(QIcon.fromTheme("list-add"), " ", "")
2015-06-19 07:28:47 +12:00
cmb.setIconSize(QSize(128, 64))
2016-02-07 00:34:22 +13:00
def addBackgroundImage(self):
lastDirectory = self.mw.welcome.getLastAccessedDirectory()
"""File dialog that request an existing file. For opening an image."""
filename = QFileDialog.getOpenFileName(self,
self.tr("Open Image"),
lastDirectory,
self.tr("Image files (*.jpg; *.jpeg; *.png)"))[0]
if filename:
try:
px = QPixmap()
valid = px.load(filename)
del px
if valid:
shutil.copy(filename, writablePath(os.path.join("resources", "backgrounds")))
return os.path.basename(filename)
else:
QMessageBox.warning(self, self.tr("Error"),
self.tr("Unable to load selected file"))
except Exception as e:
QMessageBox.warning(self, self.tr("Error"),
self.tr("Unable to add selected image:\n{}").format(str(e)))
return None
2015-06-19 07:28:47 +12:00
def setCorkImageDefault(self):
2015-06-18 06:45:24 +12:00
if settings.corkBackground["image"] != "":
i = self.cmbCorkImage.findData(findBackground(settings.corkBackground["image"]))
2015-06-18 06:45:24 +12:00
if i != -1:
self.cmbCorkImage.setCurrentIndex(i)
2015-06-18 04:40:55 +12:00
2016-02-07 00:34:22 +13:00
####################################################################################################
# VIEWS / EDITOR
####################################################################################################
2015-06-26 03:06:07 +12:00
def updateEditorSettings(self):
"""
Stores settings for editor appearance.
"""
# Background
settings.textEditor["backgroundTransparent"] = True if self.chkEditorBackgroundTransparent.checkState() else False
# Font
2015-06-26 03:06:07 +12:00
f = self.cmbEditorFontFamily.currentFont()
f.setPointSize(self.spnEditorFontSize.value())
settings.textEditor["font"] = f.toString()
# Cursor
2017-10-18 21:44:05 +13:00
settings.textEditor["cursorWidth"] = \
1 if not self.chkEditorCursorWidth.isChecked() else \
self.spnEditorCursorWidth.value()
self.spnEditorCursorWidth.setEnabled(self.chkEditorCursorWidth.isChecked())
2017-11-28 22:26:43 +13:00
settings.textEditor["alwaysCenter"] = self.chkEditorTypeWriterMode.isChecked()
2017-12-06 11:18:32 +13:00
settings.textEditor["focusMode"] = \
False if self.cmbEditorFocusMode.currentIndex() == 0 else \
"sentence" if self.cmbEditorFocusMode.currentIndex() == 1 else \
"line" if self.cmbEditorFocusMode.currentIndex() == 2 else \
2017-12-06 11:18:32 +13:00
"paragraph"
# Text area
settings.textEditor["maxWidth"] = \
0 if not self.chkEditorMaxWidth.isChecked() else \
self.spnEditorMaxWidth.value()
self.spnEditorMaxWidth.setEnabled(self.chkEditorMaxWidth.isChecked())
settings.textEditor["marginsLR"] = self.spnEditorMarginsLR.value()
settings.textEditor["marginsTB"] = self.spnEditorMarginsTB.value()
# Paragraphs
settings.textEditor["textAlignment"] = self.cmbEditorAlignment.currentIndex()
2015-06-26 03:06:07 +12:00
settings.textEditor["lineSpacing"] = \
2016-02-07 00:34:22 +13:00
100 if self.cmbEditorLineSpacing.currentIndex() == 0 else \
150 if self.cmbEditorLineSpacing.currentIndex() == 1 else \
200 if self.cmbEditorLineSpacing.currentIndex() == 2 else \
2015-06-26 03:06:07 +12:00
self.spnEditorLineSpacing.value()
self.spnEditorLineSpacing.setEnabled(self.cmbEditorLineSpacing.currentIndex() == 3)
settings.textEditor["tabWidth"] = self.spnEditorTabWidth.value()
settings.textEditor["indent"] = True if self.chkEditorIndent.checkState() else False
settings.textEditor["spacingAbove"] = self.spnEditorParaAbove.value()
settings.textEditor["spacingBelow"] = self.spnEditorParaBelow.value()
2016-02-07 00:34:22 +13:00
self.timerUpdateWidgets.start()
2016-02-07 00:34:22 +13:00
def updateAllWidgets(self):
2015-06-26 03:06:07 +12:00
# Update font and defaultBlockFormat to all textEditView. Drastically.
for w in mainWindow().findChildren(textEditView, QRegExp(".*")):
w.loadFontSettings()
2016-02-07 00:34:22 +13:00
2016-04-12 01:14:24 +12:00
# Update background color in all tabSplitter (tabs)
for w in mainWindow().findChildren(tabSplitter, QRegExp(".*")):
w.updateStyleSheet()
# Update background color in all folder text view:
for w in mainWindow().findChildren(QWidget, QRegExp("editorWidgetFolderText")):
w.setStyleSheet("background: {};".format(settings.textEditor["background"]))
2016-04-12 01:14:24 +12:00
def setApplicationCursorBlinking(self):
settings.textEditor["cursorNotBlinking"] = self.chkEditorNoBlinking.isChecked()
if settings.textEditor["cursorNotBlinking"]:
qApp.setCursorFlashTime(0)
else:
# Load default system value, that we cached at startup
qApp.setCursorFlashTime(self.mw._defaultCursorFlashTime)
2015-06-26 03:06:07 +12:00
def choseEditorFontColor(self):
color = settings.textEditor["fontColor"]
self.colorDialog = QColorDialog(QColor(color), self)
color = self.colorDialog.getColor(QColor(color))
if color.isValid():
settings.textEditor["fontColor"] = color.name()
self.setButtonColor(self.btnEditorFontColor, color.name())
self.updateEditorSettings()
2015-06-26 03:06:07 +12:00
def choseEditorMisspelledColor(self):
color = settings.textEditor["misspelled"]
self.colorDialog = QColorDialog(QColor(color), self)
color = self.colorDialog.getColor(QColor(color))
if color.isValid():
settings.textEditor["misspelled"] = color.name()
self.setButtonColor(self.btnEditorMisspelledColor, color.name())
self.updateEditorSettings()
2016-02-07 00:34:22 +13:00
2015-07-02 00:51:43 +12:00
def choseEditorBackgroundColor(self):
color = settings.textEditor["background"]
self.colorDialog = QColorDialog(QColor(color), self)
color = self.colorDialog.getColor(QColor(color))
if color.isValid():
settings.textEditor["background"] = color.name()
self.setButtonColor(self.btnEditorBackgroundColor, color.name())
self.updateEditorSettings()
2015-06-26 03:06:07 +12:00
def restoreEditorColors(self):
settings.textEditor["background"] = S.base
self.setButtonColor(self.btnEditorBackgroundColor, S.base)
settings.textEditor["fontColor"] = S.text
self.setButtonColor(self.btnEditorFontColor, S.text)
self.updateEditorSettings()
2016-02-07 00:34:22 +13:00
####################################################################################################
# STATUS #
####################################################################################################
2015-06-18 04:40:55 +12:00
2015-06-11 01:57:44 +12:00
def addStatus(self):
self.mw.mdlStatus.appendRow(QStandardItem(self.tr("New status")))
2016-02-07 00:34:22 +13:00
2015-06-11 01:57:44 +12:00
def removeStatus(self):
for i in self.lstStatus.selectedIndexes():
self.mw.mdlStatus.removeRows(i.row(), 1)
2016-02-07 00:34:22 +13:00
####################################################################################################
# LABELS #
####################################################################################################
2015-06-18 06:45:24 +12:00
def updateLabelColor(self, index):
2016-02-07 00:34:22 +13:00
# px = QPixmap(64, 64)
# px.fill(iconColor(self.mw.mdlLabels.item(index.row()).icon()))
# self.btnLabelColor.setIcon(QIcon(px))
2017-11-21 10:24:47 +13:00
self.btnLabelColor.setStyleSheet("background:{};".format(
iconColor(self.mw.mdlLabels.item(index.row()).icon()).name()))
2015-06-18 06:45:24 +12:00
self.btnLabelColor.setEnabled(True)
2016-02-07 00:34:22 +13:00
def addLabel(self):
px = QPixmap(32, 32)
px.fill(Qt.transparent)
self.mw.mdlLabels.appendRow(QStandardItem(QIcon(px), self.tr("New label")))
2016-02-07 00:34:22 +13:00
def removeLabel(self):
for i in self.lstLabels.selectedIndexes():
self.mw.mdlLabels.removeRows(i.row(), 1)
2016-02-07 00:34:22 +13:00
def setLabelColor(self):
index = self.lstLabels.currentIndex()
color = iconColor(self.mw.mdlLabels.item(index.row()).icon())
self.colorDialog = QColorDialog(color, self)
color = self.colorDialog.getColor(color)
2015-06-18 07:17:12 +12:00
if color.isValid():
px = QPixmap(32, 32)
px.fill(color)
self.mw.mdlLabels.item(index.row()).setIcon(QIcon(px))
2015-06-19 07:28:47 +12:00
self.updateLabelColor(index)
2016-02-07 00:34:22 +13:00
####################################################################################################
# FULLSCREEN #
####################################################################################################
2015-06-19 07:28:47 +12:00
def themeSelected(self, current, previous):
if current:
2015-06-20 04:47:45 +12:00
# UI updates
2016-02-07 00:34:22 +13:00
self.btnThemeEdit.setEnabled(current.data(Qt.UserRole + 1))
self.btnThemeRemove.setEnabled(current.data(Qt.UserRole + 1))
2015-06-20 04:47:45 +12:00
# Save settings
theme = current.data(Qt.UserRole)
settings.fullScreenTheme = os.path.splitext(os.path.split(theme)[1])[0]
2015-06-19 07:28:47 +12:00
else:
2015-06-20 04:47:45 +12:00
# UI updates
2015-06-19 07:28:47 +12:00
self.btnThemeEdit.setEnabled(False)
self.btnThemeRemove.setEnabled(False)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def newTheme(self):
path = writablePath(os.path.join("resources", "themes"))
2015-06-19 07:28:47 +12:00
name = self.tr("newtheme")
if os.path.exists(os.path.join(path, "{}.theme".format(name))):
i = 1
while os.path.exists(os.path.join(path, "{}_{}.theme".format(name, i))):
i += 1
name = os.path.join(path, "{}_{}.theme".format(name, i))
else:
name = os.path.join(path, "{}.theme".format(name))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
settings = QSettings(name, QSettings.IniFormat)
settings.setValue("Name", self.tr("New theme"))
settings.sync()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
self.populatesThemesList()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def editTheme(self):
item = self.lstThemes.currentItem()
theme = item.data(Qt.UserRole)
self.loadTheme(theme)
self.themeStack.setCurrentIndex(1)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def removeTheme(self):
item = self.lstThemes.currentItem()
theme = item.data(Qt.UserRole)
os.remove(theme)
self.populatesThemesList()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def populatesThemesList(self):
paths = allPaths(os.path.join("resources", "themes"))
2015-06-20 04:47:45 +12:00
current = settings.fullScreenTheme
2015-06-19 07:28:47 +12:00
self.lstThemes.clear()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
for p in paths:
lst = [i for i in os.listdir(p) if os.path.splitext(i)[1] == ".theme"]
for t in lst:
theme = os.path.join(p, t)
editable = not appPath() in theme
n = getThemeName(theme)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
item = QListWidgetItem(n)
item.setData(Qt.UserRole, theme)
2016-02-07 00:34:22 +13:00
item.setData(Qt.UserRole + 1, editable)
item.setToolTip("{}{}".format(
n,
self.tr(" (read-only)") if not editable else ""))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
thumb = os.path.join(p, t.replace(".theme", ".jpg"))
px = QPixmap(200, 120)
px.fill(Qt.white)
if not os.path.exists(thumb):
currentScreen = qApp.desktop().screenNumber(self)
screenRect = qApp.desktop().screenGeometry(currentScreen)
thumb = createThemePreview(theme, screenRect)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
icon = QPixmap(thumb).scaled(200, 120, Qt.KeepAspectRatio)
painter = QPainter(px)
2016-02-07 00:34:22 +13:00
painter.drawPixmap(px.rect().center() - icon.rect().center(), icon)
2015-06-19 07:28:47 +12:00
painter.end()
item.setIcon(QIcon(px))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
self.lstThemes.addItem(item)
2016-02-07 00:34:22 +13:00
2015-06-20 04:47:45 +12:00
if current and current in t:
self.lstThemes.setCurrentItem(item)
current = None
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
self.lstThemes.setIconSize(QSize(200, 120))
2016-02-07 00:34:22 +13:00
2015-06-20 04:47:45 +12:00
if current: # the theme from settings wasn't found
2016-02-07 00:34:22 +13:00
# select the last from the list
2015-06-20 04:47:45 +12:00
self.lstThemes.setCurrentRow(self.lstThemes.count() - 1)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def loadTheme(self, theme):
self._editingTheme = theme
self._loadingTheme = True # So we don't generate preview while loading
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Load datas
self._themeData = loadThemeDatas(theme)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Window Background
self.btnThemWindowBackgroundColor.clicked.connect(lambda: self.getThemeColor("Background/Color"))
try:
self.cmbThemeBackgroundImage.disconnect()
except:
pass
self.populatesCmbBackgrounds(self.cmbThemeBackgroundImage)
self.cmbThemeBackgroundImage.currentIndexChanged.connect(self.updateThemeBackground)
self.cmbThemBackgroundType.currentIndexChanged.connect(lambda i: self.setSetting("Background/Type", i))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Text Background
self.btnThemeTextBackgroundColor.clicked.connect(lambda: self.getThemeColor("Foreground/Color"))
self.spnThemeTextBackgroundOpacity.valueChanged.connect(lambda v: self.setSetting("Foreground/Opacity", v))
self.spnThemeTextMargins.valueChanged.connect(lambda v: self.setSetting("Foreground/Margin", v))
self.spnThemeTextPadding.valueChanged.connect(lambda v: self.setSetting("Foreground/Padding", v))
self.cmbThemeTextPosition.currentIndexChanged.connect(lambda i: self.setSetting("Foreground/Position", i))
self.spnThemeTextRadius.valueChanged.connect(lambda v: self.setSetting("Foreground/Rounding", v))
self.spnThemeTextWidth.valueChanged.connect(lambda v: self.setSetting("Foreground/Width", v))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Text Options
self.btnThemeTextColor.clicked.connect(lambda: self.getThemeColor("Text/Color"))
self.cmbThemeFont.currentFontChanged.connect(self.updateThemeFont)
try:
self.cmbThemeFontSize.currentIndexChanged.disconnect(self.updateThemeFont)
except:
pass
self.populatesFontSize()
self.cmbThemeFontSize.currentIndexChanged.connect(self.updateThemeFont)
self.btnThemeMisspelledColor.clicked.connect(lambda: self.getThemeColor("Text/Misspelled"))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Paragraph Options
self.chkThemeIndent.stateChanged.connect(lambda v: self.setSetting("Spacings/IndentFirstLine", v != 0))
self.cmbThemeAlignment.currentIndexChanged.connect(lambda i: self.setSetting("Spacings/Alignment", i))
2015-06-19 07:28:47 +12:00
self.cmbThemeLineSpacing.currentIndexChanged.connect(self.updateLineSpacing)
self.cmbThemeLineSpacing.currentIndexChanged.connect(self.updateLineSpacing)
self.spnThemeLineSpacing.valueChanged.connect(lambda v: self.setSetting("Spacings/LineSpacing", v))
self.spnThemeParaAbove.valueChanged.connect(lambda v: self.setSetting("Spacings/ParagraphAbove", v))
self.spnThemeParaBelow.valueChanged.connect(lambda v: self.setSetting("Spacings/ParagraphBelow", v))
self.spnThemeTabWidth.valueChanged.connect(lambda v: self.setSetting("Spacings/TabWidth", v))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Update UI
self.updateUIFromTheme()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Generate preview
self._loadingTheme = False
self.updatePreview()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def setSetting(self, key, val):
self._themeData[key] = val
self.timerUpdateFSPreview.start()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def updateUIFromTheme(self):
self.txtThemeName.setText(self._themeData["Name"])
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Window Background
self.setButtonColor(self.btnThemWindowBackgroundColor, self._themeData["Background/Color"])
i = self.cmbThemeBackgroundImage.findData(self._themeData["Background/ImageFile"], flags=Qt.MatchContains)
if i != -1:
self.cmbThemeBackgroundImage.setCurrentIndex(i)
self.cmbThemBackgroundType.setCurrentIndex(self._themeData["Background/Type"])
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Text background
self.setButtonColor(self.btnThemeTextBackgroundColor, self._themeData["Foreground/Color"])
self.spnThemeTextBackgroundOpacity.setValue(self._themeData["Foreground/Opacity"])
self.spnThemeTextMargins.setValue(self._themeData["Foreground/Margin"])
self.spnThemeTextPadding.setValue(self._themeData["Foreground/Padding"])
self.cmbThemeTextPosition.setCurrentIndex(self._themeData["Foreground/Position"])
self.spnThemeTextRadius.setValue(self._themeData["Foreground/Rounding"])
self.spnThemeTextWidth.setValue(self._themeData["Foreground/Width"])
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Text Options
self.setButtonColor(self.btnThemeTextColor, self._themeData["Text/Color"])
f = QFont()
f.fromString(self._themeData["Text/Font"])
self.cmbThemeFont.setCurrentFont(f)
i = self.cmbThemeFontSize.findText(str(f.pointSize()))
if i != -1:
self.cmbThemeFontSize.setCurrentIndex(i)
else:
self.cmbThemeFontSize.addItem(str(f.pointSize()))
2016-02-07 00:34:22 +13:00
self.cmbThemeFontSize.setCurrentIndex(self.cmbThemeFontSize.count() - 1)
2015-06-19 07:28:47 +12:00
self.setButtonColor(self.btnThemeMisspelledColor, self._themeData["Text/Misspelled"])
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
# Paragraph Options
self.chkThemeIndent.setCheckState(Qt.Checked if self._themeData["Spacings/IndentFirstLine"] else Qt.Unchecked)
2015-06-19 07:28:47 +12:00
self.spnThemeLineSpacing.setEnabled(False)
self.cmbThemeAlignment.setCurrentIndex(self._themeData["Spacings/Alignment"])
2015-06-19 07:28:47 +12:00
if self._themeData["Spacings/LineSpacing"] == 100:
self.cmbThemeLineSpacing.setCurrentIndex(0)
elif self._themeData["Spacings/LineSpacing"] == 150:
self.cmbThemeLineSpacing.setCurrentIndex(1)
elif self._themeData["Spacings/LineSpacing"] == 200:
self.cmbThemeLineSpacing.setCurrentIndex(2)
else:
self.cmbThemeLineSpacing.setCurrentIndex(3)
self.spnThemeLineSpacing.setEnabled(True)
self.spnThemeLineSpacing.setValue(self._themeData["Spacings/LineSpacing"])
self.spnThemeParaAbove.setValue(self._themeData["Spacings/ParagraphAbove"])
self.spnThemeParaBelow.setValue(self._themeData["Spacings/ParagraphBelow"])
self.spnThemeTabWidth.setValue(self._themeData["Spacings/TabWidth"])
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def populatesFontSize(self):
self.cmbThemeFontSize.clear()
2016-02-07 00:34:22 +13:00
s = list(range(6, 13)) + list(range(14, 29, 2)) + [36, 48, 72]
2015-06-19 07:28:47 +12:00
for i in s:
self.cmbThemeFontSize.addItem(str(i))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def updateThemeFont(self, v):
f = self.cmbThemeFont.currentFont()
s = self.cmbThemeFontSize.itemText(self.cmbThemeFontSize.currentIndex())
if s:
f.setPointSize(int(s))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
self._themeData["Text/Font"] = f.toString()
self.timerUpdateFSPreview.start()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def updateLineSpacing(self, i):
if i == 0:
self._themeData["Spacings/LineSpacing"] = 100
elif i == 1:
self._themeData["Spacings/LineSpacing"] = 150
elif i == 2:
self._themeData["Spacings/LineSpacing"] = 200
elif i == 3:
self._themeData["Spacings/LineSpacing"] = self.spnThemeLineSpacing.value()
self.spnThemeLineSpacing.setEnabled(i == 3)
self.timerUpdateFSPreview.start()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def updateThemeBackground(self, i):
# Check if combobox was reset
if i == -1:
return
img = self.cmbThemeBackgroundImage.itemData(i)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
if img:
self._themeData["Background/ImageFile"] = os.path.split(img)[1]
else:
txt = self.cmbThemeBackgroundImage.itemText(i)
if txt == "":
self._themeData["Background/ImageFile"] = ""
else:
img = self.addBackgroundImage()
if img:
self.populatesCmbBackgrounds(self.cmbThemeBackgroundImage)
self._themeData["Background/ImageFile"] = img
i = self.cmbThemeBackgroundImage.findData(self._themeData["Background/ImageFile"], flags=Qt.MatchContains)
if i != -1:
self.cmbThemeBackgroundImage.setCurrentIndex(i)
2015-06-19 07:28:47 +12:00
self.updatePreview()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def getThemeColor(self, key):
color = self._themeData[key]
self.colorDialog = QColorDialog(QColor(color), self)
color = self.colorDialog.getColor(QColor(color))
if color.isValid():
self._themeData[key] = color.name()
self.updateUIFromTheme()
self.updatePreview()
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def updatePreview(self):
if self._loadingTheme:
return
2016-02-07 00:34:22 +13:00
currentScreen = qApp.desktop().screenNumber(self)
screen = qApp.desktop().screenGeometry(currentScreen)
2016-02-07 00:34:22 +13:00
px = createThemePreview(self._themeData, screen, self.lblPreview.size())
self.lblPreview.setPixmap(px)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def setButtonColor(self, btn, color):
btn.setStyleSheet("background:{};".format(color))
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def saveTheme(self):
settings = QSettings(self._editingTheme, QSettings.IniFormat)
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
self._themeData["Name"] = self.txtThemeName.text()
for key in self._themeData:
settings.setValue(key, self._themeData[key])
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
settings.sync()
self.populatesThemesList()
self.themeStack.setCurrentIndex(0)
self._editingTheme = None
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def cancelEdit(self):
self.themeStack.setCurrentIndex(0)
self._editingTheme = None
2016-02-07 00:34:22 +13:00
2015-06-19 07:28:47 +12:00
def resizeEvent(self, event):
QWidget.resizeEvent(self, event)
if self._editingTheme:
2016-02-07 00:34:22 +13:00
self.updatePreview()