Merge pull request #13 from vkbo/side_preview

Split Pane Preview
This commit is contained in:
Veronica K. Berglyd Olsen
2019-05-18 18:27:31 +02:00
committed by GitHub
16 changed files with 111 additions and 40 deletions
+2 -2
View File
@@ -48,7 +48,7 @@ class Config:
self.guiTheme = "default"
self.winGeometry = [1100, 650]
self.treeColWidth = [120, 30, 50]
self.mainPanePos = [300, 800]
self.mainPanePos = [300, 400, 400]
## Project
self.autoSaveProj = 60
@@ -138,7 +138,7 @@ class Config:
)
if confParser.has_option(cnfSec,"mainpane"):
self.mainPanePos = self.unpackList(
confParser.get(cnfSec,"mainpane"), 2, self.mainPanePos
confParser.get(cnfSec,"mainpane"), 3, self.mainPanePos
)
## Project
+13 -3
View File
@@ -79,7 +79,8 @@ class GuiDocEditor(QTextEdit):
if self.mainConf.doJustify:
self.theDoc.setDefaultTextOption(QTextOption(Qt.AlignJustify))
self.setMinimumWidth(400)
self.setReadOnly(True)
self.setMinimumWidth(300)
self.setAcceptRichText(False)
self.setFontPointSize(self.mainConf.textSize)
@@ -165,11 +166,20 @@ class GuiDocEditor(QTextEdit):
set to True.
"""
if self.mainConf.textFixedW:
vBar = self.verticalScrollBar()
if vBar.isVisible():
sW = vBar.width()
else:
sW = 0
tW = self.width()
sW = self.verticalScrollBar().width()
tM = int((tW - sW - self.mainConf.textWidth)/2)
mTB = self.mainConf.textMargin[0]
self.setViewportMargins(tM,mTB,0,mTB)
if tM >= 10:
self.setViewportMargins(tM,mTB,0,mTB)
self.setLineWrapColumnOrWidth(self.mainConf.textWidth)
else:
self.setViewportMargins(10,mTB,0,mTB)
self.setLineWrapColumnOrWidth(tW - sW - 20)
return
def docAction(self, theAction):
+5
View File
@@ -28,6 +28,11 @@ class GuiDocViewer(QTextBrowser):
self.mainConf = nw.CONFIG
self.theParent = theParent
self.theDoc = self.document()
self.theDoc.setDocumentMargin(self.mainConf.textMargin[0])
self.setMinimumWidth(300)
logger.debug("DocViewer initialisation complete")
return
+9 -9
View File
@@ -98,7 +98,7 @@ class GuiMainMenu(QMenuBar):
self.theProject.setSpellCheck(self.toolsSpellCheck.isChecked())
self.theParent.docEditor.setSpellCheck(self.toolsSpellCheck.isChecked())
logger.verbose("Spell check is set to %s" % str(self.theProject.spellCheck))
return
return True
def _showAbout(self):
msgBox = QMessageBox()
@@ -251,10 +251,10 @@ class GuiMainMenu(QMenuBar):
self.docuMenu.addSeparator()
# Document > Preview
menuItem = QAction(QIcon.fromTheme("text-html"), "Preview Document", self)
menuItem.setStatusTip("Preview Document")
menuItem = QAction(QIcon.fromTheme("text-html"), "View Document", self)
menuItem.setStatusTip("View Document in HTML")
menuItem.setShortcut("Ctrl+R")
menuItem.triggered.connect(self.theParent._previewDocument)
menuItem.triggered.connect(self.theParent.viewDocument)
self.docuMenu.addAction(menuItem)
# # Document > Separator
@@ -292,11 +292,11 @@ class GuiMainMenu(QMenuBar):
self.viewMenu.addAction(menuItem)
# # View > Document Pane 2
# menuItem = QAction(QIcon.fromTheme("go-last"), "Right Document Pane", self)
# menuItem.setStatusTip("Move to Right Document Pane")
# menuItem.setShortcut("Ctrl+3")
# menuItem.triggered.connect(lambda : self.theParent.setFocus(3))
# self.viewMenu.addAction(menuItem)
menuItem = QAction(QIcon.fromTheme("go-last"), "Right Document Pane", self)
menuItem.setStatusTip("Move to Right Document Pane")
menuItem.setShortcut("Ctrl+3")
menuItem.triggered.connect(lambda : self.theParent.setFocus(3))
self.viewMenu.addAction(menuItem)
return
+41 -21
View File
@@ -64,12 +64,6 @@ class GuiMain(QMainWindow):
self.importLabels = []
# Assemble Main Window
self.stackPane = QStackedWidget()
self.stackNone = self.stackPane.addWidget(QWidget())
self.stackDoc = self.stackPane.addWidget(self.docEditor)
self.stackView = self.stackPane.addWidget(self.docViewer)
self.stackPane.setCurrentIndex(self.stackNone)
self.treePane = QFrame()
self.treeBox = QVBoxLayout()
self.treeBox.addWidget(self.treeView)
@@ -78,12 +72,26 @@ class GuiMain(QMainWindow):
self.splitMain = QSplitter(Qt.Horizontal)
self.splitMain.addWidget(self.treePane)
self.splitMain.addWidget(self.stackPane)
self.splitMain.addWidget(self.docEditor)
self.splitMain.addWidget(self.docViewer)
self.splitMain.setSizes(self.mainConf.mainPanePos)
self.splitMain.splitterMoved.connect(self._splitMainMove)
self.setCentralWidget(self.splitMain)
self.idxTree = self.splitMain.indexOf(self.treePane)
self.idxEditor = self.splitMain.indexOf(self.docEditor)
self.idxViewer = self.splitMain.indexOf(self.docViewer)
self.splitMain.setCollapsible(self.idxTree, False)
self.splitMain.setCollapsible(self.idxEditor, False)
self.splitMain.setCollapsible(self.idxViewer, True)
self.docViewer.setVisible(False)
pPos = self.mainConf.mainPanePos
tPos = [pPos[0], pPos[1]+pPos[2]]
self.splitMain.setSizes(tPos)
# Build GUI Elements
self.treeView.itemSelectionChanged.connect(self._treeSingleClick)
self.treeView.itemDoubleClicked.connect(self._treeDoubleClick)
@@ -186,6 +194,10 @@ class GuiMain(QMainWindow):
self.docEditor.setPwl(path.join(self.theProject.projMeta,"wordlist.txt"))
self.docEditor.setSpellCheck(self.theProject.spellCheck)
self.mainMenu.updateMenu()
if self.theProject.lastEdited is not None:
self.openDocument(self.theProject.lastEdited)
if self.theProject.lastViewed is not None:
self.viewDocument(self.theProject.lastViewed)
return True
def saveProject(self):
@@ -204,11 +216,12 @@ class GuiMain(QMainWindow):
def openDocument(self, tHandle):
if self._takeDocumentAction():
self.saveDocument()
self.stackPane.setCurrentIndex(self.stackDoc)
self.docEditor.setText(self.theDocument.openDocument(tHandle))
self.docEditor.setReadOnly(False)
self.docEditor.setCursorPosition(self.theDocument.theItem.cursorPos)
self.docEditor.changeWidth()
self.docEditor.setFocus()
self.theProject.setLastEdited(tHandle)
return True
def saveDocument(self):
@@ -223,24 +236,34 @@ class GuiMain(QMainWindow):
self.docEditor.setDocumentChanged(False)
return True
def _previewDocument(self):
def viewDocument(self, tHandle=None):
tHandle = self.treeView.getSelectedHandle()
if tHandle is None:
tHandle = self.treeView.getSelectedHandle()
if tHandle is None:
logger.warning("No document selected")
return
return False
tItem = self.theProject.getItem(tHandle)
if tItem.itemType == nwItemType.FILE:
logger.debug("Generating preview for item %s" % tHandle)
self.stackPane.setCurrentIndex(self.stackView)
aDoc = ToHtml(self.theProject, self)
aDoc.setText(tHandle)
aDoc.tokenizeText()
aDoc.doConvert()
self.docViewer.setHtml(aDoc.theResult)
self.theProject.setLastViewed(tHandle)
return
bPos = self.splitMain.sizes()
self.docViewer.setVisible(True)
if bPos[2] == 0:
bWidth = bPos[1]+bPos[2]
bPos[1] = int(bWidth/2)
bPos[2] = bWidth-bPos[1]
self.splitMain.setSizes(bPos)
self.docEditor.changeWidth()
return True
##
# Tree Item Actions
@@ -326,8 +349,9 @@ class GuiMain(QMainWindow):
if paneNo == 1:
self.treeView.setFocus()
elif paneNo == 2:
if self.stackPane.currentIndex() == self.stackDoc:
self.docEditor.setFocus()
self.docEditor.setFocus()
elif paneNo == 3:
self.docViewer.setFocus()
return
##
@@ -361,8 +385,6 @@ class GuiMain(QMainWindow):
return True
def _takeDocumentAction(self):
if self.stackPane.currentIndex() != self.stackDoc:
return False
if self.theDocument.theItem is None:
return False
if not self.docEditor.docChanged:
@@ -397,8 +419,7 @@ class GuiMain(QMainWindow):
"""Extend QMainWindow.resizeEvent to signal dependent GUI elements that its pane may have changed size.
"""
QMainWindow.resizeEvent(self,theEvent)
if self.stackPane.currentIndex() == self.stackDoc:
self.docEditor.changeWidth()
self.docEditor.changeWidth()
return
def closeEvent(self, theEvent):
@@ -441,8 +462,7 @@ class GuiMain(QMainWindow):
def _splitMainMove(self, pWidth, pHeight):
"""Alert dependent GUI elements that the main pane splitter has been moved.
"""
if self.stackPane.currentIndex() == self.stackDoc:
self.docEditor.changeWidth()
self.docEditor.changeWidth()
return
# END Class GuiMain
+19 -1
View File
@@ -56,6 +56,8 @@ class NWProject():
self.spellCheck = False
self.statusCols = None
self.importCols = None
self.lastEdited = None
self.lastViewed = None
# Set Defaults
self.clearProject()
@@ -209,6 +211,10 @@ class NWProject():
if xItem.text is None: continue
if xItem.tag == "spellCheck":
self.spellCheck = checkBool(xItem.text,False)
if xItem.tag == "lastEdited":
self.lastEdited = checkString(xItem.text,None,True)
if xItem.tag == "lastViewed":
self.lastViewed = checkString(xItem.text,None,True)
elif xChild.tag == "content":
logger.debug("Found project content")
for xItem in xChild:
@@ -267,6 +273,8 @@ class NWProject():
# Save Project Settings
xSettings = etree.SubElement(nwXML,"settings")
self._saveProjectValue(xSettings,"spellCheck",self.spellCheck)
self._saveProjectValue(xSettings,"lastEdited",self.lastEdited)
self._saveProjectValue(xSettings,"lastViewed",self.lastViewed)
# Save Tree Content
logger.debug("Writing project content")
@@ -335,10 +343,20 @@ class NWProject():
self.setProjectChanged(True)
return True
def setLastEdited(self, tHandle):
self.lastEdited = tHandle
self.setProjectChanged(True)
return True
def setLastViewed(self, tHandle):
self.lastViewed = tHandle
self.setProjectChanged(True)
return True
def setProjectChanged(self, bValue):
self.projChanged = bValue
self.theParent.setProjectStatus(self.projChanged)
return
return self.projChanged
##
# Get Functions
+1 -1
View File
@@ -10,7 +10,7 @@ QTextEdit {
QTextBrowser {
background-color: #141414;
color: #c7cfd0;
padding: 40px;
/* padding: 40px; */
}
QTreeView, QHeaderView {
+3 -1
View File
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="0.1.2" fileVersion="1.0" timeStamp="2019-05-18 13:47:34">
<novelWriterXML appVersion="0.1.3" fileVersion="1.0" timeStamp="2019-05-18 18:12:49">
<project>
<name>Sample Project</name>
<title>Sample Project</title>
@@ -8,6 +8,8 @@
</project>
<settings>
<spellCheck>False</spellCheck>
<lastEdited>96b68994dfa3d</lastEdited>
<lastViewed>96b68994dfa3d</lastViewed>
</settings>
<content count="15">
<item handle="7031beac91f75" order="0" parent="None">
+2
View File
@@ -6,6 +6,8 @@
</project>
<settings>
<spellCheck>False</spellCheck>
<lastEdited>None</lastEdited>
<lastViewed>None</lastViewed>
</settings>
<content count="6">
<item handle="73475cb40a568" order="0" parent="None">
+2
View File
@@ -8,6 +8,8 @@
</project>
<settings>
<spellCheck>False</spellCheck>
<lastEdited>None</lastEdited>
<lastViewed>None</lastViewed>
</settings>
<content count="6">
<item handle="73475cb40a568" order="0" parent="None">
+2
View File
@@ -6,6 +6,8 @@
</project>
<settings>
<spellCheck>False</spellCheck>
<lastEdited>None</lastEdited>
<lastViewed>None</lastViewed>
</settings>
<content count="6">
<item handle="73475cb40a568" order="0" parent="None">
+1 -1
View File
@@ -4,7 +4,7 @@ timestamp = 2019-05-18 15:06:44
[Sizes]
geometry = 1100, 650
treecols = 120, 30, 50
mainpane = 300, 800
mainpane = 300, 400, 400
[Project]
autosaveproject = 60
+2
View File
@@ -6,6 +6,8 @@
</project>
<settings>
<spellCheck>False</spellCheck>
<lastEdited>None</lastEdited>
<lastViewed>None</lastViewed>
</settings>
<content count="6">
<item handle="73475cb40a568" order="None" parent="None">
+2
View File
@@ -6,6 +6,8 @@
</project>
<settings>
<spellCheck>False</spellCheck>
<lastEdited>None</lastEdited>
<lastViewed>None</lastViewed>
</settings>
<content count="10">
<item handle="73475cb40a568" order="None" parent="None">
+1 -1
View File
@@ -70,7 +70,7 @@ def testConfigSetMainPanePos(nwTemp,nwRef):
refConf = path.join(nwRef, "novelwriter.conf")
assert theConf.setMainPanePos([0, 0])
assert theConf.confChanged
assert theConf.setMainPanePos([300, 800])
assert theConf.setMainPanePos([300, 400, 400])
assert theConf.saveConfig()
assert cmpFiles(tmpConf, refConf, [2])
assert not theConf.confChanged
+6
View File
@@ -47,6 +47,8 @@ def testMainWindows(qtbot, nwTempGUI, nwRef):
nwGUI.treeView._getTreeItem("25fc0e7096fc6").setExpanded(True)
nwGUI.treeView._getTreeItem("31489056e0916").setSelected(True)
assert nwGUI.openSelectedItem()
nwGUI.mainMenu.toolsSpellCheck.setChecked(True)
assert nwGUI.mainMenu._toggleSpellCheck()
# Type something into the document
nwGUI.docEditor.setFocus()
@@ -103,6 +105,10 @@ def testMainWindows(qtbot, nwTempGUI, nwRef):
assert nwGUI.saveDocument()
qtbot.wait(stepDelay)
# Open and view the edited document
assert nwGUI.openDocument("31489056e0916")
assert nwGUI.viewDocument("31489056e0916")
# Check the files
projFile = path.join(nwTempGUI,"nwProject.nwx")
assert cmpFiles(projFile, path.join(nwRef,"gui","1_nwProject.nwx"), [2])