New exporter: initial commit

This commit is contained in:
Olivier Keshavjee 2016-04-01 19:01:27 +02:00
parent 74e9ad3906
commit a53937833d
19 changed files with 1043 additions and 641 deletions

View file

@ -1,32 +1,19 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
import collections
from PyQt5.QtWidgets import qApp
from manuskript.exporter.manuskript import manuskriptExporter
from manuskript.exporter.mmd import mmdExporter
from manuskript.exporter.pandoc import pandocExporter
from manuskript.exporter.arbo import arboExporter
from manuskript.exporter.html import htmlExporter
from manuskript.exporter.odt import odtExporter
exporters = [
manuskriptExporter,
pandocExporter,
mmdExporter
]
formats = collections.OrderedDict([
# Format
# Readable name
# Class
# QFileDialog filter
('html', (
qApp.translate("exporter", "HTML"),
htmlExporter,
qApp.translate("exporter", "HTML Document (*.html)"))),
('arbo', (
qApp.translate("exporter", "Arborescence"),
arboExporter,
None)),
('odt', (
qApp.translate("exporter", "OpenDocument (LibreOffice)"),
odtExporter,
qApp.translate("exporter", "OpenDocument (*.odt)"))),
('epub', (
"ePub (not yet)",
None,
None)),
])
def getExporterByName(name):
for e in exporters:
if e.name == name:
return e
return None

View file

@ -1,46 +0,0 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
from manuskript.functions import mainWindow
class arboExporter():
requires = ["path"]
def __init__(self):
pass
def doCompile(self, path):
# FIXME: overwrites when items have identical names
mw = mainWindow()
root = mw.mdlOutline.rootItem
def writeItem(item, path):
if item.isFolder():
path2 = os.path.join(path, item.title())
try:
os.mkdir(path2)
except FileExistsError:
pass
for c in item.children():
writeItem(c, path2)
else:
ext = ".md"
path2 = os.path.join(path, item.title() + ext)
f = open(path2, "w")
text = self.formatText(item.text(), item.type())
f.write(text)
for c in root.children():
writeItem(c, path)
def formatText(self, text, _type):
if _type == "t2t":
# Empty lines for headers
text = "\n\n\n" + text
return text

View file

@ -1,29 +1,83 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
import re
import shutil
import subprocess
from PyQt5.QtWidgets import QWidget
class basicExporter:
name = ""
description = ""
exportTo = []
cmd = ""
class basicExporter():
def __init__(self):
pass
def runT2T(self, text, target="html"):
@classmethod
def getFormatByName(cls, name):
for f in cls.exportTo:
if f.name == name:
return f
cmdl = ['txt2tags', '-t', target, '--enc=utf-8', '--no-headers', '-o', '-', '-']
return None
cmd = subprocess.Popen(('echo', text), stdout=subprocess.PIPE)
try:
output = subprocess.check_output(cmdl, stdin=cmd.stdout, stderr=subprocess.STDOUT) # , cwd="/tmp"
except subprocess.CalledProcessError as e:
print("Error!")
return text
cmd.wait()
@classmethod
def isValid(cls):
return cls.path() != None
return output.decode("utf-8")
@classmethod
def version(cls):
return ""
def htmlBody(self, text):
text = text.replace("\n", "")
text = re.sub(r".*<body[^>]*?>(.*)</body>.*", "\\1", text)
return text
@classmethod
def path(cls):
return shutil.which(cls.cmd)
@classmethod
def run(cls, args):
r = subprocess.check_output([cls.cmd] + args) # timeout=.2
return r.decode("utf-8")
# Example of how to run a command
#
# cmdl = ['txt2tags', '-t', target, '--enc=utf-8', '--no-headers', '-o', '-', '-']
#
# cmd = subprocess.Popen(('echo', text), stdout=subprocess.PIPE)
# try:
# output = subprocess.check_output(cmdl, stdin=cmd.stdout, stderr=subprocess.STDOUT) # , cwd="/tmp"
# except subprocess.CalledProcessError as e:
# print("Error!")
# return text
# cmd.wait()
#
# return output.decode("utf-8")
class basicFormat:
implemented = False
requires = {
"Settings": False,
"PreviewBefore": False,
"PreviewAfter": False,
}
def __init__(self, name, description=""):
self.name = name
self.description = description
@classmethod
def settingsWidget(self):
return QWidget()
@classmethod
def previewWidgetBefore(self):
return QWidget()
@classmethod
def previewWidgetAfter(self):
return QWidget()

View file

@ -1,71 +0,0 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from manuskript.exporter.basic import basicExporter
from manuskript.functions import mainWindow
class htmlExporter(basicExporter):
requires = ["filename"]
def __init__(self):
pass
def doCompile(self, filename):
mw = mainWindow()
root = mw.mdlOutline.rootItem
html = ""
def appendItem(item):
if item.isFolder():
html = ""
title = "<h{l}>{t}</h{l}>\n".format(
l=str(item.level() + 1),
t=item.title())
html += title
for c in item.children():
html += appendItem(c)
return html
else:
text = self.formatText(item.text(), item.type())
return text
for c in root.children():
html += appendItem(c)
template = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>{TITLE}</title>
</head>
<body>
{BODY}
</body>
</html>"""
f = open(filename, "w")
f.write(template.format(
TITLE="FIXME",
BODY=html))
def formatText(self, text, _type):
if not text:
return text
if _type == "t2t":
text = self.runT2T(text)
elif _type == "txt":
text = text.replace("\n", "<br>")
elif _type == "html":
# keep only body
text = self.htmlBody(text)
return text + "<br>"

View file

@ -0,0 +1,32 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from PyQt5.QtWidgets import QTextEdit
from manuskript.exporter.basic import basicExporter, basicFormat
class markdownFormat(basicFormat):
name = "Markdown"
description = "A lightweigh markup language used by many tools."
implemented = False
requires = {
"Settings": True,
"PreviewBefore": True,
"PreviewAfter": False,
}
@classmethod
def settingsWidget(cls):
sW = QTextEdit()
return sW
class manuskriptExporter(basicExporter):
name = "Manuskript"
description = "Default exporter, provides basic formats used by other exporters."
exportTo = [
markdownFormat
]
@classmethod
def isValid(cls):
return True

View file

@ -0,0 +1,28 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from manuskript.exporter.basic import basicExporter, basicFormat
class mmdExporter(basicExporter):
name = "MultiMarkdown"
description = """<p>A superset of markdown.</p>
<p>Website: <a href="http://fletcherpenney.net/multimarkdown/">http://fletcherpenney.net/multimarkdown/</a></p>
"""
exportTo = [
basicFormat("HTML", "A little known format modestly used. You know, web sites for example."),
basicFormat("latex", ""),
basicFormat("OpenDocument", "OpenDocument format. Used by LibreOffice for example."),
basicFormat("ePub", "Books that don't kill trees."),
]
cmd = "mmd"
@classmethod
def version(cls):
if cls.isValid():
r = cls.run(["-v"])
return r.split("\n")[1]
else:
return ""

View file

@ -1,74 +0,0 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
import sys
from PyQt5.QtGui import QTextDocument
from libs.odf.opendocument import OpenDocumentText
from libs.odf.text import H, P
from manuskript.exporter.basic import basicExporter
from manuskript.functions import appPath
from manuskript.functions import mainWindow
sys.path.append(os.path.join(appPath(), "libs"))
class odtExporter(basicExporter):
requires = ["filename"]
def __init__(self):
pass
def doCompile(self, filename):
mw = mainWindow()
root = mw.mdlOutline.rootItem
doc = OpenDocumentText()
def appendItem(item):
if item.isFolder():
self.addHeading(item.title(), item.level() + 1, doc)
for c in item.children():
appendItem(c)
else:
text = self.formatText(item.text(), item.type())
if text:
for l in text.split("\n"):
self.addParagraph(l, doc)
for c in root.children():
appendItem(c)
doc.save(filename)
def formatText(self, text, _type):
if not text:
return text
# if _type == "t2t":
# text = self.runT2T(text)
# elif _type == "txt":
# text = text.replace("\n", "<br>")
elif _type == "html":
doc = QTextDocument()
doc.setHtml(text)
text = doc.toPlainText()
# text = self.htmlBody(text)
return text
def addHeading(self, text, level, doc):
doc.text.addElement(H(outlinelevel=int(level), text=text))
return doc
def addParagraph(self, text, doc):
p = P(stylename="Text Body", text=text)
doc.text.addElement(p)
return doc

View file

@ -1,59 +0,0 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from PyQt5.QtGui import QTextDocument, QTextCursor, QTextDocumentWriter
from manuskript.exporter.basic import basicExporter
from manuskript.functions import mainWindow
class odtExporter(basicExporter):
requires = ["filename"]
def __init__(self):
pass
def doCompile(self, filename):
mw = mainWindow()
root = mw.mdlOutline.rootItem
doc = QTextDocument()
cursor = QTextCursor(doc)
def appendItem(item):
if item.isFolder():
cursor.setPosition(doc.characterCount() - 1)
title = "<h{l}>{t}</h{l}><br>\n".format(
l=str(item.level() + 1),
t=item.title())
cursor.insertHtml(title)
for c in item.children():
appendItem(c)
else:
text = self.formatText(item.text(), item.type())
cursor.setPosition(doc.characterCount() - 1)
cursor.insertHtml(text)
for c in root.children():
appendItem(c)
dw = QTextDocumentWriter(filename, "odt")
dw.write(doc)
def formatText(self, text, _type):
if not text:
return text
if _type == "t2t":
text = self.runT2T(text)
elif _type == "txt":
text = text.replace("\n", "<br>")
elif _type == "html":
text = self.htmlBody(text)
return text + "<br>"

View file

@ -0,0 +1,42 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from manuskript.exporter.basic import basicExporter, basicFormat
class HTMLFormat(basicFormat):
name = "HTML"
description = "A little known format modestly used. You know, web sites for example."
implemented = False
requires = {
"Settings": True,
"PreviewBefore": True,
"PreviewAfter": True,
}
class pandocExporter(basicExporter):
name = "Pandoc"
description = """<p>A universal document convertor. Can be used to convert markdown to a wide range of other
formats.</p>
<p>Website: <a href="http://www.pandoc.org">http://pandoc.org/</a></p>
"""
exportTo = [
HTMLFormat,
basicFormat("ePub", "Books that don't kill trees."),
basicFormat("OpenDocument", ""),
basicFormat("PDF", "Needs latex to be installed."),
basicFormat("DocX", "Microsoft Office (.docx) document."),
]
cmd = "pandoc"
@classmethod
def version(cls):
if cls.isValid():
r = cls.run(["-v"])
return r.split("\n")[0]
else:
return ""

View file

@ -18,7 +18,7 @@ from manuskript.models.plotModel import plotModel
from manuskript.models.worldModel import worldModel
from manuskript.settingsWindow import settingsWindow
from manuskript.ui.collapsibleDockWidgets import collapsibleDockWidgets
from manuskript.ui.compileDialog import compileDialog
from manuskript.ui.exporters.exporter import exporterDialog
from manuskript.ui.helpLabel import helpLabel
from manuskript.ui.mainWindow import Ui_MainWindow
from manuskript.ui.tools.frequencyAnalyzer import frequencyAnalyzer
@ -1077,5 +1077,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
###############################################################################
def doCompile(self):
self.compileDialog = compileDialog()
self.compileDialog.show()
self.dialog = exporterDialog()
self.dialog.show()
r = self.dialog.geometry()
r2 = self.geometry()
self.dialog.move(r2.center() - r.center())

View file

@ -1,102 +0,0 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog, qApp, QFileDialog
from manuskript import exporter
from manuskript.ui.compileDialog_ui import Ui_compileDialog
class compileDialog(QDialog, Ui_compileDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.setupUi(self)
self.btnPath.clicked.connect(self.getPath)
self.btnFilename.clicked.connect(self.getFilename)
self.btnCompile.clicked.connect(self.doCompile)
self.cmbTargets.activated.connect(self.updateUI)
self.txtPath.setText("/home/olivier/Documents/Travail/Geekeries/Python/manuskript/ExportTest")
self.txtFilename.setText("/home/olivier/Documents/Travail/Geekeries/Python/manuskript/ExportTest/test.html")
self.populatesTarget()
self.updateUI()
###############################################################################
# UI
###############################################################################
def populatesTarget(self):
for code in exporter.formats:
self.cmbTargets.addItem(exporter.formats[code][0], code)
def updateUI(self):
target = self.cmbTargets.currentData()
if not exporter.formats[target][1]:
self.btnCompile.setEnabled(False)
requires = []
else:
self.btnCompile.setEnabled(True)
requires = exporter.formats[target][1].requires
self.wPath.setVisible("path" in requires)
self.wFilename.setVisible("filename" in requires)
def startWorking(self):
# Setting override cursor
qApp.setOverrideCursor(Qt.WaitCursor)
# Button
self.btnCompile.setEnabled(False)
self.txtBtn = self.btnCompile.text()
self.btnCompile.setText(self.tr("Working..."))
def stopWorking(self):
# Removing override cursor
qApp.restoreOverrideCursor()
# Button
self.btnCompile.setEnabled(True)
self.btnCompile.setText(self.txtBtn)
###############################################################################
# USER INPUTS
###############################################################################
def getPath(self):
path = self.txtPath.text()
path = QFileDialog.getExistingDirectory(self, self.tr("Chose export folder"), path)
if path:
self.txtPath.setText(path)
def getFilename(self):
fn = self.txtFilename.text()
target = self.cmbTargets.currentData()
fltr = exporter.formats[target][2]
fn = QFileDialog.getSaveFileName(self, self.tr("Chose export target"), fn, fltr)
if fn[0]:
self.txtFilename.setText(fn[0])
###############################################################################
# COMPILE
###############################################################################
def doCompile(self):
target = self.cmbTargets.currentData()
self.startWorking()
if target == "arbo":
compiler = exporter.formats[target][1]()
compiler.doCompile(self.txtPath.text())
elif target in ["html", "odt"]:
compiler = exporter.formats[target][1]()
compiler.doCompile(self.txtFilename.text())
self.stopWorking()

View file

@ -1,89 +0,0 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'manuskript/ui/compileDialog_ui.ui'
#
# Created: Wed Mar 2 00:30:17 2016
# by: PyQt5 UI code generator 5.2.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_compileDialog(object):
def setupUi(self, compileDialog):
compileDialog.setObjectName("compileDialog")
compileDialog.resize(627, 343)
compileDialog.setModal(True)
self.verticalLayout = QtWidgets.QVBoxLayout(compileDialog)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.label = QtWidgets.QLabel(compileDialog)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.cmbTargets = QtWidgets.QComboBox(compileDialog)
self.cmbTargets.setObjectName("cmbTargets")
self.horizontalLayout.addWidget(self.cmbTargets)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.verticalLayout.addLayout(self.horizontalLayout)
self.wPath = QtWidgets.QWidget(compileDialog)
self.wPath.setObjectName("wPath")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.wPath)
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_2 = QtWidgets.QLabel(self.wPath)
self.label_2.setObjectName("label_2")
self.horizontalLayout_3.addWidget(self.label_2)
self.txtPath = QtWidgets.QLineEdit(self.wPath)
self.txtPath.setObjectName("txtPath")
self.horizontalLayout_3.addWidget(self.txtPath)
self.btnPath = QtWidgets.QPushButton(self.wPath)
self.btnPath.setObjectName("btnPath")
self.horizontalLayout_3.addWidget(self.btnPath)
self.verticalLayout.addWidget(self.wPath)
self.wFilename = QtWidgets.QWidget(compileDialog)
self.wFilename.setObjectName("wFilename")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.wFilename)
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_3 = QtWidgets.QLabel(self.wFilename)
self.label_3.setObjectName("label_3")
self.horizontalLayout_4.addWidget(self.label_3)
self.txtFilename = QtWidgets.QLineEdit(self.wFilename)
self.txtFilename.setObjectName("txtFilename")
self.horizontalLayout_4.addWidget(self.txtFilename)
self.btnFilename = QtWidgets.QPushButton(self.wFilename)
self.btnFilename.setObjectName("btnFilename")
self.horizontalLayout_4.addWidget(self.btnFilename)
self.verticalLayout.addWidget(self.wFilename)
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem2)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem3)
self.btnCompile = QtWidgets.QPushButton(compileDialog)
self.btnCompile.setObjectName("btnCompile")
self.horizontalLayout_2.addWidget(self.btnCompile)
self.btnCancel = QtWidgets.QPushButton(compileDialog)
self.btnCancel.setObjectName("btnCancel")
self.horizontalLayout_2.addWidget(self.btnCancel)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.retranslateUi(compileDialog)
QtCore.QMetaObject.connectSlotsByName(compileDialog)
def retranslateUi(self, compileDialog):
_translate = QtCore.QCoreApplication.translate
compileDialog.setWindowTitle(_translate("compileDialog", "Dialog"))
self.label.setText(_translate("compileDialog", "Compile as:"))
self.label_2.setText(_translate("compileDialog", "Folder:"))
self.btnPath.setText(_translate("compileDialog", "..."))
self.label_3.setText(_translate("compileDialog", "File name:"))
self.btnFilename.setText(_translate("compileDialog", "..."))
self.btnCompile.setText(_translate("compileDialog", "Compile"))
self.btnCancel.setText(_translate("compileDialog", "Cancel"))

View file

@ -1,154 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>compileDialog</class>
<widget class="QDialog" name="compileDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>627</width>
<height>343</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Compile as:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cmbTargets"/>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="wPath" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Folder:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="txtPath"/>
</item>
<item>
<widget class="QPushButton" name="btnPath">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="wFilename" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>File name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="txtFilename"/>
</item>
<item>
<widget class="QPushButton" name="btnFilename">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnCompile">
<property name="text">
<string>Compile</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnCancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -0,0 +1,88 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
from collections import OrderedDict
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QColor
from PyQt5.QtWidgets import QWidget, QVBoxLayout
from manuskript import exporter
from manuskript.functions import lightBlue
from manuskript.ui.exporters.exporter_ui import Ui_exporter
from manuskript.ui.exporters.exportersManager import exportersManager
class exporterDialog(QWidget, Ui_exporter):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
# Var
self.currentExporter = None
# Populates lite
self.cmbExporters.clear()
for E in exporter.exporters:
if not E.isValid():
continue
self.cmbExporters.addItem(E.name)
self.cmbExporters.setItemData(self.cmbExporters.count() - 1, QBrush(QColor(Qt.darkBlue)), Qt.ForegroundRole)
self.cmbExporters.setItemData(self.cmbExporters.count() - 1, QBrush(lightBlue()), Qt.BackgroundRole)
item = self.cmbExporters.model().item(self.cmbExporters.count() - 1)
item.setFlags(Qt.ItemIsEnabled)
for f in E.exportTo:
name = f.name if f.implemented else self.tr("{} (not implemented yet)").format(f.name)
self.cmbExporters.addItem(name, E.name)
self.btnManageExporters.clicked.connect(self.openManager)
self.cmbExporters.currentIndexChanged.connect(self.updateUi)
self.cmbExporters.setCurrentIndex(1)
def updateUi(self, index):
name = self.cmbExporters.currentText()
exporterName = self.cmbExporters.currentData()
E = exporter.getExporterByName(exporterName)
if not E:
self.setWidgetsEnabled(False)
return
F = E.getFormatByName(name)
if not F or not F.implemented:
self.setWidgetsEnabled(False)
return
self.setWidgetsEnabled(True)
self.grpSettings.setVisible(F.requires["Settings"])
self.grpPreviewBefore.setVisible(F.requires["PreviewBefore"])
self.grpPreviewAfter.setVisible(F.requires["PreviewAfter"])
# if F.requires["Settings"]:
# self.settingsWidget = F.settingsWidget()
#
# if F.requires["PreviewBefore"]:
# self.previewBefore = F.previewWidgetBefore()
#
# if F.requires["PreviewAfter"]:
# self.previewAfter = F.previewWidgetAfter()
def setWidgetsEnabled(self, value):
self.grpSettings.setEnabled(value)
self.grpPreviewBefore.setEnabled(value)
self.grpPreviewAfter.setEnabled(value)
def openManager(self):
self.dialog = exportersManager()
self.dialog.show()
r = self.dialog.geometry()
r2 = self.geometry()
self.dialog.move(r2.center() - r.center())

View file

@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'manuskript/ui/exporters/exporter_ui.ui'
#
# Created by: PyQt5 UI code generator 5.4.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_exporter(object):
def setupUi(self, exporter):
exporter.setObjectName("exporter")
exporter.resize(792, 502)
self.verticalLayout = QtWidgets.QVBoxLayout(exporter)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.label = QtWidgets.QLabel(exporter)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.cmbExporters = QtWidgets.QComboBox(exporter)
self.cmbExporters.setObjectName("cmbExporters")
self.horizontalLayout.addWidget(self.cmbExporters)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.btnManageExporters = QtWidgets.QPushButton(exporter)
self.btnManageExporters.setObjectName("btnManageExporters")
self.horizontalLayout.addWidget(self.btnManageExporters)
self.verticalLayout.addLayout(self.horizontalLayout)
self.splitter = QtWidgets.QSplitter(exporter)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter")
self.grpSettings = QtWidgets.QGroupBox(self.splitter)
self.grpSettings.setObjectName("grpSettings")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.grpSettings)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.settings = QtWidgets.QWidget(self.grpSettings)
self.settings.setObjectName("settings")
self.verticalLayout_3.addWidget(self.settings)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.pushButton = QtWidgets.QPushButton(self.grpSettings)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout_2.addWidget(self.pushButton)
self.verticalLayout_3.addLayout(self.horizontalLayout_2)
self.grpPreviewBefore = QtWidgets.QGroupBox(self.splitter)
self.grpPreviewBefore.setObjectName("grpPreviewBefore")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.grpPreviewBefore)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.previewBefore = QtWidgets.QWidget(self.grpPreviewBefore)
self.previewBefore.setObjectName("previewBefore")
self.verticalLayout_2.addWidget(self.previewBefore)
self.grpPreviewAfter = QtWidgets.QGroupBox(self.splitter)
self.grpPreviewAfter.setObjectName("grpPreviewAfter")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.grpPreviewAfter)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.previewAfter = QtWidgets.QWidget(self.grpPreviewAfter)
self.previewAfter.setObjectName("previewAfter")
self.verticalLayout_4.addWidget(self.previewAfter)
self.verticalLayout.addWidget(self.splitter)
self.retranslateUi(exporter)
QtCore.QMetaObject.connectSlotsByName(exporter)
def retranslateUi(self, exporter):
_translate = QtCore.QCoreApplication.translate
exporter.setWindowTitle(_translate("exporter", "Export"))
self.label.setText(_translate("exporter", "Export to:"))
self.btnManageExporters.setText(_translate("exporter", "Manage exporters"))
self.grpSettings.setTitle(_translate("exporter", "Settings"))
self.pushButton.setText(_translate("exporter", "Show Intermediate Preview"))
self.grpPreviewBefore.setTitle(_translate("exporter", "Preview"))
self.grpPreviewAfter.setTitle(_translate("exporter", "Preview"))

View file

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>exporter</class>
<widget class="QWidget" name="exporter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>792</width>
<height>502</height>
</rect>
</property>
<property name="windowTitle">
<string>Export</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Export to:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cmbExporters"/>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnManageExporters">
<property name="text">
<string>Manage exporters</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QGroupBox" name="grpSettings">
<property name="title">
<string>Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QWidget" name="settings" native="true"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Show Intermediate Preview</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="grpPreviewBefore">
<property name="title">
<string>Preview</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QWidget" name="previewBefore" native="true"/>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="grpPreviewAfter">
<property name="title">
<string>Preview</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QWidget" name="previewAfter" native="true"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -0,0 +1,99 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
from collections import OrderedDict
from PyQt5.QtCore import QSize
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget
from manuskript import exporter
from manuskript.ui.exporters.exportersManager_ui import Ui_ExportersManager
class exportersManager(QWidget, Ui_ExportersManager):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
# Var
self.currentExporter = None
# Populates lite
self.lstExporters.clear()
for E in exporter.exporters:
self.lstExporters.addItem(E.name)
# UI
for i in range(self.lstExporters.count()):
item = self.lstExporters.item(i)
item.setSizeHint(QSize(item.sizeHint().width(), 42))
item.setTextAlignment(Qt.AlignCenter)
self.lstExporters.setMaximumWidth(150)
self.lstExporters.setMinimumWidth(150)
self.lstExporters.currentTextChanged.connect(self.updateUi)
self.lstExportTo.currentTextChanged.connect(self.updateFormatDescription)
self.lstExporters.setCurrentRow(0)
def updateUi(self, name):
E = exporter.getExporterByName(name)
self.currentExporter = E
if not E:
self.stack.setEnabled(False)
return
self.stack.setEnabled(True)
# Updates name and description
self.lblExporterName.setText(E.name)
self.lblExporterDescription.setText(E.description)
# Updates formats
self.lstExportTo.clear()
for f in E.exportTo:
self.lstExportTo.addItem(f.name)
self.lstExportTo.setMaximumWidth(120)
self.lstExportTo.setMinimumWidth(120)
self.lstExportTo.setCurrentRow(0)
# Updates path & version
self.grpPath.setVisible(E.name != "Manuskript") # We hide if exporter is manuskript
# Installed
if E.isValid():
self.lblStatus.setText(self.tr("Installed"))
self.lblStatus.setStyleSheet("color: darkGreen;")
self.lblHelpText.setVisible(False)
self.lblVersion.setVisible(True)
self.lblVersionName.setVisible(True)
else:
self.lblStatus.setText(self.tr("Not found"))
self.lblStatus.setStyleSheet("color: red;")
self.lblHelpText.setVisible(True)
self.lblHelpText.setText(self.tr("{} not found. Install it, or set path manually.").format(name))
self.lblVersion.setVisible(False)
self.lblVersionName.setVisible(False)
# Version
self.lblVersion.setText(E.version())
# Path
self.txtPath.setText(E.path())
def updateFormatDescription(self, name):
if self.currentExporter:
f = self.currentExporter.getFormatByName(name)
if not f:
self.lblExportToDescription.setText("")
else:
self.lblExportToDescription.setText("<b>{}:</b> {}".format(
name,
f.description))

View file

@ -0,0 +1,177 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'manuskript/ui/exporters/exportersManager_ui.ui'
#
# Created by: PyQt5 UI code generator 5.4.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_ExportersManager(object):
def setupUi(self, ExportersManager):
ExportersManager.setObjectName("ExportersManager")
ExportersManager.resize(658, 439)
self.horizontalLayout_8 = QtWidgets.QHBoxLayout(ExportersManager)
self.horizontalLayout_8.setObjectName("horizontalLayout_8")
self.lstExporters = QtWidgets.QListWidget(ExportersManager)
self.lstExporters.setObjectName("lstExporters")
item = QtWidgets.QListWidgetItem()
self.lstExporters.addItem(item)
self.horizontalLayout_8.addWidget(self.lstExporters)
self.stack = QtWidgets.QWidget(ExportersManager)
self.stack.setObjectName("stack")
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.stack)
self.verticalLayout_7.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_7.setObjectName("verticalLayout_7")
self.lblExporterName = QtWidgets.QLabel(self.stack)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.lblExporterName.sizePolicy().hasHeightForWidth())
self.lblExporterName.setSizePolicy(sizePolicy)
self.lblExporterName.setStyleSheet("background-color:lightBlue;\n"
"border:none;\n"
"padding:10px;\n"
"color:darkBlue;\n"
"font-size:16px;\n"
"font-weight:bold;\n"
"text-align:center;")
self.lblExporterName.setText("{Exporter Name}")
self.lblExporterName.setAlignment(QtCore.Qt.AlignCenter)
self.lblExporterName.setObjectName("lblExporterName")
self.verticalLayout_7.addWidget(self.lblExporterName)
self.grpDescription = QtWidgets.QGroupBox(self.stack)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.grpDescription.setFont(font)
self.grpDescription.setObjectName("grpDescription")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.grpDescription)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.lblExporterDescription = QtWidgets.QLabel(self.grpDescription)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.lblExporterDescription.setFont(font)
self.lblExporterDescription.setText("{ExporterDescription}")
self.lblExporterDescription.setWordWrap(True)
self.lblExporterDescription.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
self.lblExporterDescription.setObjectName("lblExporterDescription")
self.verticalLayout_5.addWidget(self.lblExporterDescription)
self.verticalLayout_7.addWidget(self.grpDescription)
self.grpExportTo = QtWidgets.QGroupBox(self.stack)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.grpExportTo.setFont(font)
self.grpExportTo.setObjectName("grpExportTo")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.grpExportTo)
self.horizontalLayout.setObjectName("horizontalLayout")
self.lstExportTo = QtWidgets.QListWidget(self.grpExportTo)
self.lstExportTo.setObjectName("lstExportTo")
self.horizontalLayout.addWidget(self.lstExportTo)
self.frame = QtWidgets.QFrame(self.grpExportTo)
self.frame.setFrameShape(QtWidgets.QFrame.NoFrame)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.lblExportToDescription = QtWidgets.QLabel(self.frame)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.lblExportToDescription.setFont(font)
self.lblExportToDescription.setText("{FormatDescription}")
self.lblExportToDescription.setWordWrap(True)
self.lblExportToDescription.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
self.lblExportToDescription.setObjectName("lblExportToDescription")
self.verticalLayout.addWidget(self.lblExportToDescription)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.horizontalLayout.addWidget(self.frame)
self.verticalLayout_7.addWidget(self.grpExportTo)
self.grpPath = QtWidgets.QGroupBox(self.stack)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.grpPath.setFont(font)
self.grpPath.setObjectName("grpPath")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.grpPath)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.formLayout = QtWidgets.QFormLayout()
self.formLayout.setObjectName("formLayout")
self.label_2 = QtWidgets.QLabel(self.grpPath)
self.label_2.setObjectName("label_2")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_2)
self.lblStatus = QtWidgets.QLabel(self.grpPath)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.lblStatus.setFont(font)
self.lblStatus.setText("{ExporterStatus}")
self.lblStatus.setObjectName("lblStatus")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lblStatus)
self.lblVersionName = QtWidgets.QLabel(self.grpPath)
self.lblVersionName.setObjectName("lblVersionName")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.lblVersionName)
self.lblVersion = QtWidgets.QLabel(self.grpPath)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.lblVersion.setFont(font)
self.lblVersion.setText("{ExporterVersion}")
self.lblVersion.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
self.lblVersion.setObjectName("lblVersion")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lblVersion)
self.verticalLayout_2.addLayout(self.formLayout)
self.lblHelpText = QtWidgets.QLabel(self.grpPath)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.lblHelpText.setFont(font)
self.lblHelpText.setWordWrap(True)
self.lblHelpText.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
self.lblHelpText.setObjectName("lblHelpText")
self.verticalLayout_2.addWidget(self.lblHelpText)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.txtPath = QtWidgets.QLineEdit(self.grpPath)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.txtPath.setFont(font)
self.txtPath.setObjectName("txtPath")
self.horizontalLayout_2.addWidget(self.txtPath)
self.btnSetPath = QtWidgets.QPushButton(self.grpPath)
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
self.btnSetPath.setFont(font)
self.btnSetPath.setObjectName("btnSetPath")
self.horizontalLayout_2.addWidget(self.btnSetPath)
self.verticalLayout_2.addLayout(self.horizontalLayout_2)
self.verticalLayout_7.addWidget(self.grpPath)
self.horizontalLayout_8.addWidget(self.stack)
self.retranslateUi(ExportersManager)
QtCore.QMetaObject.connectSlotsByName(ExportersManager)
def retranslateUi(self, ExportersManager):
_translate = QtCore.QCoreApplication.translate
ExportersManager.setWindowTitle(_translate("ExportersManager", "Manage Exporters"))
__sortingEnabled = self.lstExporters.isSortingEnabled()
self.lstExporters.setSortingEnabled(False)
item = self.lstExporters.item(0)
item.setText(_translate("ExportersManager", "Manuskript"))
self.lstExporters.setSortingEnabled(__sortingEnabled)
self.grpDescription.setTitle(_translate("ExportersManager", "Description"))
self.grpExportTo.setTitle(_translate("ExportersManager", "Offers export to"))
self.grpPath.setTitle(_translate("ExportersManager", "Path"))
self.label_2.setText(_translate("ExportersManager", "Status:"))
self.lblVersionName.setText(_translate("ExportersManager", "Version:"))
self.lblHelpText.setText(_translate("ExportersManager", "{HelpText}"))
self.btnSetPath.setText(_translate("ExportersManager", "..."))

View file

@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ExportersManager</class>
<widget class="QWidget" name="ExportersManager">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>658</width>
<height>439</height>
</rect>
</property>
<property name="windowTitle">
<string>Manage Exporters</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QListWidget" name="lstExporters">
<item>
<property name="text">
<string>Manuskript</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QWidget" name="stack" native="true">
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="lblExporterName">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color:lightBlue;
border:none;
padding:10px;
color:darkBlue;
font-size:16px;
font-weight:bold;
text-align:center;</string>
</property>
<property name="text">
<string notr="true">{Exporter Name}</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="grpDescription">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Description</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QLabel" name="lblExporterDescription">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string notr="true">{ExporterDescription}</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="grpExportTo">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Offers export to</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QListWidget" name="lstExportTo"/>
</item>
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="lblExportToDescription">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string notr="true">{FormatDescription}</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="grpPath">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Path</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Status:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="lblStatus">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string notr="true">{ExporterStatus}</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lblVersionName">
<property name="text">
<string>Version:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="lblVersion">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string notr="true">{ExporterVersion}</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="lblHelpText">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>{HelpText}</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="txtPath">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnSetPath">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>