From 4e74da41d1876e8ab3f56ad9ca221a43921c487c Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Tue, 17 Oct 2017 13:05:46 +0200 Subject: [PATCH] Working on: Request: Justified formatting of text #148 --- manuskript/settings.py | 4 + manuskript/settingsWindow.py | 5 + manuskript/ui/editors/basicHighlighter.py | 1 - manuskript/ui/editors/themes.py | 5 + manuskript/ui/settings_ui.py | 68 +++++++++-- manuskript/ui/settings_ui.ui | 134 +++++++++++++++++++--- manuskript/ui/views/textEditView.py | 4 + 7 files changed, 195 insertions(+), 26 deletions(-) diff --git a/manuskript/settings.py b/manuskript/settings.py index 19eef66c..b8b6cffc 100644 --- a/manuskript/settings.py +++ b/manuskript/settings.py @@ -66,6 +66,7 @@ textEditor = { "indent": True, "spacingAbove": 5, "spacingBelow": 5, + "textAlignement": 0, # 0: left, 1: center, 2: right, 3: justify } revisions = { @@ -233,6 +234,9 @@ def load(string, fromString=False, protocol=None): if "textEditor" in allSettings: global textEditor textEditor = allSettings["textEditor"] + + if not "textAlignment" in textEditor: # Added in 0.5.0 + textEditor["textAlignment"] = 0 if "revisions" in allSettings: global revisions diff --git a/manuskript/settingsWindow.py b/manuskript/settingsWindow.py index 5953c6ae..502c563c 100644 --- a/manuskript/settingsWindow.py +++ b/manuskript/settingsWindow.py @@ -161,6 +161,8 @@ class settingsWindow(QWidget, Ui_Settings): self.cmbEditorFontFamily.currentFontChanged.connect(self.updateEditorSettings) self.spnEditorFontSize.setValue(f.pointSize()) self.spnEditorFontSize.valueChanged.connect(self.updateEditorSettings) + 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 @@ -403,6 +405,7 @@ class settingsWindow(QWidget, Ui_Settings): f = self.cmbEditorFontFamily.currentFont() f.setPointSize(self.spnEditorFontSize.value()) settings.textEditor["font"] = f.toString() + settings.textEditor["textAlignment"] = self.cmbEditorAlignment.currentIndex() settings.textEditor["lineSpacing"] = \ 100 if self.cmbEditorLineSpacing.currentIndex() == 0 else \ 150 if self.cmbEditorLineSpacing.currentIndex() == 1 else \ @@ -623,6 +626,7 @@ class settingsWindow(QWidget, Ui_Settings): # 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)) self.cmbThemeLineSpacing.currentIndexChanged.connect(self.updateLineSpacing) self.cmbThemeLineSpacing.currentIndexChanged.connect(self.updateLineSpacing) self.spnThemeLineSpacing.valueChanged.connect(lambda v: self.setSetting("Spacings/LineSpacing", v)) @@ -676,6 +680,7 @@ class settingsWindow(QWidget, Ui_Settings): # Paragraph Options self.chkThemeIndent.setCheckState(Qt.Checked if self._themeData["Spacings/IndentFirstLine"] else Qt.Unchecked) self.spnThemeLineSpacing.setEnabled(False) + self.cmbThemeAlignment.setCurrentIndex(self._themeData["Spacings/Alignment"]) if self._themeData["Spacings/LineSpacing"] == 100: self.cmbThemeLineSpacing.setCurrentIndex(0) elif self._themeData["Spacings/LineSpacing"] == 150: diff --git a/manuskript/ui/editors/basicHighlighter.py b/manuskript/ui/editors/basicHighlighter.py index b1fb2a22..1e5b6a83 100644 --- a/manuskript/ui/editors/basicHighlighter.py +++ b/manuskript/ui/editors/basicHighlighter.py @@ -46,7 +46,6 @@ class basicHighlighter(QSyntaxHighlighter): c = QTextCursor(self.currentBlock()) #c.joinPreviousEditBlock() bf = QTextBlockFormat(self._defaultBlockFormat) - bf.setAlignment(c.blockFormat().alignment()) if bf != c.blockFormat(): c.setBlockFormat(bf) #c.endEditBlock() diff --git a/manuskript/ui/editors/themes.py b/manuskript/ui/editors/themes.py index f81c71c0..145742e4 100644 --- a/manuskript/ui/editors/themes.py +++ b/manuskript/ui/editors/themes.py @@ -40,6 +40,7 @@ def loadThemeDatas(themeFile): loadThemeSetting(_themeData, settings, "Text/Misspelled", "#ff0000") # Paragraph Options + loadThemeSetting(_themeData, settings, "Spacings/Alignment", 0) loadThemeSetting(_themeData, settings, "Spacings/IndentFirstLine", False) loadThemeSetting(_themeData, settings, "Spacings/LineSpacing", 100) loadThemeSetting(_themeData, settings, "Spacings/ParagraphAbove", 0) @@ -178,6 +179,10 @@ def themeEditorGeometry(themeDatas, textRect): def getThemeBlockFormat(themeDatas): bf = QTextBlockFormat() + bf.setAlignment(Qt.AlignLeft if themeDatas["Spacings/Alignment"] == 0 else + Qt.AlignCenter if themeDatas["Spacings/Alignment"] == 1 else + Qt.AlignRight if themeDatas["Spacings/Alignment"] == 2 else + Qt.AlignJustify) bf.setLineHeight(themeDatas["Spacings/LineSpacing"], QTextBlockFormat.ProportionalHeight) bf.setTextIndent(themeDatas["Spacings/TabWidth"] * 1 if themeDatas["Spacings/IndentFirstLine"] else 0) bf.setTopMargin(themeDatas["Spacings/ParagraphAbove"]) diff --git a/manuskript/ui/settings_ui.py b/manuskript/ui/settings_ui.py index 10903dc8..d32d119e 100644 --- a/manuskript/ui/settings_ui.py +++ b/manuskript/ui/settings_ui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'manuskript/ui/settings_ui.ui' # -# Created: Sun Oct 15 22:18:32 2017 +# Created: Tue Oct 17 12:19:44 2017 # by: PyQt5 UI code generator 5.2.1 # # WARNING! All changes made in this file will be lost! @@ -1049,7 +1049,7 @@ class Ui_Settings(object): font.setWeight(50) self.label_40.setFont(font) self.label_40.setObjectName("label_40") - self.formLayout_9.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_40) + self.formLayout_9.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_40) self.cmbEditorLineSpacing = QtWidgets.QComboBox(self.groupBox_13) font = QtGui.QFont() font.setBold(False) @@ -1060,7 +1060,7 @@ class Ui_Settings(object): self.cmbEditorLineSpacing.addItem("") self.cmbEditorLineSpacing.addItem("") self.cmbEditorLineSpacing.addItem("") - self.formLayout_9.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbEditorLineSpacing) + self.formLayout_9.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.cmbEditorLineSpacing) self.spnEditorLineSpacing = QtWidgets.QSpinBox(self.groupBox_13) self.spnEditorLineSpacing.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) @@ -1076,14 +1076,14 @@ class Ui_Settings(object): self.spnEditorLineSpacing.setMaximum(999) self.spnEditorLineSpacing.setProperty("value", 100) self.spnEditorLineSpacing.setObjectName("spnEditorLineSpacing") - self.formLayout_9.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.spnEditorLineSpacing) + self.formLayout_9.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.spnEditorLineSpacing) self.label_42 = QtWidgets.QLabel(self.groupBox_13) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.label_42.setFont(font) self.label_42.setObjectName("label_42") - self.formLayout_9.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_42) + self.formLayout_9.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_42) self.spnEditorTabWidth = QtWidgets.QSpinBox(self.groupBox_13) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -1098,7 +1098,7 @@ class Ui_Settings(object): self.spnEditorTabWidth.setMaximum(199) self.spnEditorTabWidth.setProperty("value", 20) self.spnEditorTabWidth.setObjectName("spnEditorTabWidth") - self.formLayout_9.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.spnEditorTabWidth) + self.formLayout_9.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.spnEditorTabWidth) self.chkEditorIndent = QtWidgets.QCheckBox(self.groupBox_13) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -1110,14 +1110,14 @@ class Ui_Settings(object): font.setWeight(50) self.chkEditorIndent.setFont(font) self.chkEditorIndent.setObjectName("chkEditorIndent") - self.formLayout_9.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.chkEditorIndent) + self.formLayout_9.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.chkEditorIndent) self.label_41 = QtWidgets.QLabel(self.groupBox_13) font = QtGui.QFont() font.setBold(False) font.setWeight(50) self.label_41.setFont(font) self.label_41.setObjectName("label_41") - self.formLayout_9.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_41) + self.formLayout_9.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_41) self.spnEditorParaAbove = QtWidgets.QSpinBox(self.groupBox_13) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -1132,7 +1132,7 @@ class Ui_Settings(object): self.spnEditorParaAbove.setMaximum(199) self.spnEditorParaAbove.setProperty("value", 5) self.spnEditorParaAbove.setObjectName("spnEditorParaAbove") - self.formLayout_9.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.spnEditorParaAbove) + self.formLayout_9.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.spnEditorParaAbove) self.spnEditorParaBelow = QtWidgets.QSpinBox(self.groupBox_13) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -1147,7 +1147,29 @@ class Ui_Settings(object): self.spnEditorParaBelow.setMaximum(199) self.spnEditorParaBelow.setProperty("value", 5) self.spnEditorParaBelow.setObjectName("spnEditorParaBelow") - self.formLayout_9.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.spnEditorParaBelow) + self.formLayout_9.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.spnEditorParaBelow) + self.label_35 = QtWidgets.QLabel(self.groupBox_13) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_35.setFont(font) + self.label_35.setObjectName("label_35") + self.formLayout_9.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_35) + self.cmbEditorAlignment = QtWidgets.QComboBox(self.groupBox_13) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.cmbEditorAlignment.setFont(font) + self.cmbEditorAlignment.setObjectName("cmbEditorAlignment") + icon = QtGui.QIcon.fromTheme("format-justify-left") + self.cmbEditorAlignment.addItem(icon, "") + icon = QtGui.QIcon.fromTheme("format-justify-center") + self.cmbEditorAlignment.addItem(icon, "") + icon = QtGui.QIcon.fromTheme("format-justify-right") + self.cmbEditorAlignment.addItem(icon, "") + icon = QtGui.QIcon.fromTheme("format-justify-fill") + self.cmbEditorAlignment.addItem(icon, "") + self.formLayout_9.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbEditorAlignment) self.horizontalLayout_11.addWidget(self.groupBox_13) icon = QtGui.QIcon.fromTheme("view-text") self.tabViews.addTab(self.tab_4, icon, "") @@ -1619,6 +1641,20 @@ class Ui_Settings(object): self.chkThemeIndent.setSizePolicy(sizePolicy) self.chkThemeIndent.setObjectName("chkThemeIndent") self.formLayout_6.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.chkThemeIndent) + self.cmbThemeAlignment = QtWidgets.QComboBox(self.stackedWidgetPage3_2) + self.cmbThemeAlignment.setObjectName("cmbThemeAlignment") + icon = QtGui.QIcon.fromTheme("format-justify-left") + self.cmbThemeAlignment.addItem(icon, "") + icon = QtGui.QIcon.fromTheme("format-justify-center") + self.cmbThemeAlignment.addItem(icon, "") + icon = QtGui.QIcon.fromTheme("format-justify-right") + self.cmbThemeAlignment.addItem(icon, "") + icon = QtGui.QIcon.fromTheme("format-justify-fill") + self.cmbThemeAlignment.addItem(icon, "") + self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbThemeAlignment) + self.label_53 = QtWidgets.QLabel(self.stackedWidgetPage3_2) + self.label_53.setObjectName("label_53") + self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_53) self.themeEditStack.addWidget(self.stackedWidgetPage3_2) self.verticalLayout_14.addWidget(self.themeEditStack) self.lblPreview = QtWidgets.QLabel(self.splitter) @@ -1640,7 +1676,7 @@ class Ui_Settings(object): self.stack.setCurrentIndex(2) self.tabViews.setCurrentIndex(3) self.themeStack.setCurrentIndex(1) - self.themeEditStack.setCurrentIndex(0) + self.themeEditStack.setCurrentIndex(3) self.lstMenu.currentRowChanged['int'].connect(self.stack.setCurrentIndex) self.chkRevisionsKeep.toggled['bool'].connect(self.chkRevisionRemove.setEnabled) QtCore.QMetaObject.connectSlotsByName(Settings) @@ -1808,6 +1844,11 @@ class Ui_Settings(object): self.label_41.setText(_translate("Settings", "Spacing:")) self.spnEditorParaAbove.setSuffix(_translate("Settings", " px")) self.spnEditorParaBelow.setSuffix(_translate("Settings", " px")) + self.label_35.setText(_translate("Settings", "Alignment:")) + self.cmbEditorAlignment.setItemText(0, _translate("Settings", "Left")) + self.cmbEditorAlignment.setItemText(1, _translate("Settings", "Center")) + self.cmbEditorAlignment.setItemText(2, _translate("Settings", "Right")) + self.cmbEditorAlignment.setItemText(3, _translate("Settings", "Justify")) self.tabViews.setTabText(self.tabViews.indexOf(self.tab_4), _translate("Settings", "Text editor")) self.lblTitleLabels.setText(_translate("Settings", "Labels")) self.btnLabelColor.setShortcut(_translate("Settings", "Ctrl+S")) @@ -1864,4 +1905,9 @@ class Ui_Settings(object): self.spnThemeParaAbove.setSuffix(_translate("Settings", " px")) self.spnThemeParaBelow.setSuffix(_translate("Settings", " px")) self.chkThemeIndent.setText(_translate("Settings", "Indent 1st line")) + self.cmbThemeAlignment.setItemText(0, _translate("Settings", "Left")) + self.cmbThemeAlignment.setItemText(1, _translate("Settings", "Center")) + self.cmbThemeAlignment.setItemText(2, _translate("Settings", "Right")) + self.cmbThemeAlignment.setItemText(3, _translate("Settings", "Justify")) + self.label_53.setText(_translate("Settings", "Alignment")) diff --git a/manuskript/ui/settings_ui.ui b/manuskript/ui/settings_ui.ui index 052ca463..cf12d3fb 100644 --- a/manuskript/ui/settings_ui.ui +++ b/manuskript/ui/settings_ui.ui @@ -796,7 +796,9 @@ text-align:center; - + + + Tree @@ -1172,7 +1174,9 @@ text-align:center; - + + + Outline @@ -1518,7 +1522,9 @@ text-align:center; - + + + Index cards @@ -1919,7 +1925,9 @@ text-align:center; - + + + Text editor @@ -2115,7 +2123,7 @@ text-align:center; Paragraphs - + @@ -2128,7 +2136,7 @@ text-align:center; - + @@ -2158,7 +2166,7 @@ text-align:center; - + false @@ -2189,7 +2197,7 @@ text-align:center; - + @@ -2202,7 +2210,7 @@ text-align:center; - + @@ -2230,7 +2238,7 @@ text-align:center; - + @@ -2249,7 +2257,7 @@ text-align:center; - + @@ -2262,7 +2270,7 @@ text-align:center; - + @@ -2290,7 +2298,7 @@ text-align:center; - + @@ -2318,6 +2326,61 @@ text-align:center; + + + + + 50 + false + + + + Alignment: + + + + + + + + 50 + false + + + + + Left + + + + + + + + Center + + + + + + + + Right + + + + + + + + Justify + + + + + + + @@ -2780,7 +2843,7 @@ text-align:center; - 0 + 3 @@ -3292,6 +3355,49 @@ text-align:center; + + + + + Left + + + + + + + + Center + + + + + + + + Right + + + + + + + + Justify + + + + + + + + + + + Alignment + + + diff --git a/manuskript/ui/views/textEditView.py b/manuskript/ui/views/textEditView.py index e641da99..05f16f30 100644 --- a/manuskript/ui/views/textEditView.py +++ b/manuskript/ui/views/textEditView.py @@ -203,6 +203,10 @@ class textEditView(QTextEdit): bf.setTextIndent(opt["tabWidth"] * 1 if opt["indent"] else 0) bf.setTopMargin(opt["spacingAbove"]) bf.setBottomMargin(opt["spacingBelow"]) + bf.setAlignment(Qt.AlignLeft if opt["textAlignment"] == 0 else + Qt.AlignCenter if opt["textAlignment"] == 1 else + Qt.AlignRight if opt["textAlignment"] == 2 else + Qt.AlignJustify) self._defaultCharFormat = cf self._defaultBlockFormat = bf