The local documentation can now be opened if installed, otherwise go to online docs

This commit is contained in:
Veronica K. B. Olsen
2020-08-04 18:49:48 +02:00
parent c695ae903f
commit bf184c4e5a
5 changed files with 103 additions and 19 deletions
+1
View File
@@ -8,6 +8,7 @@
# Documentation # Documentation
/docs/build/ /docs/build/
novelWriter.qch
novelWriter.qhc novelWriter.qhc
# Python Temp # Python Temp
+26 -1
View File
@@ -51,7 +51,7 @@ the following command:
.. code-block:: console .. code-block:: console
python -m pip install -r requirements.txt pip install -r requirements.txt
On some operating systems you need to use ``python3`` instead of ``python``. On some operating systems you need to use ``python3`` instead of ``python``.
@@ -78,6 +78,31 @@ The spell checking extension is optional, but recommended:
The optional spell check library must be at least 3.0.0 to work with Windows. On Linux, 2.0.0 also The optional spell check library must be at least 3.0.0 to work with Windows. On Linux, 2.0.0 also
works fine. works fine.
.. _a_started_depend_docs:
Building Documentation
----------------------
If you installed novelWriter from a package, the documentation should be included. If you're running
novelWriter from the source code, a local copy of this documentation can be generated. It requires
the following Python packages on Debian and Ubuntu.
* ``python3-sphinx``
* ``python3-sphinxcontrib.qthelp``
Or from PyPi:
.. code-block:: console
pip install sphinx sphinxcontrib-qthelp
To build the help packages from the documentation source, run
.. code-block:: console
./setup.py qthelp
from the root source folder.
.. _a_started_running: .. _a_started_running:
+60 -10
View File
@@ -28,7 +28,9 @@
import logging import logging
import nw import nw
from PyQt5.QtCore import QUrl from os import path
from PyQt5.QtCore import QUrl, QProcess
from PyQt5.QtGui import QDesktopServices from PyQt5.QtGui import QDesktopServices
from PyQt5.QtWidgets import QMenuBar, QAction, QMessageBox from PyQt5.QtWidgets import QMenuBar, QAction, QMessageBox
@@ -47,6 +49,10 @@ class GuiMainMenu(QMenuBar):
self.theParent = theParent self.theParent = theParent
self.theProject = theParent.theProject self.theProject = theParent.theProject
self.assistProc = None
self.helpPath = path.join(self.mainConf.assetPath, "help", "novelWriter.qhc")
self.hasHelp = path.isfile(self.helpPath)
self._buildProjectMenu() self._buildProjectMenu()
self._buildDocumentMenu() self._buildDocumentMenu()
self._buildEditMenu() self._buildEditMenu()
@@ -67,6 +73,10 @@ class GuiMainMenu(QMenuBar):
return return
##
# Methods
##
def setAvailableRoot(self): def setAvailableRoot(self):
for itemClass in nwItemClass: for itemClass in nwItemClass:
if itemClass == nwItemClass.NO_CLASS: continue if itemClass == nwItemClass.NO_CLASS: continue
@@ -76,6 +86,25 @@ class GuiMainMenu(QMenuBar):
) )
return return
def closeHelp(self):
"""Close the process used for the Qt Assistant, if it is open.
"""
if self.assistProc is None:
return
if self.assistProc.state() == QProcess.Starting:
if self.assistProc.waitForStarted(10000):
self.assistProc.terminate()
else:
self.assistProc.kill()
elif self.assistProc.state() == QProcess.Running:
self.assistProc.terminate()
if not self.assistProc.waitForFinished(10000):
self.assistProc.kill()
return
## ##
# Update Menu on Settings Changed # Update Menu on Settings Changed
## ##
@@ -134,10 +163,21 @@ class GuiMainMenu(QMenuBar):
msgBox.aboutQt(self.theParent,"About Qt") msgBox.aboutQt(self.theParent,"About Qt")
return True return True
def _openHelp(self): def _openAssistant(self):
"""Open the documentation URL in the system's default browser. """Open the documentation in Qt Assistant.
""" """
QDesktopServices.openUrl(QUrl(nw.__docurl__)) self.assistProc = QProcess(self)
self.assistProc.start("assistant", [
"-collectionFile", self.helpPath, "-enableRemoteControl"
])
if not self.assistProc.waitForStarted(20000):
return False
return True
def _openWebsite(self, theUrl):
"""Open an URL in the system's default browser.
"""
QDesktopServices.openUrl(QUrl(theUrl))
return True return True
def _openIssue(self): def _openIssue(self):
@@ -818,17 +858,27 @@ class GuiMainMenu(QMenuBar):
# Help > Separator # Help > Separator
self.helpMenu.addSeparator() self.helpMenu.addSeparator()
# Document > Preview # Document > Documentation
self.aHelp = QAction("Online Documentation", self) self.aHelp = QAction("Documentation", self)
self.aHelp.setStatusTip("View online documentation") if self.hasHelp:
self.aHelp.setStatusTip("View local documentation with Qt Assistant")
self.aHelp.triggered.connect(self._openAssistant)
else:
self.aHelp.setStatusTip("View online documentation")
self.aHelp.triggered.connect(lambda: self._openWebsite(nw.__docurl__))
self.aHelp.setShortcut("F1") self.aHelp.setShortcut("F1")
self.aHelp.triggered.connect(self._openHelp)
self.helpMenu.addAction(self.aHelp) self.helpMenu.addAction(self.aHelp)
# Document > Go to Website
self.aWebsite = QAction("Open the novelWriter Website", self)
self.aWebsite.setStatusTip("View the main website")
self.aWebsite.triggered.connect(lambda: self._openWebsite(nw.__url__))
self.helpMenu.addAction(self.aWebsite)
# Document > Report Issue # Document > Report Issue
self.aIssue = QAction("Report an Issue", self) self.aIssue = QAction("Report an Issue", self)
self.aIssue.setStatusTip("View online documentation") self.aIssue.setStatusTip("Report a bug or issue on GitHub")
self.aIssue.triggered.connect(self._openIssue) self.aIssue.triggered.connect(lambda: self._openWebsite(nw.__issuesurl__))
self.helpMenu.addAction(self.aIssue) self.helpMenu.addAction(self.aIssue)
return return
+1
View File
@@ -892,6 +892,7 @@ class GuiMain(QMainWindow):
self.mainConf.saveConfig() self.mainConf.saveConfig()
self.reportConfErr() self.reportConfErr()
self.mainMenu.closeHelp()
qApp.quit() qApp.quit()
+15 -8
View File
@@ -17,10 +17,14 @@ if "qthelp" in sys.argv:
sys.argv.remove("qthelp") sys.argv.remove("qthelp")
if buildDocs: if buildDocs:
inFile = os.path.join("docs", "build", "qthelp", "novelWriter.qhcp")
outFile = os.path.join("docs", "build", "qthelp", "novelWriter.qhc") buildDir = os.path.join("docs", "build", "qthelp")
helpDir = os.path.join("nw", "assets", "help") helpDir = os.path.join("nw", "assets", "help")
dstFile = os.path.join(helpDir, "novelWriter.qhc")
inFile = "novelWriter.qhcp"
outFile = "novelWriter.qhc"
datFile = "novelWriter.qch"
print("") print("")
print("Building Documentation") print("Building Documentation")
print("======================") print("======================")
@@ -35,7 +39,7 @@ if buildDocs:
buildFail = True buildFail = True
try: try:
subprocess.call(["qhelpgenerator", inFile]) subprocess.call(["qhelpgenerator", os.path.join(buildDir, inFile)])
except Exception as e: except Exception as e:
print("Failed with error:") print("Failed with error:")
print(str(e)) print(str(e))
@@ -50,9 +54,12 @@ if buildDocs:
buildFail = True buildFail = True
try: try:
if os.path.isfile(dstFile): if os.path.isfile(os.path.join(helpDir, outFile)):
os.unlink(dstFile) os.unlink(os.path.join(helpDir, outFile))
os.rename(outFile, dstFile) if os.path.isfile(os.path.join(helpDir, datFile)):
os.unlink(os.path.join(helpDir, datFile))
os.rename(os.path.join(buildDir, outFile), os.path.join(helpDir, outFile))
os.rename(os.path.join(buildDir, datFile), os.path.join(helpDir, datFile))
except Exception as e: except Exception as e:
print("Failed with error:") print("Failed with error:")
print(str(e)) print(str(e))