From 16585c4a2af962e4fac0ea26e8bec37b0a1b90bb Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Thu, 7 Apr 2016 12:18:20 +0200 Subject: [PATCH] Basic plainText exporter working (preview only) --- i18n/manuskript.pro | 9 + makefile | 2 +- manuskript/exporter/basic.py | 22 +- manuskript/exporter/manuskript/plainText.py | 120 +++-- manuskript/ui/exporters/__init__.py | 0 manuskript/ui/exporters/exporter.py | 6 +- manuskript/ui/exporters/exporterSettings.py | 211 --------- .../ui/exporters/manuskript/__init__.py | 0 .../exporters/manuskript/plainTextSettings.py | 422 ++++++++++++++++++ .../plainTextSettings_ui.py} | 148 +++--- .../plainTextSettings_ui.ui} | 143 ++++-- 11 files changed, 748 insertions(+), 335 deletions(-) create mode 100644 manuskript/ui/exporters/__init__.py delete mode 100644 manuskript/ui/exporters/exporterSettings.py create mode 100644 manuskript/ui/exporters/manuskript/__init__.py create mode 100644 manuskript/ui/exporters/manuskript/plainTextSettings.py rename manuskript/ui/exporters/{exporterSettings_ui.py => manuskript/plainTextSettings_ui.py} (82%) rename manuskript/ui/exporters/{exporterSettings_ui.ui => manuskript/plainTextSettings_ui.ui} (90%) diff --git a/i18n/manuskript.pro b/i18n/manuskript.pro index 833c926..b4fde4b 100644 --- a/i18n/manuskript.pro +++ b/i18n/manuskript.pro @@ -19,6 +19,10 @@ FORMS += ../manuskript/ui/views/basicItemView_ui.ui FORMS += ../manuskript/ui/views/sldImportance_ui.ui FORMS += ../manuskript/ui/views/storylineView_ui.ui +FORMS += ../manuskript/ui/exporters/exporter_ui.ui +FORMS += ../manuskript/ui/exporters/exportersManager_ui.ui +FORMS += ../manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui + SOURCES += ../manuskript/exporter/__init__.py SOURCES += ../manuskript/load_save/version_0.py @@ -59,6 +63,11 @@ SOURCES += ../manuskript/ui/views/textEditCompleter.py SOURCES += ../manuskript/ui/views/textEditView.py SOURCES += ../manuskript/ui/views/treeView.py SOURCES += ../manuskript/ui/welcome.py +SOURCES += ../manuskript/ui/exporters/exporter.py +SOURCES += ../manuskript/ui/exporters/exportersManager.py +SOURCES += ../manuskript/ui/exporters/manuskript/plainTextSettings.py + + TRANSLATIONS += manuskript_fr.ts TRANSLATIONS += manuskript_es.ts diff --git a/makefile b/makefile index b79b732..6f30490 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -UI := $(wildcard manuskript/ui/*.ui) $(wildcard manuskript/ui/*/*.ui) $(wildcard manuskript/ui/*.qrc) +UI := $(wildcard manuskript/ui/*.ui) $(wildcard manuskript/ui/*/*.ui) $(wildcard manuskript/ui/*/*/*.ui) $(wildcard manuskript/ui/*.qrc) UIs= $(UI:.ui=.py) $(UI:.qrc=_rc.py) TS := $(wildcard i18n/*.ts) QMs= $(TS:.ts=.qm) diff --git a/manuskript/exporter/basic.py b/manuskript/exporter/basic.py index 7798f6f..18946c5 100644 --- a/manuskript/exporter/basic.py +++ b/manuskript/exporter/basic.py @@ -81,4 +81,24 @@ class basicFormat: @classmethod def preview(cls, settingsWidget, previewWidget): - pass \ No newline at end of file + pass + + @classmethod + def shortcodes(cls): + return [ + ("\n", "\\n") + ] + + @classmethod + def escapes(cls, text): + for A, B in cls.shortcodes(): + text = text.replace(A, B) + return text + + @classmethod + def descapes(cls, text): + """How do we call that?""" + for A, B in cls.shortcodes(): + text = text.replace(B, A) + return text + diff --git a/manuskript/exporter/manuskript/plainText.py b/manuskript/exporter/manuskript/plainText.py index f78aeb1..a5ea591 100644 --- a/manuskript/exporter/manuskript/plainText.py +++ b/manuskript/exporter/manuskript/plainText.py @@ -1,11 +1,13 @@ #!/usr/bin/env python # --!-- coding: utf8 --!-- +import re +from PyQt5.QtGui import QFont, QTextCharFormat from PyQt5.QtWidgets import QPlainTextEdit -from manuskript.exporter.basic import basicExporter, basicFormat +from manuskript.exporter.basic import basicFormat from manuskript.functions import mainWindow from manuskript.models.outlineModel import outlineItem -from manuskript.ui.exporters.exporterSettings import exporterSettings +from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings class plainText(basicFormat): @@ -20,7 +22,7 @@ class plainText(basicFormat): @classmethod def settingsWidget(cls): - w = exporterSettings() + w = exporterSettings(cls) return w @classmethod @@ -31,27 +33,50 @@ class plainText(basicFormat): @classmethod def preview(cls, settingsWidget, previewWidget): - previewWidget.setPlainText(cls.concatenate(mainWindow().mdlOutline.rootItem)) + settings = settingsWidget.getSettings() + print(settings) + + r = cls.concatenate(mainWindow().mdlOutline.rootItem, settings) + + # Set preview font + cf = QTextCharFormat() + f = QFont() + f.fromString(settings["Preview"]["PreviewFont"]) + cf.setFont(f) + previewWidget.setCurrentCharFormat(cf) + + previewWidget.setPlainText(r) @classmethod - def concatenate(cls, item: outlineItem, - processTitle=lambda x: x + "\n", - processText=lambda x: x + "\n", - processContent=lambda x: x + "\n", - textSep="", folderSep="", textFolderSep="", folderTextSep="") -> str: - + def concatenate(cls, item: outlineItem, settings, + processTitle=lambda x: x + "\n") -> str: + s = settings r = "" - if not item.compile(): + # Do we include item + if not item.compile() or s["Content"]["IgnoreCompile"]: return "" - if item.level() >= 0: # item is not root + # What do we include + l = item.level() + if l >= 0: # item is not root - # Adds item title - r += processTitle(item.title()) + if item.isFolder(): + if not s["Content"]["More"] and s["Content"]["FolderTitle"] or\ + s["Content"]["More"] and s["Content"]["FolderTitle"][l]: - # Adds item text - r += processText(item.text()) + r += processTitle(item.title()) + + elif item.isText(): + if not s["Content"]["More"] and s["Content"]["TextTitle"] or \ + s["Content"]["More"] and s["Content"]["TextTitle"][l]: + + r += processTitle(item.title()) + + if not s["Content"]["More"] and s["Content"]["TextText"] or \ + s["Content"]["More"] and s["Content"]["TextText"][l]: + + r += cls.processText(item.text(), settings) content = "" @@ -63,18 +88,61 @@ class plainText(basicFormat): if last: # Between folder if last == c.type() == "folder": - content += folderSep - elif last == c.type() == "md": - content += textSep - elif last == "folder" and c.type() == "md": - content += folderTextSep - elif last == "md" and c.type() == "folder": - content += textFolderSep + content += s["Separator"]["FF"] - content += cls.concatenate(c) + elif last == c.type() == "md": + content += s["Separator"]["TT"] + + elif last == "folder" and c.type() == "md": + content += s["Separator"]["FT"] + + elif last == "md" and c.type() == "folder": + content += s["Separator"]["TF"] + + content += cls.concatenate(c, settings, processTitle) last = c.type() - r += processContent(content) + # r += cls.processContent(content, settings) + r += content + + return r + + @classmethod + def processText(cls, content, settings): + s = settings["Transform"] + + if s["Dash"]: + content = content.replace("---", "—") + + if s["Ellipse"]: + content = content.replace("...", "…") + + if s["Spaces"]: + o = "" + while o != content: + o = content + content = content.replace(" ", " ") + + if s["DoubleQuotes"]: + q = s["DoubleQuotes"].split("___") + s["Custom"].append([True, '"(.*?)"', "{}\\1{}".format(q[0], q[1]), True]) + + if s["SingleQuote"]: + q = s["SingleQuote"].split("___") + s["Custom"].append([True, "'(.*?)'", "{}\\1{}".format(q[0], q[1]), True]) + + for enabled, A, B, reg in s["Custom"]: + if not enabled: + continue + + if not reg: + content = content.replace(A, B) + + else: + content = re.sub(A, B, content) + + content += "\n" + + return content - return r \ No newline at end of file diff --git a/manuskript/ui/exporters/__init__.py b/manuskript/ui/exporters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/manuskript/ui/exporters/exporter.py b/manuskript/ui/exporters/exporter.py index ec5af47..0eea773 100644 --- a/manuskript/ui/exporters/exporter.py +++ b/manuskript/ui/exporters/exporter.py @@ -1,14 +1,14 @@ #!/usr/bin/env python # --!-- coding: utf8 --!-- +import json import os -from collections import OrderedDict from PyQt5.QtCore import Qt from PyQt5.QtGui import QBrush, QColor -from PyQt5.QtWidgets import QWidget, QVBoxLayout +from PyQt5.QtWidgets import QWidget from manuskript import exporter -from manuskript.functions import lightBlue, printObjects +from manuskript.functions import lightBlue, writablePath from manuskript.ui.exporters.exporter_ui import Ui_exporter from manuskript.ui.exporters.exportersManager import exportersManager diff --git a/manuskript/ui/exporters/exporterSettings.py b/manuskript/ui/exporters/exporterSettings.py deleted file mode 100644 index b16e891..0000000 --- a/manuskript/ui/exporters/exporterSettings.py +++ /dev/null @@ -1,211 +0,0 @@ -#!/usr/bin/env python -# --!-- coding: utf8 --!-- -from PyQt5.QtCore import Qt, QSize -from PyQt5.QtGui import QIcon, QFontMetrics -from PyQt5.QtWidgets import QWidget, QTableWidgetItem, QListWidgetItem, QTreeView - -from manuskript.functions import mainWindow -from manuskript.ui.exporters.exporterSettings_ui import Ui_exporterSettings - - -class exporterSettings(QWidget, Ui_exporterSettings): - def __init__(self, parent=None): - QWidget.__init__(self, parent) - self.setupUi(self) - - self.mw = mainWindow() - - self.grpContentFilters.setCustomColors(active="lightBlue", inactive="lightgray") - - self.grpContentFilters.button.setChecked(False) - - ################################################################# - # Content - - h = self.tblContent.horizontalHeader() - h.setSectionResizeMode(h.ResizeToContents) - h.setSectionResizeMode(0, h.Stretch) - - self.contentUpdateTable() - self.chkContentMore.toggled.connect(self.contentUpdateTable) - - # Labels - self.lstContentLabels.clear() - h = QFontMetrics(self.font()).height() - for i in range(1, self.mw.mdlLabels.rowCount()): - item = self.mw.mdlLabels.item(i, 0) - if item: - item = QListWidgetItem(item.icon(), item.text()) - item.setFlags(item.flags() | Qt.ItemIsUserCheckable) - item.setCheckState(Qt.Checked) - item.setSizeHint(QSize(100, h)) - self.lstContentLabels.addItem(item) - - self.chkContentLabels.toggled.connect(self.lstContentLabels.setVisible) - self.chkContentLabels.toggled.connect(lambda: self.listWidgetAdjustToContent(self.lstContentLabels)) - self.lstContentLabels.setVisible(False) - - # Status - self.lstContentStatus.clear() - h = QFontMetrics(self.font()).height() - for i in range(1, self.mw.mdlStatus.rowCount()): - item = self.mw.mdlStatus.item(i, 0) - if item: - item = QListWidgetItem(item.icon(), item.text()) - item.setFlags(item.flags() | Qt.ItemIsUserCheckable) - item.setCheckState(Qt.Checked) - item.setSizeHint(QSize(100, h)) - self.lstContentStatus.addItem(item) - - self.chkContentStatus.toggled.connect(self.lstContentStatus.setVisible) - self.chkContentStatus.toggled.connect(lambda: self.listWidgetAdjustToContent(self.lstContentStatus)) - self.lstContentStatus.setVisible(False) - - # Root item - self.cmbContentParent.setModel(self.mw.mdlOutline) - v = QTreeView() - self.cmbContentParent.setView(v) - v.setHeaderHidden(True) - for i in range(1, self.mw.mdlOutline.columnCount()): - v.hideColumn(i) - self.chkContentParent.toggled.connect(self.cmbContentParent.setVisible) - self.cmbContentParent.hide() - - ################################################################# - # Separations - - for cmb in [self.cmbSepFF, self.cmbSepTT, self.cmbSepFT, self.cmbSepTF]: - cmb.clear() - - cmb.addItem(self.tr("Empty line"), "empty") - cmb.addItem(self.tr("Custom"), "custom") - cmb.currentIndexChanged.connect(self.sepCmbChanged) - - ################################################################# - # Transformations - - h = self.tblReplacements.horizontalHeader() - h.setSectionResizeMode(h.ResizeToContents) - h.setSectionResizeMode(1, h.Stretch) - h.setSectionResizeMode(2, h.Stretch) - - # Cf. https://en.wikipedia.org/wiki/Quotation_mark - self.cmbTransDoubleQuotes.clear() - self.cmbTransDoubleQuotes.addItems(["” “", "“ ”", "« »"]) - self.cmbTransSingleQuote.clear() - self.cmbTransSingleQuote.addItems(["‘ ’", "‹ ›"]) - - - for cmb in [self.cmbTransDoubleQuotes, self.cmbTransSingleQuote]: - cmb.addItem(self.tr("Custom"), "custom") - cmb.currentIndexChanged.connect(self.transCmbChanged) - cmb.currentIndexChanged.emit(0) - - self.btnTransAdd.clicked.connect(self.transAddTableRow) - self.btnTransRemove.clicked.connect(self.transRemoveTableRow) - - def sepCmbChanged(self, index): - cmb = self.sender() - map = { - self.cmbSepFF: self.txtSepFF, - self.cmbSepTT: self.txtSepTT, - self.cmbSepFT: self.txtSepFT, - self.cmbSepTF: self.txtSepTF - } - map[cmb].setEnabled(cmb.currentData() == "custom") - - def transCmbChanged(self, index): - cmb = self.sender() - map = { - self.cmbTransDoubleQuotes: (self.txtTransDoubleQuotesA, self.lblTransDoubleQuotes, self.txtTransDoubleQuotesB), - self.cmbTransSingleQuote: (self.txtTransSingleQuoteA, self.lblTransSingleQuote, self.txtTransSingleQuoteB), - } - for txt in map[cmb]: - txt.setVisible(cmb.currentData() == "custom") - - def contentUpdateTable(self, val=False): - - def addFolderRow(text="Folder"): - self.tableWidgetAddRow(self.tblContent, [ - self.tableWidgetMakeItem(text, "folder"), - self.tableWidgetMakeItem("", "", True, True), - ]) - - def addTextRow(text="Text"): - self.tableWidgetAddRow(self.tblContent, [ - self.tableWidgetMakeItem(text, "text-x-generic"), - self.tableWidgetMakeItem("", "", True, False), - self.tableWidgetMakeItem("", "", True, True), - ]) - - # self.tblContent.clearContents() - self.tblContent.setRowCount(0) - - if not val: - addFolderRow() - addTextRow() - - else: - level = self.mw.mdlOutline.maxLevel() - - for i in range(level): - addFolderRow("{}Level {} folder".format(" " * i, i + 1)) - - for i in range(level): - addTextRow("{}Level {} text".format(" " * i, i + 1)) - - self.tableWidgetAdjustToContent(self.tblContent) - - - def transAddTableRow(self): - self.tableWidgetAddRow(self.tblReplacements, [ - self.tableWidgetMakeItem("", "", True, True), - self.tableWidgetMakeItem("", "", False, False), - self.tableWidgetMakeItem("", "", False, False), - self.tableWidgetMakeItem("", "", True, False), - ]) - - def transRemoveTableRow(self): - self.tblReplacements.removeRow(self.tblReplacements.currentRow()) - - def tableWidgetMakeItem(self, text="", icon="", checkable=False, checked=False): - """Creates a QTableWidgetItem with the given attributes.""" - item = QTableWidgetItem(QIcon.fromTheme(icon), text) - if checkable: - item.setFlags(item.flags() | Qt.ItemIsUserCheckable) - item.setCheckState(Qt.Checked if checked else Qt.Unchecked) - - return item - - def tableWidgetAddRow(self, table, items): - """Appends the given items (list of QTableWidgetItems) to table.""" - table.setRowCount(table.rowCount() + 1) - k = 0 - for i in items: - table.setItem(table.rowCount() - 1, k, i) - k += 1 - - def tableWidgetAdjustToContent(self, table): - """Set sizehint of QTableWidget table so that it matches content vertically.""" - - h = 0 - - h += table.horizontalHeader().height() - - for i in range(table.rowCount()): - h += table.rowHeight(i) - - table.setMinimumSize(QSize(0, h + 2)) - table.setMaximumSize(QSize(16777215, h + 2)) - - def listWidgetAdjustToContent(self, lst): - """Adjust listWidget to content.""" - h = 0 - for i in range(lst.count()): - h += lst.item(i).sizeHint().height() - - lst.setMinimumSize(QSize(0, h+2)) - lst.setMaximumSize(QSize(16777215, h+2)) - - - diff --git a/manuskript/ui/exporters/manuskript/__init__.py b/manuskript/ui/exporters/manuskript/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/manuskript/ui/exporters/manuskript/plainTextSettings.py b/manuskript/ui/exporters/manuskript/plainTextSettings.py new file mode 100644 index 0000000..9721589 --- /dev/null +++ b/manuskript/ui/exporters/manuskript/plainTextSettings.py @@ -0,0 +1,422 @@ +#!/usr/bin/env python +# --!-- coding: utf8 --!-- +import json +import os + +from PyQt5.QtCore import Qt, QSize +from PyQt5.QtGui import QIcon, QFontMetrics, QFont +from PyQt5.QtWidgets import QWidget, QTableWidgetItem, QListWidgetItem, QTreeView + +from manuskript.functions import mainWindow, writablePath +from manuskript.ui.exporters.manuskript.plainTextSettings_ui import Ui_exporterSettings + + +class exporterSettings(QWidget, Ui_exporterSettings): + def __init__(self, _format, parent=None): + QWidget.__init__(self, parent) + self.setupUi(self) + + self.mw = mainWindow() + self._format = _format + self.settings = {} + + ################################################################# + # Content + + self.grpContentFilters.button.setChecked(False) + + h = self.tblContent.horizontalHeader() + h.setSectionResizeMode(h.ResizeToContents) + h.setSectionResizeMode(0, h.Stretch) + + self.contentUpdateTable() + self.chkContentMore.toggled.connect(self.contentTableToggle) + self.contentTableToggle(False) + + # Labels + self.lstContentLabels.clear() + h = QFontMetrics(self.font()).height() + for i in range(0, self.mw.mdlLabels.rowCount()): + item = self.mw.mdlLabels.item(i, 0) + if item: + item = QListWidgetItem(item.icon(), item.text()) + item.setFlags(item.flags() | Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked) + item.setSizeHint(QSize(100, h)) + self.lstContentLabels.addItem(item) + + self.chkContentLabels.toggled.connect(self.lstContentLabels.setVisible) + self.chkContentLabels.toggled.connect(lambda: self.listWidgetAdjustToContent(self.lstContentLabels)) + self.lstContentLabels.setVisible(False) + + # Status + self.lstContentStatus.clear() + h = QFontMetrics(self.font()).height() + for i in range(0, self.mw.mdlStatus.rowCount()): + item = self.mw.mdlStatus.item(i, 0) + if item: + item = QListWidgetItem(item.icon(), item.text()) + item.setFlags(item.flags() | Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked) + item.setSizeHint(QSize(100, h)) + self.lstContentStatus.addItem(item) + + self.chkContentStatus.toggled.connect(self.lstContentStatus.setVisible) + self.chkContentStatus.toggled.connect(lambda: self.listWidgetAdjustToContent(self.lstContentStatus)) + self.lstContentStatus.setVisible(False) + + # Root item + self.cmbContentParent.setModel(self.mw.mdlOutline) + v = QTreeView() + self.cmbContentParent.setView(v) + v.setHeaderHidden(True) + for i in range(1, self.mw.mdlOutline.columnCount()): + v.hideColumn(i) + self.chkContentParent.toggled.connect(self.cmbContentParent.setVisible) + self.cmbContentParent.hide() + + ################################################################# + # Separations + + for cmb in [self.cmbSepFF, self.cmbSepTT, self.cmbSepFT, self.cmbSepTF]: + cmb.clear() + + cmb.addItem(self.tr("Empty line"), "empty") + cmb.addItem(self.tr("Custom"), "custom") + cmb.currentIndexChanged.connect(self.sepCmbChanged) + + ################################################################# + # Transformations + + h = self.tblReplacements.horizontalHeader() + h.setSectionResizeMode(h.ResizeToContents) + h.setSectionResizeMode(1, h.Stretch) + h.setSectionResizeMode(2, h.Stretch) + + # Cf. https://en.wikipedia.org/wiki/Quotation_mark + self.cmbTransDoubleQuotes.clear() + self.cmbTransDoubleQuotes.addItems(["”___“", "“___”", "«___»"]) + self.cmbTransSingleQuote.clear() + self.cmbTransSingleQuote.addItems(["‘___’", "‹___›"]) + + for cmb in [self.cmbTransDoubleQuotes, self.cmbTransSingleQuote]: + cmb.addItem(self.tr("Custom"), "custom") + cmb.currentIndexChanged.connect(self.transCmbChanged) + cmb.currentIndexChanged.emit(0) + + self.btnTransAdd.clicked.connect(self.transAddTableRow) + self.btnTransRemove.clicked.connect(self.transRemoveTableRow) + self.tableWidgetAdjustToContent(self.tblReplacements) + + ################################################################# + # Preview + + self.cmbPreviewFont.setCurrentFont(self.font()) + self.spnPreviewSize.setValue(self.font().pointSize()) + + ################################################################# + # Final stuff + + self.toolBox.setCurrentIndex(0) + self.loadSettings() + + ################################################################################################################### + # SETTINGS + ################################################################################################################### + + def loadSettings(self): + filename = self.getSettingsPath() + print(filename) + if os.path.exists(filename): + with open(filename) as f: + self.settings = json.load(f) + self.updateFromSettings() + + # Default values + else: + self.getSettings() + + def writeSettings(self): + with open(self.getSettingsPath(), 'w') as f: + # json.dumps(json.loads(json.dumps(allSettings)), indent=4, sort_keys=True) + json.dump(self.settings, f, indent=4, sort_keys=True) + + def getSettingsPath(self): + return os.path.join(writablePath(), "exporter.ini") + + def updateFromSettings(self): + settings = self.settings + + # Content + s = settings["Content"] + self.chkContentMore.setChecked(s["More"]) + + if not s["More"]: + self.tblContent.item(0, 1).setCheckState(Qt.Checked if s["FolderTitle"] else Qt.Unchecked) + self.tblContent.item(1, 1).setCheckState(Qt.Checked if s["TextTitle"] else Qt.Unchecked) + self.tblContent.item(1, 2).setCheckState(Qt.Checked if s["TextText"] else Qt.Unchecked) + + else: + nLevel = len(s["FolderTitle"]) + for i in range(nLevel): + self.tblContent.item(i + 2, 1).setCheckState(Qt.Checked if s["FolderTitle"][i] else Qt.Unchecked) + self.tblContent.item(i + 2 + nLevel, 1).setCheckState(Qt.Checked if s["TextTitle"][i] else Qt.Unchecked) + self.tblContent.item(i + 2 + nLevel, 2).setCheckState(Qt.Checked if s["TextText"][i] else Qt.Unchecked) + + self.chkContentIgnoreCompile.setChecked(s["IgnoreCompile"]) + self.chkContentParent.setChecked(s["Parent"]) + self.chkContentLabels.setChecked(s["Labels"]) + self.chkContentStatus.setChecked(s["Status"]) + # FIXME: parent, labels, status + + # Separations + s = settings["Separator"] + for val, cmb, txt in [ + ("FF", self.cmbSepFF, self.txtSepFF), + ("TT", self.cmbSepTT, self.txtSepTT), + ("FT", self.cmbSepFT, self.txtSepFT), + ("TF", self.cmbSepTF, self.txtSepTF), + ]: + if s[val] == "\n": + cmb.setCurrentIndex(0) + else: + cmb.setCurrentIndex(1) + txt.setText(self._format.escapes(s[val])) + + # Transformations + s = settings["Transform"] + self.chkTransEllipse.setChecked(s["Ellipse"]) + self.chkTransDash.setChecked(s["Dash"]) + + for val, chk, cmb, txtA, txtB in [ + ("DoubleQuotes", self.chkTransDoubleQuotes, self.cmbTransDoubleQuotes, self.txtTransDoubleQuotesA, self.txtTransDoubleQuotesB), + ("SingleQuote", self.chkTransSingleQuote, self.cmbTransSingleQuote, self.txtTransSingleQuoteA, self.txtTransSingleQuoteB), + ]: + chk.setChecked(s[val] != False) + if s[val]: + if cmb.findText(s[val]) != -1: + cmb.setCurrentText(s[val]) + else: + cmb.setCurrentIndex(cmb.count() - 1) + txtA.setText(s[val].split("___")[0]) + txtB.setText(s[val].split("___")[1]) + + self.chkTransSpaces.setChecked(s["Spaces"]) + + for i in s["Custom"]: + self.transAddTableRow(i[0], i[1], i[2], i[3]) + + # Preview + s = settings["Preview"] + f = QFont() + f.fromString(s["PreviewFont"]) + self.cmbPreviewFont.setCurrentFont(f) + self.spnPreviewSize.setValue(f.pointSize()) + + def getSettings(self): + """Updates settings from ui, and return.""" + # Content + s = self.settings.get("Content", {}) + s["More"] = self.chkContentMore.isChecked() + + if not s["More"]: + s["FolderTitle"] = self.tblContent.item(0, 1).checkState() == Qt.Checked + s["TextTitle"] = self.tblContent.item(1, 1).checkState() == Qt.Checked + s["TextText"] = self.tblContent.item(1, 2).checkState() == Qt.Checked + + else: + s["FolderTitle"] = [] + s["TextTitle"] = [] + s["TextText"] = [] + nLevel = int((self.tblContent.rowCount() - 2) / 2) + print(nLevel) + for row in range(nLevel): + s["FolderTitle"].append(self.tblContent.item(2 + row, 1).checkState() == Qt.Checked) + s["TextTitle"].append(self.tblContent.item(2 + row + nLevel, 1).checkState() == Qt.Checked) + s["TextText"].append(self.tblContent.item(2 + row + nLevel, 2).checkState() == Qt.Checked) + + s["IgnoreCompile"] = self.chkContentIgnoreCompile.isChecked() + s["Parent"] = self.chkContentParent.isChecked() + s["Labels"] = self.chkContentLabels.isChecked() + s["Status"] = self.chkContentStatus.isChecked() + self.settings["Content"] = s + # FIXME: parent, labels, status + + # Separations + s = self.settings.get("Separator", {}) + for val, cmb, txt in [ + ("FF", self.cmbSepFF, self.txtSepFF), + ("TT", self.cmbSepTT, self.txtSepTT), + ("FT", self.cmbSepFT, self.txtSepFT), + ("TF", self.cmbSepTF, self.txtSepTF), + ]: + if cmb.currentIndex() == 0: + s[val] = "\n" + + else: + s[val] = self._format.descapes(txt.text()) + self.settings["Separator"] = s + + # Transformations + s = self.settings.get("Transform", {}) + s["Ellipse"] = self.chkTransEllipse.isChecked() + s["Dash"] = self.chkTransDash.isChecked() + + for val, chk, cmb, txtA, txtB in [ + ("DoubleQuotes", self.chkTransDoubleQuotes, self.cmbTransDoubleQuotes, self.txtTransDoubleQuotesA, self.txtTransDoubleQuotesB), + ("SingleQuote", self.chkTransSingleQuote, self.cmbTransSingleQuote, self.txtTransSingleQuoteA, self.txtTransSingleQuoteB), + ]: + if not chk.isChecked(): + s[val] = False + else: + if cmb.currentData() == "custom": + s[val] = txtA.text() + "___" + txtB.text() + else: + s[val] = cmb.currentText() + + s["Spaces"] = self.chkTransSpaces.isChecked() + + s["Custom"] = [] + for i in range(self.tblReplacements.rowCount()): + print(self.getTableRowValues(self.tblReplacements, i)) + s["Custom"].append(self.getTableRowValues(self.tblReplacements, i)) + self.settings["Transform"] = s + + # Preview + s = self.settings.get("Preview", {}) + f = self.cmbPreviewFont.currentFont() + f.setPointSize(self.spnPreviewSize.value()) + s["PreviewFont"] = f.toString() + self.settings["Preview"] = s + + # Save settings + self.writeSettings() + + return self.settings + + def sepCmbChanged(self, index): + cmb = self.sender() + map = { + self.cmbSepFF: self.txtSepFF, + self.cmbSepTT: self.txtSepTT, + self.cmbSepFT: self.txtSepFT, + self.cmbSepTF: self.txtSepTF + } + map[cmb].setEnabled(cmb.currentData() == "custom") + + def transCmbChanged(self, index): + cmb = self.sender() + map = { + self.cmbTransDoubleQuotes: (self.txtTransDoubleQuotesA, self.lblTransDoubleQuotes, self.txtTransDoubleQuotesB), + self.cmbTransSingleQuote: (self.txtTransSingleQuoteA, self.lblTransSingleQuote, self.txtTransSingleQuoteB), + } + for txt in map[cmb]: + txt.setVisible(cmb.currentData() == "custom") + + def contentUpdateTable(self): + + def addFolderRow(text="Folder"): + self.tableWidgetAddRow(self.tblContent, [ + self.tableWidgetMakeItem(text, "folder"), + self.tableWidgetMakeItem("", "", True, True), + ]) + + def addTextRow(text="Text"): + self.tableWidgetAddRow(self.tblContent, [ + self.tableWidgetMakeItem(text, "text-x-generic"), + self.tableWidgetMakeItem("", "", True, False), + self.tableWidgetMakeItem("", "", True, True), + ]) + + self.tblContent.setRowCount(0) + + # Basic + addFolderRow() + addTextRow() + + # Detailed + level = self.mw.mdlOutline.maxLevel() + + for i in range(level): + addFolderRow("{}Level {} folder".format(" " * i, i + 1)) + + for i in range(level): + addTextRow("{}Level {} text".format(" " * i, i + 1)) + + self.tableWidgetAdjustToContent(self.tblContent) + + def contentTableToggle(self, detailed): + for i in range(self.tblContent.rowCount()): + self.tblContent.setRowHidden(i, i in [0, 1] and detailed or (not i in [0, 1] and not detailed)) + self.tableWidgetAdjustToContent(self.tblContent) + + def getTableRowValues(self, table, row): + r = [] + for col in range(table.columnCount()): + item = table.item(row, col) + + if not item: + r.append(None) + elif item.flags() & Qt.ItemIsUserCheckable == Qt.ItemIsUserCheckable: + r.append(item.checkState() == Qt.Checked) + else: + r.append(item.text()) + + return r + + def transAddTableRow(self, checked=True, A="", B="", regexp=False): + self.tableWidgetAddRow(self.tblReplacements, [ + self.tableWidgetMakeItem("", "", True, checked), + self.tableWidgetMakeItem(A, "", False, False), + self.tableWidgetMakeItem(B, "", False, False), + self.tableWidgetMakeItem("", "", True, regexp), + ]) + self.tableWidgetAdjustToContent(self.tblReplacements) + + def transRemoveTableRow(self): + self.tblReplacements.removeRow(self.tblReplacements.currentRow()) + self.tableWidgetAdjustToContent(self.tblReplacements) + + def tableWidgetMakeItem(self, text="", icon="", checkable=False, checked=False): + """Creates a QTableWidgetItem with the given attributes.""" + item = QTableWidgetItem(QIcon.fromTheme(icon), text) + if checkable: + item.setFlags(item.flags() | Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked if checked else Qt.Unchecked) + else: + item.setFlags(item.flags() & ~Qt.ItemIsUserCheckable) + + return item + + def tableWidgetAddRow(self, table, items): + """Appends the given items (list of QTableWidgetItems) to table.""" + table.setRowCount(table.rowCount() + 1) + k = 0 + for i in items: + table.setItem(table.rowCount() - 1, k, i) + k += 1 + + def tableWidgetAdjustToContent(self, table): + """Set sizehint of QTableWidget table so that it matches content vertically.""" + + h = 0 + + h += table.horizontalHeader().height() + + for i in range(table.rowCount()): + h += table.rowHeight(i) + + table.setMinimumSize(QSize(0, h + 2)) + table.setMaximumSize(QSize(16777215, h + 2)) + + def listWidgetAdjustToContent(self, lst): + """Adjust listWidget to content.""" + h = 0 + for i in range(lst.count()): + h += lst.item(i).sizeHint().height() + + lst.setMinimumSize(QSize(0, h+2)) + lst.setMaximumSize(QSize(16777215, h+2)) + + + diff --git a/manuskript/ui/exporters/exporterSettings_ui.py b/manuskript/ui/exporters/manuskript/plainTextSettings_ui.py similarity index 82% rename from manuskript/ui/exporters/exporterSettings_ui.py rename to manuskript/ui/exporters/manuskript/plainTextSettings_ui.py index 10eb7e7..6dcda46 100644 --- a/manuskript/ui/exporters/exporterSettings_ui.py +++ b/manuskript/ui/exporters/manuskript/plainTextSettings_ui.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'manuskript/ui/exporters/exporterSettings_ui.ui' +# Form implementation generated from reading ui file 'manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui' # # Created by: PyQt5 UI code generator 5.4.2 # @@ -27,15 +27,15 @@ class Ui_exporterSettings(object): " background-color:skyblue;\n" "}") self.toolBox.setObjectName("toolBox") - self.page = QtWidgets.QWidget() - self.page.setGeometry(QtCore.QRect(0, 0, 491, 824)) - self.page.setObjectName("page") - self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.page) + self.content = QtWidgets.QWidget() + self.content.setGeometry(QtCore.QRect(0, 0, 491, 842)) + self.content.setObjectName("content") + self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.content) self.verticalLayout_5.setObjectName("verticalLayout_5") - self.label = QtWidgets.QLabel(self.page) + self.label = QtWidgets.QLabel(self.content) self.label.setObjectName("label") self.verticalLayout_5.addWidget(self.label) - self.tblContent = QtWidgets.QTableWidget(self.page) + self.tblContent = QtWidgets.QTableWidget(self.content) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -60,11 +60,11 @@ class Ui_exporterSettings(object): self.horizontalLayout_8.setObjectName("horizontalLayout_8") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_8.addItem(spacerItem) - self.chkContentMore = QtWidgets.QCheckBox(self.page) + self.chkContentMore = QtWidgets.QCheckBox(self.content) self.chkContentMore.setObjectName("chkContentMore") self.horizontalLayout_8.addWidget(self.chkContentMore) self.verticalLayout_5.addLayout(self.horizontalLayout_8) - self.grpContentFilters = collapsibleGroupBox2(self.page) + self.grpContentFilters = collapsibleGroupBox2(self.content) self.grpContentFilters.setCheckable(True) self.grpContentFilters.setObjectName("grpContentFilters") self.formLayout_2 = QtWidgets.QFormLayout(self.grpContentFilters) @@ -83,7 +83,6 @@ class Ui_exporterSettings(object): self.cmbContentParent = QtWidgets.QComboBox(self.grpContentFilters) self.cmbContentParent.setFrame(False) self.cmbContentParent.setObjectName("cmbContentParent") - self.cmbContentParent.addItem("") self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.cmbContentParent) self.chkContentLabels = QtWidgets.QCheckBox(self.grpContentFilters) self.chkContentLabels.setObjectName("chkContentLabels") @@ -110,12 +109,13 @@ class Ui_exporterSettings(object): self.verticalLayout_5.addWidget(self.grpContentFilters) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_5.addItem(spacerItem1) - self.toolBox.addItem(self.page, "") - self.page_3 = QtWidgets.QWidget() - self.page_3.setObjectName("page_3") - self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.page_3) + self.toolBox.addItem(self.content, "") + self.separations = QtWidgets.QWidget() + self.separations.setGeometry(QtCore.QRect(0, 0, 511, 522)) + self.separations.setObjectName("separations") + self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.separations) self.verticalLayout_8.setObjectName("verticalLayout_8") - self.label_3 = QtWidgets.QLabel(self.page_3) + self.label_3 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) @@ -128,7 +128,7 @@ class Ui_exporterSettings(object): self.horizontalLayout.addItem(spacerItem2) self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") - self.pushButton_4 = QtWidgets.QPushButton(self.page_3) + self.pushButton_4 = QtWidgets.QPushButton(self.separations) self.pushButton_4.setEnabled(True) self.pushButton_4.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_4.setMaximumSize(QtCore.QSize(16, 16)) @@ -138,12 +138,12 @@ class Ui_exporterSettings(object): self.pushButton_4.setFlat(True) self.pushButton_4.setObjectName("pushButton_4") self.verticalLayout.addWidget(self.pushButton_4) - self.line = QtWidgets.QFrame(self.page_3) + self.line = QtWidgets.QFrame(self.separations) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.verticalLayout.addWidget(self.line) - self.pushButton = QtWidgets.QPushButton(self.page_3) + self.pushButton = QtWidgets.QPushButton(self.separations) self.pushButton.setEnabled(True) self.pushButton.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton.setMaximumSize(QtCore.QSize(16, 16)) @@ -154,17 +154,17 @@ class Ui_exporterSettings(object): self.pushButton.setObjectName("pushButton") self.verticalLayout.addWidget(self.pushButton) self.horizontalLayout.addLayout(self.verticalLayout) - self.cmbSepFF = QtWidgets.QComboBox(self.page_3) + self.cmbSepFF = QtWidgets.QComboBox(self.separations) self.cmbSepFF.setObjectName("cmbSepFF") self.cmbSepFF.addItem("") self.cmbSepFF.addItem("") self.horizontalLayout.addWidget(self.cmbSepFF) - self.txtSepFF = QtWidgets.QLineEdit(self.page_3) + self.txtSepFF = QtWidgets.QLineEdit(self.separations) self.txtSepFF.setEnabled(False) self.txtSepFF.setObjectName("txtSepFF") self.horizontalLayout.addWidget(self.txtSepFF) self.verticalLayout_8.addLayout(self.horizontalLayout) - self.label_4 = QtWidgets.QLabel(self.page_3) + self.label_4 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) @@ -177,7 +177,7 @@ class Ui_exporterSettings(object): self.horizontalLayout_2.addItem(spacerItem3) self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") - self.pushButton_5 = QtWidgets.QPushButton(self.page_3) + self.pushButton_5 = QtWidgets.QPushButton(self.separations) self.pushButton_5.setEnabled(True) self.pushButton_5.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_5.setMaximumSize(QtCore.QSize(16, 16)) @@ -187,12 +187,12 @@ class Ui_exporterSettings(object): self.pushButton_5.setFlat(True) self.pushButton_5.setObjectName("pushButton_5") self.verticalLayout_3.addWidget(self.pushButton_5) - self.line_2 = QtWidgets.QFrame(self.page_3) + self.line_2 = QtWidgets.QFrame(self.separations) self.line_2.setFrameShape(QtWidgets.QFrame.HLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName("line_2") self.verticalLayout_3.addWidget(self.line_2) - self.pushButton_6 = QtWidgets.QPushButton(self.page_3) + self.pushButton_6 = QtWidgets.QPushButton(self.separations) self.pushButton_6.setEnabled(True) self.pushButton_6.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_6.setMaximumSize(QtCore.QSize(16, 16)) @@ -203,17 +203,17 @@ class Ui_exporterSettings(object): self.pushButton_6.setObjectName("pushButton_6") self.verticalLayout_3.addWidget(self.pushButton_6) self.horizontalLayout_2.addLayout(self.verticalLayout_3) - self.cmbSepTT = QtWidgets.QComboBox(self.page_3) + self.cmbSepTT = QtWidgets.QComboBox(self.separations) self.cmbSepTT.setObjectName("cmbSepTT") self.cmbSepTT.addItem("") self.cmbSepTT.addItem("") self.horizontalLayout_2.addWidget(self.cmbSepTT) - self.txtSepTT = QtWidgets.QLineEdit(self.page_3) + self.txtSepTT = QtWidgets.QLineEdit(self.separations) self.txtSepTT.setEnabled(False) self.txtSepTT.setObjectName("txtSepTT") self.horizontalLayout_2.addWidget(self.txtSepTT) self.verticalLayout_8.addLayout(self.horizontalLayout_2) - self.label_6 = QtWidgets.QLabel(self.page_3) + self.label_6 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) @@ -226,7 +226,7 @@ class Ui_exporterSettings(object): self.horizontalLayout_3.addItem(spacerItem4) self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName("verticalLayout_4") - self.pushButton_7 = QtWidgets.QPushButton(self.page_3) + self.pushButton_7 = QtWidgets.QPushButton(self.separations) self.pushButton_7.setEnabled(True) self.pushButton_7.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_7.setMaximumSize(QtCore.QSize(16, 16)) @@ -236,12 +236,12 @@ class Ui_exporterSettings(object): self.pushButton_7.setFlat(True) self.pushButton_7.setObjectName("pushButton_7") self.verticalLayout_4.addWidget(self.pushButton_7) - self.line_3 = QtWidgets.QFrame(self.page_3) + self.line_3 = QtWidgets.QFrame(self.separations) self.line_3.setFrameShape(QtWidgets.QFrame.HLine) self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_3.setObjectName("line_3") self.verticalLayout_4.addWidget(self.line_3) - self.pushButton_8 = QtWidgets.QPushButton(self.page_3) + self.pushButton_8 = QtWidgets.QPushButton(self.separations) self.pushButton_8.setEnabled(True) self.pushButton_8.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_8.setMaximumSize(QtCore.QSize(16, 16)) @@ -252,17 +252,17 @@ class Ui_exporterSettings(object): self.pushButton_8.setObjectName("pushButton_8") self.verticalLayout_4.addWidget(self.pushButton_8) self.horizontalLayout_3.addLayout(self.verticalLayout_4) - self.cmbSepFT = QtWidgets.QComboBox(self.page_3) + self.cmbSepFT = QtWidgets.QComboBox(self.separations) self.cmbSepFT.setObjectName("cmbSepFT") self.cmbSepFT.addItem("") self.cmbSepFT.addItem("") self.horizontalLayout_3.addWidget(self.cmbSepFT) - self.txtSepFT = QtWidgets.QLineEdit(self.page_3) + self.txtSepFT = QtWidgets.QLineEdit(self.separations) self.txtSepFT.setEnabled(False) self.txtSepFT.setObjectName("txtSepFT") self.horizontalLayout_3.addWidget(self.txtSepFT) self.verticalLayout_8.addLayout(self.horizontalLayout_3) - self.label_5 = QtWidgets.QLabel(self.page_3) + self.label_5 = QtWidgets.QLabel(self.separations) font = QtGui.QFont() font.setBold(True) font.setWeight(75) @@ -275,7 +275,7 @@ class Ui_exporterSettings(object): self.horizontalLayout_4.addItem(spacerItem5) self.verticalLayout_7 = QtWidgets.QVBoxLayout() self.verticalLayout_7.setObjectName("verticalLayout_7") - self.pushButton_9 = QtWidgets.QPushButton(self.page_3) + self.pushButton_9 = QtWidgets.QPushButton(self.separations) self.pushButton_9.setEnabled(True) self.pushButton_9.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_9.setMaximumSize(QtCore.QSize(16, 16)) @@ -285,12 +285,12 @@ class Ui_exporterSettings(object): self.pushButton_9.setFlat(True) self.pushButton_9.setObjectName("pushButton_9") self.verticalLayout_7.addWidget(self.pushButton_9) - self.line_4 = QtWidgets.QFrame(self.page_3) + self.line_4 = QtWidgets.QFrame(self.separations) self.line_4.setFrameShape(QtWidgets.QFrame.HLine) self.line_4.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_4.setObjectName("line_4") self.verticalLayout_7.addWidget(self.line_4) - self.pushButton_10 = QtWidgets.QPushButton(self.page_3) + self.pushButton_10 = QtWidgets.QPushButton(self.separations) self.pushButton_10.setEnabled(True) self.pushButton_10.setMinimumSize(QtCore.QSize(16, 16)) self.pushButton_10.setMaximumSize(QtCore.QSize(16, 16)) @@ -301,26 +301,26 @@ class Ui_exporterSettings(object): self.pushButton_10.setObjectName("pushButton_10") self.verticalLayout_7.addWidget(self.pushButton_10) self.horizontalLayout_4.addLayout(self.verticalLayout_7) - self.cmbSepTF = QtWidgets.QComboBox(self.page_3) + self.cmbSepTF = QtWidgets.QComboBox(self.separations) self.cmbSepTF.setObjectName("cmbSepTF") self.cmbSepTF.addItem("") self.cmbSepTF.addItem("") self.horizontalLayout_4.addWidget(self.cmbSepTF) - self.txtSepTF = QtWidgets.QLineEdit(self.page_3) + self.txtSepTF = QtWidgets.QLineEdit(self.separations) self.txtSepTF.setEnabled(False) self.txtSepTF.setObjectName("txtSepTF") self.horizontalLayout_4.addWidget(self.txtSepTF) self.verticalLayout_8.addLayout(self.horizontalLayout_4) spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_8.addItem(spacerItem6) - self.toolBox.addItem(self.page_3, "") - self.page_2 = QtWidgets.QWidget() - self.page_2.setGeometry(QtCore.QRect(0, 0, 511, 548)) - self.page_2.setStyleSheet("QGroupBox{font-weight:bold;}") - self.page_2.setObjectName("page_2") - self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.page_2) + self.toolBox.addItem(self.separations, "") + self.transformations = QtWidgets.QWidget() + self.transformations.setGeometry(QtCore.QRect(0, 0, 511, 522)) + self.transformations.setStyleSheet("QGroupBox{font-weight:bold;}") + self.transformations.setObjectName("transformations") + self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.transformations) self.verticalLayout_6.setObjectName("verticalLayout_6") - self.grpTransTypo = collapsibleGroupBox2(self.page_2) + self.grpTransTypo = collapsibleGroupBox2(self.transformations) self.grpTransTypo.setStyleSheet("") self.grpTransTypo.setObjectName("grpTransTypo") self.formLayout = QtWidgets.QFormLayout(self.grpTransTypo) @@ -345,7 +345,6 @@ class Ui_exporterSettings(object): self.cmbTransDoubleQuotes.setObjectName("cmbTransDoubleQuotes") self.horizontalLayout_5.addWidget(self.cmbTransDoubleQuotes) self.txtTransDoubleQuotesA = QtWidgets.QLineEdit(self.grpTransTypo) - self.txtTransDoubleQuotesA.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -355,14 +354,13 @@ class Ui_exporterSettings(object): self.txtTransDoubleQuotesA.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransDoubleQuotesA.setStyleSheet("border-radius: 6px;") self.txtTransDoubleQuotesA.setFrame(False) + self.txtTransDoubleQuotesA.setAlignment(QtCore.Qt.AlignCenter) self.txtTransDoubleQuotesA.setObjectName("txtTransDoubleQuotesA") self.horizontalLayout_5.addWidget(self.txtTransDoubleQuotesA) self.lblTransDoubleQuotes = QtWidgets.QLabel(self.grpTransTypo) - self.lblTransDoubleQuotes.setEnabled(False) self.lblTransDoubleQuotes.setObjectName("lblTransDoubleQuotes") self.horizontalLayout_5.addWidget(self.lblTransDoubleQuotes) self.txtTransDoubleQuotesB = QtWidgets.QLineEdit(self.grpTransTypo) - self.txtTransDoubleQuotesB.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -372,6 +370,7 @@ class Ui_exporterSettings(object): self.txtTransDoubleQuotesB.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransDoubleQuotesB.setStyleSheet("border-radius: 6px;") self.txtTransDoubleQuotesB.setFrame(False) + self.txtTransDoubleQuotesB.setAlignment(QtCore.Qt.AlignCenter) self.txtTransDoubleQuotesB.setObjectName("txtTransDoubleQuotesB") self.horizontalLayout_5.addWidget(self.txtTransDoubleQuotesB) spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) @@ -388,7 +387,6 @@ class Ui_exporterSettings(object): self.cmbTransSingleQuote.setObjectName("cmbTransSingleQuote") self.horizontalLayout_6.addWidget(self.cmbTransSingleQuote) self.txtTransSingleQuoteA = QtWidgets.QLineEdit(self.grpTransTypo) - self.txtTransSingleQuoteA.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -398,14 +396,13 @@ class Ui_exporterSettings(object): self.txtTransSingleQuoteA.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransSingleQuoteA.setStyleSheet("border-radius: 6px;") self.txtTransSingleQuoteA.setFrame(False) + self.txtTransSingleQuoteA.setAlignment(QtCore.Qt.AlignCenter) self.txtTransSingleQuoteA.setObjectName("txtTransSingleQuoteA") self.horizontalLayout_6.addWidget(self.txtTransSingleQuoteA) self.lblTransSingleQuote = QtWidgets.QLabel(self.grpTransTypo) - self.lblTransSingleQuote.setEnabled(False) self.lblTransSingleQuote.setObjectName("lblTransSingleQuote") self.horizontalLayout_6.addWidget(self.lblTransSingleQuote) self.txtTransSingleQuoteB = QtWidgets.QLineEdit(self.grpTransTypo) - self.txtTransSingleQuoteB.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -415,6 +412,7 @@ class Ui_exporterSettings(object): self.txtTransSingleQuoteB.setMaximumSize(QtCore.QSize(40, 16777215)) self.txtTransSingleQuoteB.setStyleSheet("border-radius: 6px;") self.txtTransSingleQuoteB.setFrame(False) + self.txtTransSingleQuoteB.setAlignment(QtCore.Qt.AlignCenter) self.txtTransSingleQuoteB.setObjectName("txtTransSingleQuoteB") self.horizontalLayout_6.addWidget(self.txtTransSingleQuoteB) spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) @@ -424,11 +422,16 @@ class Ui_exporterSettings(object): self.chkTransSpaces.setObjectName("chkTransSpaces") self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.chkTransSpaces) self.verticalLayout_6.addWidget(self.grpTransTypo) - self.grpTransCustom = collapsibleGroupBox2(self.page_2) + self.grpTransCustom = collapsibleGroupBox2(self.transformations) self.grpTransCustom.setObjectName("grpTransCustom") self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.grpTransCustom) self.verticalLayout_9.setObjectName("verticalLayout_9") self.tblReplacements = QtWidgets.QTableWidget(self.grpTransCustom) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tblReplacements.sizePolicy().hasHeightForWidth()) + self.tblReplacements.setSizePolicy(sizePolicy) self.tblReplacements.setAlternatingRowColors(True) self.tblReplacements.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tblReplacements.setObjectName("tblReplacements") @@ -466,11 +469,35 @@ class Ui_exporterSettings(object): self.verticalLayout_6.addWidget(self.grpTransCustom) spacerItem10 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_6.addItem(spacerItem10) - self.toolBox.addItem(self.page_2, "") + self.toolBox.addItem(self.transformations, "") + self.preview = QtWidgets.QWidget() + self.preview.setObjectName("preview") + self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.preview) + self.verticalLayout_11.setObjectName("verticalLayout_11") + self.groupBox = QtWidgets.QGroupBox(self.preview) + self.groupBox.setObjectName("groupBox") + self.formLayout_3 = QtWidgets.QFormLayout(self.groupBox) + self.formLayout_3.setObjectName("formLayout_3") + self.label_7 = QtWidgets.QLabel(self.groupBox) + self.label_7.setObjectName("label_7") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_7) + self.cmbPreviewFont = QtWidgets.QFontComboBox(self.groupBox) + self.cmbPreviewFont.setObjectName("cmbPreviewFont") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbPreviewFont) + self.label_8 = QtWidgets.QLabel(self.groupBox) + self.label_8.setObjectName("label_8") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_8) + self.spnPreviewSize = QtWidgets.QSpinBox(self.groupBox) + self.spnPreviewSize.setObjectName("spnPreviewSize") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.spnPreviewSize) + self.verticalLayout_11.addWidget(self.groupBox) + spacerItem11 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_11.addItem(spacerItem11) + self.toolBox.addItem(self.preview, "") self.verticalLayout_2.addWidget(self.toolBox) self.retranslateUi(exporterSettings) - self.toolBox.setCurrentIndex(0) + self.toolBox.setCurrentIndex(3) self.toolBox.layout().setSpacing(0) QtCore.QMetaObject.connectSlotsByName(exporterSettings) @@ -486,13 +513,12 @@ class Ui_exporterSettings(object): item.setText(_translate("exporterSettings", "Text")) self.chkContentMore.setText(_translate("exporterSettings", "I need more granularity")) self.grpContentFilters.setTitle(_translate("exporterSettings", "Fi<ers")) - self.label_2.setText(_translate("exporterSettings", "Filters what items will be included in the final export.")) + self.label_2.setText(_translate("exporterSettings", "

Filters what items will be included in the final export.
(Not fully implemented yet.)

")) self.chkContentIgnoreCompile.setText(_translate("exporterSettings", "Ignore compile status (include all items)")) self.chkContentParent.setText(_translate("exporterSettings", "Subitems of:")) - self.cmbContentParent.setItemText(0, _translate("exporterSettings", "Root (all)")) self.chkContentLabels.setText(_translate("exporterSettings", "Labels")) self.chkContentStatus.setText(_translate("exporterSettings", "Status")) - self.toolBox.setItemText(self.toolBox.indexOf(self.page), _translate("exporterSettings", "Content")) + self.toolBox.setItemText(self.toolBox.indexOf(self.content), _translate("exporterSettings", "Content")) self.label_3.setText(_translate("exporterSettings", "Between folders:")) self.cmbSepFF.setItemText(0, _translate("exporterSettings", "Empty line")) self.cmbSepFF.setItemText(1, _translate("exporterSettings", "Custom")) @@ -509,7 +535,7 @@ class Ui_exporterSettings(object): self.cmbSepTF.setItemText(0, _translate("exporterSettings", "Empty line")) self.cmbSepTF.setItemText(1, _translate("exporterSettings", "Custom")) self.txtSepTF.setText(_translate("exporterSettings", "\\n")) - self.toolBox.setItemText(self.toolBox.indexOf(self.page_3), _translate("exporterSettings", "Separations")) + self.toolBox.setItemText(self.toolBox.indexOf(self.separations), _translate("exporterSettings", "Separations")) self.grpTransTypo.setTitle(_translate("exporterSettings", "Typographic replacements:")) self.chkTransEllipse.setText(_translate("exporterSettings", "Replace ... with …")) self.chkTransDash.setText(_translate("exporterSettings", "Replace --- with —")) @@ -528,6 +554,10 @@ class Ui_exporterSettings(object): item = self.tblReplacements.horizontalHeaderItem(3) item.setText(_translate("exporterSettings", "RegExp")) item.setWhatsThis(_translate("exporterSettings", "If checked, uses regular expression for replacement. If unchecked, replaced as plain text.")) - self.toolBox.setItemText(self.toolBox.indexOf(self.page_2), _translate("exporterSettings", "Transformations")) + self.toolBox.setItemText(self.toolBox.indexOf(self.transformations), _translate("exporterSettings", "Transformations")) + self.groupBox.setTitle(_translate("exporterSettings", "Font")) + self.label_7.setText(_translate("exporterSettings", "Font:")) + self.label_8.setText(_translate("exporterSettings", "Font size:")) + self.toolBox.setItemText(self.toolBox.indexOf(self.preview), _translate("exporterSettings", "Preview")) from manuskript.ui.collapsibleGroupBox2 import collapsibleGroupBox2 diff --git a/manuskript/ui/exporters/exporterSettings_ui.ui b/manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui similarity index 90% rename from manuskript/ui/exporters/exporterSettings_ui.ui rename to manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui index eb21118..694f402 100644 --- a/manuskript/ui/exporters/exporterSettings_ui.ui +++ b/manuskript/ui/exporters/manuskript/plainTextSettings_ui.ui @@ -43,18 +43,18 @@ QToolBox::tab:selected, QToolBox::tab:hover{ } - 0 + 3 0 - + 0 0 491 - 824 + 842 @@ -150,7 +150,7 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - Filters what items will be included in the final export. + <html><head/><body><p>Filters what items will be included in the final export.<br/><span style=" color:#773333;">(Not fully implemented yet.)</span></p></body></html> @@ -227,7 +227,15 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + + 0 + 0 + 511 + 522 + + Separations @@ -286,7 +294,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -321,7 +331,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -410,7 +422,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -536,7 +550,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -571,7 +587,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -660,7 +678,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -695,7 +715,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -745,13 +767,13 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + 0 0 511 - 548 + 522 @@ -814,9 +836,6 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - - false - 0 @@ -841,13 +860,13 @@ QToolBox::tab:selected, QToolBox::tab:hover{ false + + Qt::AlignCenter + - - false - @@ -855,9 +874,6 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - - false - 0 @@ -882,6 +898,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ false + + Qt::AlignCenter + @@ -920,9 +939,6 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - - false - 0 @@ -947,13 +963,13 @@ QToolBox::tab:selected, QToolBox::tab:hover{ false + + Qt::AlignCenter + - - false - @@ -961,9 +977,6 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - - false - 0 @@ -988,6 +1001,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ false + + Qt::AlignCenter + @@ -1023,6 +1039,12 @@ QToolBox::tab:selected, QToolBox::tab:hover{ + + + 0 + 0 + + true @@ -1078,7 +1100,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -1091,7 +1115,9 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + + + true @@ -1118,6 +1144,55 @@ QToolBox::tab:selected, QToolBox::tab:hover{ + + + Preview + + + + + + Font + + + + + + Font: + + + + + + + + + + Font size: + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + +