diff --git a/nw/config.py b/nw/config.py index 5805396b..94eb21bd 100644 --- a/nw/config.py +++ b/nw/config.py @@ -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 diff --git a/nw/gui/doceditor.py b/nw/gui/doceditor.py index ad90fe13..11acf866 100644 --- a/nw/gui/doceditor.py +++ b/nw/gui/doceditor.py @@ -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): diff --git a/nw/gui/docviewer.py b/nw/gui/docviewer.py index 9aa654ab..b6f3d666 100644 --- a/nw/gui/docviewer.py +++ b/nw/gui/docviewer.py @@ -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 diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py index 8ee7605f..399e6d1b 100644 --- a/nw/gui/mainmenu.py +++ b/nw/gui/mainmenu.py @@ -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 diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 72aa6977..b7b20578 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -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 diff --git a/nw/project/project.py b/nw/project/project.py index da1af818..f468e73d 100644 --- a/nw/project/project.py +++ b/nw/project/project.py @@ -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 diff --git a/nw/themes/default.css b/nw/themes/default.css index e8ca8b82..1d78fe66 100644 --- a/nw/themes/default.css +++ b/nw/themes/default.css @@ -10,7 +10,7 @@ QTextEdit { QTextBrowser { background-color: #141414; color: #c7cfd0; - padding: 40px; + /* padding: 40px; */ } QTreeView, QHeaderView { diff --git a/sample/sampleNovel/nwProject.nwx b/sample/sampleNovel/nwProject.nwx index acaad669..0e68ae5c 100644 --- a/sample/sampleNovel/nwProject.nwx +++ b/sample/sampleNovel/nwProject.nwx @@ -1,5 +1,5 @@ - + Sample Project Sample Project @@ -8,6 +8,8 @@ False + 96b68994dfa3d + 96b68994dfa3d diff --git a/tests/reference/gui/1_nwProject.nwx b/tests/reference/gui/1_nwProject.nwx index 75ab919f..cf0b0f54 100644 --- a/tests/reference/gui/1_nwProject.nwx +++ b/tests/reference/gui/1_nwProject.nwx @@ -6,6 +6,8 @@ False + None + None diff --git a/tests/reference/gui/2_nwProject.nwx b/tests/reference/gui/2_nwProject.nwx index 74949967..33070870 100644 --- a/tests/reference/gui/2_nwProject.nwx +++ b/tests/reference/gui/2_nwProject.nwx @@ -8,6 +8,8 @@ False + None + None diff --git a/tests/reference/gui/3_nwProject.nwx b/tests/reference/gui/3_nwProject.nwx index 632419cb..ecc54350 100644 --- a/tests/reference/gui/3_nwProject.nwx +++ b/tests/reference/gui/3_nwProject.nwx @@ -6,6 +6,8 @@ False + None + None diff --git a/tests/reference/novelwriter.conf b/tests/reference/novelwriter.conf index 5b27daa9..f11f5904 100644 --- a/tests/reference/novelwriter.conf +++ b/tests/reference/novelwriter.conf @@ -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 diff --git a/tests/reference/proj/1_nwProject.nwx b/tests/reference/proj/1_nwProject.nwx index 91f8998d..181e1166 100644 --- a/tests/reference/proj/1_nwProject.nwx +++ b/tests/reference/proj/1_nwProject.nwx @@ -6,6 +6,8 @@ False + None + None diff --git a/tests/reference/proj/2_nwProject.nwx b/tests/reference/proj/2_nwProject.nwx index 8a101717..f9dbdef1 100644 --- a/tests/reference/proj/2_nwProject.nwx +++ b/tests/reference/proj/2_nwProject.nwx @@ -6,6 +6,8 @@ False + None + None diff --git a/tests/test_config.py b/tests/test_config.py index 528b7dcf..a46c3c41 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -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 diff --git a/tests/test_gui.py b/tests/test_gui.py index c9655a0a..681c2116 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -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])