From 3a6a8d27f01efd42ace4d95babc1c58fa4510f42 Mon Sep 17 00:00:00 2001 From: calvin Date: Wed, 18 Feb 2009 19:05:16 +0000 Subject: [PATCH] Added help to the GUI client git-svn-id: https://linkchecker.svn.sourceforge.net/svnroot/linkchecker/trunk/linkchecker@3964 e7d03fd6-7b0d-0410-9947-9c21f3af8025 --- TODO.txt | 1 - doc/Makefile | 81 +++++++++++++++++++-------- doc/lccollection.qhc | Bin 0 -> 12288 bytes doc/lccollection.qhcp | 23 ++++++++ doc/lcdoc.qch | Bin 0 -> 29696 bytes doc/lcdoc.qhp | 13 +++++ linkcheck/gui/__init__.py | 71 +++++++++++++++++++++-- linkcheck/gui/linkchecker_ui_main.py | 6 +- linkcheck/gui/ui/main.ui | 6 ++ 9 files changed, 173 insertions(+), 28 deletions(-) create mode 100644 doc/lccollection.qhc create mode 100644 doc/lccollection.qhcp create mode 100644 doc/lcdoc.qch create mode 100644 doc/lcdoc.qhp diff --git a/TODO.txt b/TODO.txt index 878e9cc7..e2a060bf 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,3 +1,2 @@ - [GUI] Store checked links in urldata list; display in a QTreeWidget; columns result (as icon), URL, name; doubleclick opens property popup -- [GUI] Integrate sphinx documentation diff --git a/doc/Makefile b/doc/Makefile index ada3687c..c15d655a 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -11,17 +11,52 @@ PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source -.PHONY: help clean html web pickle htmlhelp latex changes linkcheck homepage test po4a api +.PHONY: help clean html web pickle htmlhelp latex changes linkcheck -all: clean html compress +all: + @echo "Available targets: build-html build-htmlhelp" + +build-html: clean html + +build-htmlhelp: clean htmlhelp helpfiles html: mkdir -p build/html build/doctrees - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html - rm build/html/_static/Makefile build/html/_static/favicon*.png + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/html + rm build/html/_static/Makefile + rm build/html/_static/default.css + rm build/html/_static/*.js + rm build/html/_static/contents.png + rm build/html/_static/plus.png + rm build/html/_static/file.png + rm build/html/_static/minus.png + rm build/html/_static/navigation.png + rm build/html/_static/rightsidebar.css + rm build/html/_static/stickysidebar.css + rm build/html/_static/sphinxdoc.css + rm build/html/_static/traditional.css @echo @echo "Build finished. The HTML pages are in build/html." +htmlhelp: + mkdir -p build/htmlhelp build/doctrees + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp + rm build/htmlhelp/LinkChecker* + rm build/htmlhelp/_static/Makefile + rm build/htmlhelp/_static/default.css + rm build/htmlhelp/_static/*.js + rm build/htmlhelp/_static/contents.png + rm build/htmlhelp/_static/plus.png + rm build/htmlhelp/_static/file.png + rm build/htmlhelp/_static/minus.png + rm build/htmlhelp/_static/navigation.png + rm build/htmlhelp/_static/rightsidebar.css + rm build/htmlhelp/_static/stickysidebar.css + rm build/htmlhelp/_static/sphinxdoc.css + rm build/htmlhelp/_static/traditional.css + @echo + @echo "Build finished. The HTML pages are in build/htmlhelp." + pickle: mkdir -p build/pickle build/doctrees $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle @@ -36,13 +71,6 @@ json: @echo @echo "Build finished; now you can process the JSON files." -htmlhelp: - mkdir -p build/htmlhelp build/doctrees - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in build/htmlhelp." - latex: mkdir -p build/latex build/doctrees $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex @@ -66,24 +94,33 @@ linkcheck: clean: -rm -rf build/* - -homepage: clean html compress - cp -r build/html/* $(HOME)/public_html/linkchecker.sf.net/htdocs + -rm -f *.qhc *.qch test: html xmllint --valid --noout build/html/*.html -po4a: - po4a --localized-charset=UTF-8 po4a.conf - -api: - epydoc --html -o api --name "LinkChecker source documentation" --url ../index.html ../linkcheck/ - - YUICOMP_VERSION=2.4.2 YUICOMP=$(HOME)/src/yuicompressor-$(YUICOMP_VERSION)/build compress: python mediacompress.py --overwrite=png,jpg,gif,js,css \ --js-compressor=$(YUICOMP)/yuicompressor-$(YUICOMP_VERSION).jar \ - build/html + build + + +HELPFILES = lccollection.qhc + +helpfiles: $(HELPFILES) + +%.qhc: %.qhcp lcdoc.qhp + qcollectiongenerator $< -o $@ + + +homepage: build-html compress + cp -r build/html/* $(HOME)/public_html/linkchecker.sf.net/htdocs + +po4a: + po4a --localized-charset=UTF-8 po4a.conf + +api: + epydoc --html -o api --name "LinkChecker source documentation" --url ../index.html ../linkcheck/ diff --git a/doc/lccollection.qhc b/doc/lccollection.qhc new file mode 100644 index 0000000000000000000000000000000000000000..e2f4177569d4a8ee6283fc43272635ad80a95f35 GIT binary patch literal 12288 zcmeHN4OCM{7M}MeB>ao`w;4S7SPUk0t3r)BA{GDad<)@RV-3K>Xi%$ zmJCHfZ7rO0AQ6*5k|jfNQ4A6yK9CC$7fL<~LJ_LEz9G5D5s4tH<3bsw;td6! z7`PTgDMFDjP7I2N>u_j~N3TL{WIQs95G{j}w1z;=NE8r*xC+P{HN9Nqgp|oNhv(}{ z6))DP8Uneb9OfpurAA5Jt$1wpbTj-E#WdLKf<`w4DkU>8hnJ8*729hoNnlZ^l;p!% z0m`Prz0Os&X{$XxI+i{l#y7-IfoAkwW&HnhT0BF}An*%9z>Iz!v8XwSPR4VoIaJ>- zNVONOiZY1J;qm!Yv4O@n#DZ5K9)WDOrhv!Sc!RNfjK*I7$7UicemG2)H_9uI?ctYz z50`_Bk^w!5BBG%r4o=SD@RVkJN+mII+#5maEFeu)d9y@dBYrJYt3MHqEmk6O*VAhZ zw}7P-vp77Fh$^0_flVE0s9owvETVxkG z3`F!1oW=@hw3YwwFhv&^`9Ekqn>S^i&A;d+gBg!O;OC5hi4j?%jp;WK{RXb4-=(i( zgynQ2_QlQk&d*tLMz)t70Xr0f3_8d|n@W_BY3#saCY=ix&V92&*TAgt~ zOmTX&kbyVO8a3DW*jPl-V3=6_ zC|>}h5k$xgnNZ6^m=Ht&K@K#6zJ6t>~$?o zt}wC!mMl4Pqp+{9Zd2DSIkA5V)(Y}{5yzV@#w^iJJN*m$7I9RlnXxsAJlGYLGCh!F|+aXvd_yU%A%m!amn*Au?%YQ9l(r2p^~2lqwqTo#BIE*Ccl zK56x|Sz~Wuv$gr719pqKyjjhK;;g_lpRYcMaSfZYE+}kq*37E7OMVBvT8?ymcf>aH z#En7ewI`1scI|Pl&8axuw!a|wH&UO2`&*N*eX(Mw-tp>9L!+K2&%`?=;VU(0}UqZzn7*EHBJES~%S9Xzpc_9&crD+j7lRp6Q>lprCB1t)TwV z6-lU%*MsPLODzX_F7G(+w6ehmw-yyq-L+@Sy4!CJuJ4q7w61h+;qA+r1|8jpZeqki zX9HGRnRAA|?mu*a8}L?9RjlJwvA8Jt?3re<+l7E@yY`;CNxH9G zeMPZt9^KY$=8zbC^;qW;n@5}cdV10QW80Fy3i{(G)gS-;wJEk+ZkMLGO?z5ldNERz{Y6Pcg$d%xQ^P13+R{jVaY*ZiEl51;4|g#WXt&dISZDQ41xjorx&F`E{N zoj;h|+aCJvfoXH5A1_-q$t`jMZ_3QR<@1f}%+oridPSZ#!Bc1dAvth!)e?)xMrR!i z4#xR!Kj$aqht*lud{`1#y7?v#e9Ns>pC96^xZ~Z*v0dq7b*f3uqCF)WtPlLjx^3t7j{J!YpUKyFXP8{Mdt=Y- z`#1L{?7DkDJf&*cK9?3>vso5r29k^qMF=YwS}yT?Qh)pl<-Bzx)~9)}i4)u|E!yBx+o%kxD?Zu%<+{50)@jqN?<75*9gvd#xkt1p zBC)>Uo%OA~?^i?xPv%UVJSl9uY14W4qt{)!|JGl-C;XfIsspV%o;CGs8oUr&hHh<{ z`@>rPXY-bN{IKZYH-|fBu}h-59<|#v4#$f + + + LinkChecker + build/htmlhelp/_static/favicon16x16.png + bfk/LinkChecker + qthelp://bfk.app.linkchecker/doc/documentation.html + false + false + false + + + + + lcdoc.qhp + lcdoc.qch + + + + lcdoc.qch + + + diff --git a/doc/lcdoc.qch b/doc/lcdoc.qch new file mode 100644 index 0000000000000000000000000000000000000000..c3544d80bafe55ad6abc402fcaf78028a23ad456 GIT binary patch literal 29696 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 JgKRl~{|7`D4$=Ss literal 0 HcmV?d00001 diff --git a/doc/lcdoc.qhp b/doc/lcdoc.qhp new file mode 100644 index 00000000..e000a9f4 --- /dev/null +++ b/doc/lcdoc.qhp @@ -0,0 +1,13 @@ + + + bfk.app.linkchecker + doc + + +
+ + + build/htmlhelp/documentation.html + + + diff --git a/linkcheck/gui/__init__.py b/linkcheck/gui/__init__.py index 0e13e82b..8d3ab242 100644 --- a/linkcheck/gui/__init__.py +++ b/linkcheck/gui/__init__.py @@ -16,13 +16,14 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import os -from PyQt4 import QtCore, QtGui +from PyQt4 import QtCore, QtGui, QtHelp from .linkchecker_ui_main import Ui_MainWindow from .linkchecker_ui_options import Ui_Options from .. import configuration, checker, director, add_intern_pattern, \ strformat from ..containers import enum +DocBaseUrl = "qthelp://bfk.app.linkchecker/doc/build/htmlhelp/" Status = enum('idle', 'checking', 'stopping') @@ -40,15 +41,14 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): else: self.output.setFontFamily("mono") self.checker = Checker() - settings = QtCore.QSettings('bfk', configuration.AppName) settings.beginGroup('mainwindow') - if settings.contains('size'): self.resize(settings.value('size').toSize()) self.move(settings.value('pos').toPoint()) settings.endGroup() - + # Note: we can't use QT assistant here because of the .exe packaging + self.assistant = HelpWindow(self, "doc/lccollection.qhc") self.connect(self.checker, QtCore.SIGNAL("finished()"), self.set_status_idle) self.connect(self.checker, QtCore.SIGNAL("terminated()"), self.set_status_idle) self.connect(self.checker, QtCore.SIGNAL("add_message(QString)"), self.add_message) @@ -57,6 +57,7 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): self.connect(self.optionsButton, QtCore.SIGNAL("clicked()"), self.options.exec_) self.connect(self.actionQuit, QtCore.SIGNAL("triggered()"), self.close) self.connect(self.actionAbout, QtCore.SIGNAL("triggered()"), self.about) + self.connect(self.actionHelp, QtCore.SIGNAL("triggered()"), self.showDocumentation) self.status = Status.idle def get_status (self): @@ -94,6 +95,11 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): """Set idle status. Helper function for signal connections.""" self.status = Status.idle + def showDocumentation (self): + """Show help page.""" + url = QtCore.QUrl("%sindex.html" % DocBaseUrl) + self.assistant.showDocumentation(url) + def closeEvent (self, e=None): """Save settings on close.""" settings = QtCore.QSettings('bfk', configuration.AppName) @@ -187,6 +193,63 @@ Version 2 or later.

self.statusBar.showMessage(msg) +class HelpWindow (QtGui.QDialog): + """A custom help display dialog.""" + + def __init__ (self, parent, qhcpath): + """Initialize dialog and load qhc help project from given path.""" + super(HelpWindow, self).__init__(parent) + self.engine = QtHelp.QHelpEngine(qhcpath, self) + self.engine.setupData() + self.setWindowTitle(u"%s Help" % configuration.AppName) + self.build_ui() + + def build_ui (self): + """Build UI for the help window.""" + splitter = QtGui.QSplitter() + splitter.setOrientation(QtCore.Qt.Vertical) + self.browser = HelpBrowser(splitter, self.engine) + tree = self.engine.contentWidget() + tree.setExpandsOnDoubleClick(False) + splitter.addWidget(tree) + splitter.addWidget(self.browser) + splitter.setSizes((70, 530)) + hlayout = QtGui.QHBoxLayout() + hlayout.addWidget(splitter) + self.setLayout(hlayout) + self.resize(800, 600) + self.connect(self.engine.contentWidget(), + QtCore.SIGNAL("linkActivated(QUrl)"), + self.browser, QtCore.SLOT("setSource(QUrl)")) + + def showDocumentation (self, url): + """Show given URL in help browser.""" + self.browser.setSource(url) + self.show() + + +class HelpBrowser (QtGui.QTextBrowser): + """A QTextBrowser that can handle qthelp:// URLs.""" + + def __init__ (self, parent, engine): + """Initialize and store given HelpEngine instance.""" + super(HelpBrowser, self).__init__(parent) + self.engine = engine + + def setSource (self, url): + if url.scheme() == "http": + import webbrowser + webbrowser.open(str(url.toString())) + else: + QtGui.QTextBrowser.setSource(self, url) + + def loadResource (self, rtype, url): + """Handle qthelp:// URLs, load content from help engine.""" + if url.scheme() == "qthelp": + return QtCore.QVariant(self.engine.fileData(url)) + return QtGui.QTextBrowser.loadResource(self, rtype, url) + + class LinkCheckerOptions (QtGui.QDialog, Ui_Options): """Hold options for current URL to check.""" diff --git a/linkcheck/gui/linkchecker_ui_main.py b/linkcheck/gui/linkchecker_ui_main.py index 1fc38fc3..3e072527 100644 --- a/linkcheck/gui/linkchecker_ui_main.py +++ b/linkcheck/gui/linkchecker_ui_main.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui/main.ui' # -# Created: Sat Jan 24 19:15:50 2009 +# Created: Wed Feb 18 19:58:39 2009 # by: PyQt4 UI code generator 4.4.4 # # WARNING! All changes made in this file will be lost! @@ -72,8 +72,11 @@ class Ui_MainWindow(object): self.actionQuit.setObjectName("actionQuit") self.actionAbout = QtGui.QAction(MainWindow) self.actionAbout.setObjectName("actionAbout") + self.actionHelp = QtGui.QAction(MainWindow) + self.actionHelp.setObjectName("actionHelp") self.menuLinkChecka.addAction(self.actionQuit) self.menuHelp.addAction(self.actionAbout) + self.menuHelp.addAction(self.actionHelp) self.menubar.addAction(self.menuLinkChecka.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) self.label.setBuddy(self.urlinput) @@ -91,5 +94,6 @@ class Ui_MainWindow(object): self.menuHelp.setTitle(QtGui.QApplication.translate("MainWindow", "Help", None, QtGui.QApplication.UnicodeUTF8)) self.actionQuit.setText(QtGui.QApplication.translate("MainWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8)) self.actionAbout.setText(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) + self.actionHelp.setText(QtGui.QApplication.translate("MainWindow", "Help", None, QtGui.QApplication.UnicodeUTF8)) import linkchecker_rc diff --git a/linkcheck/gui/ui/main.ui b/linkcheck/gui/ui/main.ui index 8c2ba822..7145da5f 100644 --- a/linkcheck/gui/ui/main.ui +++ b/linkcheck/gui/ui/main.ui @@ -123,6 +123,7 @@ Help + @@ -138,6 +139,11 @@ About + + + Help + +