[Qgis-developer] [New Feature] - AutoCompletion for QGIS Python Console based on QScintilla2

Larry Shaffer larrys at dakotacarto.com
Tue Sep 4 12:12:59 PDT 2012


Hi Salvatore,

On Tue, Sep 4, 2012 at 9:13 AM, Salvatore Larosa <lrssvtml at gmail.com> wrote:
> Hello everyone, I am working to implement the auto complete in QGIS
> python console.
> At the time, I came to this result: [1]

That looks great already! Very welcome addition.

> Still a few things missing:
> 1) run command with multi-line text
> 2) styled text for errors, traceback, message etc.

If you're thinking of tinkering with the traceback output dialog,
please consider some of the suggestions put forth here [0], which
include more complete frame info, like variables, etc. There is
already good sample code for this in the Django project debug output
(as mentioned by Martin)[1].

For styling purposes, it may be possible to output the traceback in
HTML, like with Django, then style it with CSS in a QWebView (see
Martin's initial response to my post).

[0] http://osgeo-org.1560.n6.nabble.com/Changes-to-python-utils-py-td4977090.html
[1] https://github.com/django/django/blob/master/django/views/debug.py

> 3) fix up events when keys are pressed (keyPressEvent)
> 4) other minor errors.
>
> Basically I changed the class QTextEdit with QsciScintilla using
> pieces of code from [2]
> and, for API syntax, the files provided by Larry Shaffer (thanks).
>
> I'm having some difficulties as disable the undo/redo and I can not
> use styles to the text (font, color, etc) if the Lexer is enabled!

Concerning undo, it looks like you can't turn it off, but maybe you
can just make sure its buffer is always emptied if it contains
anything instead? (not tested)

Qsci-object.SendScintilla(QsciScintilla.SCI_EMPTYUNDOBUFFER)


Concerning styles, some are set for the Qsci object and some are set
for its currently bound lexer (I assume you are using
QsciLexerPython). I believe styles can be adjusted either before the
lexer is applied or after (though you may have to clear them first, if
after).

For examples of doing this see Eric4 source here [0], specifically
__setTextDisplay() method for styling Qsci object at line #2156 and
here[1] for info on setting lexer style blocks. For the lexer styles,
you instantiate the lexer then override the styles you want using
their lexer-specific enum value as a reference (e.g. keyword, number,
operator, etc.) [2], then apply the lexer to the Qsci object:

lexer-object.setColor(QColor, 1) # for setting color of operators

If you change the coloring styles, I believe you lastly need to call
Qsci-object.recolor().

[0] http://die-offenbachs.homelinux.org:48888/viewvc/eric4%20IDE/eric4/trunk/QScintilla/MiniEditor.py?view=markup
[1] http://die-offenbachs.homelinux.org:48888/viewvc/eric4%20IDE/eric4/trunk/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py?view=markup
[2] http://www.riverbankcomputing.co.uk/static/Docs/QScintilla2/classQsciLexer.html
, http://www.riverbankcomputing.co.uk/static/Docs/QScintilla2/classQsciLexerPython.html


> Any feedback and help are welcome!

I did some research on QScintilla2 APIs and QGIS supported platforms
and their distros. I came to the conclusion that, at this time, the
QScintilla2 API to use is 2.4.5 (no higher). This supports as far back
as Natty on Ubuntu desktop, but is possibly even a bit too new for
some distros like CentOS. You can download the docs as part of the
source here [0].

[0] http://packages.ubuntu.com/source/natty/qscintilla2


Also, concerning the compiled .api files, it would be very
advantageous to have the Python 2.7 .api mixed in there as well (if
it's not). That api file should be included in the current source of
QScintilla2 ( <src-dir>/qsci/api/python or
/usr/local/Qt4.?/qsci/api/python/ ). Not sure if you included a PyQt4
api as well, but that should probably be based off of Qt 4.6 or 4.7,
depending upon current unfinished(?) decision on QGIS base Qt version
to support with next release.

I have most of these api files archived, if you need any. I have
tested the Qsci editor in QGIS with over 54,000 compiled api lines
with no appreciable slow down, though the list of possible completions
gets too long.

In my Plugin Editor plugin, I currently store a user-generated
compiled api file in ~/.config/QGIS_PluginEditor/python.pap [0].
However, if it were QGIS-generic, say, ~/.config/qgis_apis/python.pap
instead, anyone who uses my plugin or Eric4 can compile a custom
python.pap and place it in ~/.config/qgis_apis/python.pap to
user-override the console's auto-completion and call tips (very
handy!). Most Python packages (osgeo, for example) can be loaded into
Eric4 and have a Qsci-compatible api file generated.

[0] http://dl.dropbox.com/u/4058089/qgis/editor_apis.png

Regards,

Larry


> Regards,
>
> -SL
>
> [1] - http://lrssvt.ns0.it/autocompletion.ogv
> [2] - https://code.google.com/p/pydee/
>
> --
> Salvatore Larosa
> linkedIn: http://linkedin.com/in/larosasalvatore
> twitter: @lrssvt
> skype: s.larosa
> IRC: lrssvt on freenode
> _______________________________________________
> Qgis-developer mailing list
> Qgis-developer at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-developer


More information about the Qgis-developer mailing list