<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Date: Tue, 15 Dec 2015 11:49:01 -0800<br>
From: Brian Merchant <<a href="mailto:bhmerchant@gmail.com">bhmerchant@gmail.com</a>><br>
To: <a href="mailto:pyqt@riverbankcomputing.com">pyqt@riverbankcomputing.com</a><br>
Subject: [PyQt] <br></blockquote><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I have made some images to demo a text-editor like app I'd like to make;<br>
<a href="http://imgur.com/a/2OKph" rel="noreferrer" target="_blank">http://imgur.com/a/2OKph</a><br>
<br>
Some features are very familiar: type text to enter it, auto-complete<br>
boxes, etc</blockquote><div><br></div><div>Things like this -- dynamic behavior based on the user's keystrokes in the context of the text near the insertion point -- is done using a QSyntaxHighlighter [1].<br><br></div><div>The main use of this is to highlight the different classes of tokens as the user types them. For a simple example, to put a wavy red line underneath a word that fails spellcheck. Or to make a keyword one color and a variable a different color. Obviously this requires close linkage between the user's keystrokes and the highlighter. The user types "fro" and that's a spelling error, underline it; then the next keystroke is "g" and now it is not a spelling error, clear the underline.<br></div><div><br></div><div>The relationship between a QSyntaxHighlighter and an editor is not well explained in the doc. The Qt design is to make a syntax highlighter a separate object from the editor, I suppose so that you could design it separately, and apply one highlighter to multiple different text edit widgets. Anyway you subclass QSyntaxHighlighter and specify its behaviors by implementing .highlightBlock().<br><br></div><div>You apply a highlighter, making the highlights appear, by calling its .setDocument() method, passing a QTextDocument. At this moment, the highlightBlock() method is called for every existing line (or maybe only the visible lines?). From then on, highlightBlock() is called for the line with the insertion point whenever a character changes. To remove highlighting, call its .setDocument() passing None.<br><br></div><div>I think using this you could implement your auto suggestion dropdown. Although I couldn't say how to figure out the x/y coordinates of the insertion point to locate the menu.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Some features are not so familiar: you can drag and drop some elements of<br>
the text to "flip" their position, some keywords are automatically<br>
converted into symbols when typed, and so on</blockquote><div><br></div><div>Qt's edit widgets (PlainTextEdit and TextEdit) support drag/drop of selected text, complete with a nice transparent overlay of the dragged text and moving insertion point to show where it will drop. You want to implement this but make it behave based on lexical units, not merely based on character-by-character moves. Read carefully through the QTextEdit doc [2] about drag/drop of mime types. You might be able to,<br><br></div><div>1. Select the current lexical unit<br></div><div>2. Cut it<br></div><div>3. Make it a mime package<br></div><div>4. Start a drag/drop<br></div><div>5. Let Qt do its thing<br></div><div>6. Override the QTextEdit dragMoveEvent() to highlight lexical units under the cursor showing where the dragged mime unit can legally go<br></div><div>6. Override the QTextEdit dropEvent() to refuse to drop in an illegal place, and to animate moving lexical units around when it's legal.<br><br></div><div>However I have done some experiments with QDrag [3] and friends and found it a very difficult API to work with.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
My plan is to use PyQt4.<br></blockquote><div><br></div><div>Why?!? We are a couple of years into the Qt5 release after all.<br><br></div><div>Cheers,<br></div><div>Dave Cortesi<br></div><div> <br></div></div>[1] <a href="http://doc.qt.io/qt-5/qsyntaxhighlighter.html">http://doc.qt.io/qt-5/qsyntaxhighlighter.html</a><br><br>[2] <a href="http://doc.qt.io/qt-5/qtextedit.html#details">http://doc.qt.io/qt-5/qtextedit.html#details</a><br><br>[3] <a href="http://doc.qt.io/qt-5/qdrag.html">http://doc.qt.io/qt-5/qdrag.html</a><br></div></div>