97 lines
3.2 KiB
Plaintext
97 lines
3.2 KiB
Plaintext
multiple questions
|
|
==================
|
|
|
|
For modular mode, we should implement a kind of stack: Save the current
|
|
question if any is available, then after exec_() restore it.
|
|
|
|
For async questions, we check if we're currently asking *any* question
|
|
(sync/async), and if so, add the question to a deque instead. After a question
|
|
gets hidden (e.g. in on_mode_left?), we check if another question is in the
|
|
deque, and if so pop and ask it.
|
|
|
|
click inspirations
|
|
===================
|
|
|
|
- Editor: https://github.com/mitsuhiko/click/blob/master/click/_termui_impl.py#L311
|
|
- Types: https://github.com/mitsuhiko/click/blob/master/click/types.py
|
|
|
|
Multiwindow
|
|
===========
|
|
|
|
cmdutils.register (and thus Command) gets argument scope which is global/window
|
|
|
|
when scope=global, instance is searched starting with the application
|
|
singleton.
|
|
|
|
when scope=window, instance is searched starting with the window the command
|
|
was executed in.
|
|
|
|
Each window has its own CommandDispatcher, which adds the window as an
|
|
attribute to every Command before calling the handler. The handler then uses
|
|
this to get the starting point for instance=.
|
|
|
|
|
|
IPC
|
|
===
|
|
|
|
We use QLocalSocket to communicate with another instance
|
|
TODO: find out why many apps just use QLocalSocket as a control channel, and
|
|
shared memory for data.
|
|
Max data size might be 8k, but this is enough for commandline args.
|
|
|
|
http://developer.nokia.com/community/wiki/Qt_IPC_using_QLocalSocket_%26_QLocalServer
|
|
https://www.mail-archive.com/pyqt@riverbankcomputing.com/msg22736.html
|
|
http://stackoverflow.com/a/8795563/2085149
|
|
http://nullege.com/codes/show/src%40n%40i%40ninja-ide2-2.1.1%40ninja_ide%40core%40ipc.py/20/PyQt4.QtNetwork.QLocalSocket/python
|
|
http://nullege.com/codes/show/src%40t%40a%40taurus-3.0.0%40lib%40taurus%40qt%40qtgui%40container%40taurusmainwindow.py/780/PyQt4.QtNetwork.QLocalSocket/python
|
|
http://nullege.com/codes/show/src%40h%40e%40Heliotrope-HEAD%40purple_server.py/95/PyQt4.QtNetwork.QLocalSocket/python
|
|
|
|
|
|
Netscape cookies
|
|
================
|
|
|
|
http://www.cookiecentral.com/faq/#3.5
|
|
https://docs.python.org/3.4/library/http.cookies.html
|
|
http://qt-project.org/doc/qt-4.8/qnetworkcookie.html
|
|
- Second column (flag): TRUE if domain starts with ., else FALSE
|
|
- if a cookie is a http-only cookie domain is prepended with a #HttpOnly_
|
|
- Python's http.cookiejar.MozillaCookieJar might help
|
|
|
|
|
|
|
|
Caching
|
|
=======
|
|
|
|
QNetworkManager.setCache() and use a QNetworkDiskCache probably
|
|
|
|
|
|
Element selection detection
|
|
===========================
|
|
|
|
Possible options:
|
|
- javascript: http://stackoverflow.com/a/2848120/2085149
|
|
- microFocusChanged and check active element via:
|
|
frame = page.currentFrame()
|
|
elem = frame.findFirstElement('*:focus')
|
|
|
|
|
|
Completion view (not QTreeView)
|
|
===============================
|
|
|
|
Perhaps using a QHBoxLayout of QTableViews and creating/destroying them based
|
|
on the completion would be a better idea?
|
|
|
|
|
|
Shutdown
|
|
========
|
|
|
|
Some pointers:
|
|
https://code.google.com/p/webscraping/source/browse/webkit.py
|
|
Simply does setPage(None) in __del__ of webview.
|
|
|
|
http://www.tenox.net/out/wrp11-qt.py
|
|
does del self._window; del self._view; del self._page
|
|
|
|
http://pydoc.net/Python/grab/0.4.5/ghost.ghost/
|
|
does webview.close(); del self.manager; del self.page; del self.mainframe
|