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