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
+
+
+
+
+
+