[QScintilla] hotspot error on Linux
Phil Thompson
phil at riverbankcomputing.com
Sun Sep 7 16:07:07 BST 2014
On 06/09/2014 5:58 pm, Matic Kukovec wrote:
> On 3.9.2014 17:19, Phil Thompson wrote:
>> On 25/08/2014 10:50 am, Matic Kukovec wrote:
>>> As for the hotspot API, I think something like the indicators use
>>> would be the best and the most consistent.
>>> Scintilla uses only a single hotspot, so if adding multiple styles is
>>> not an option, scratch that idea.
>>>
>>> Setting up a hotspot style:
>>>
>>> int setHotspotForeColor(QColor color, int hotspotNumber)
>>> QColor hotspotForeColor(int hotspotNumber)
>>> int sethotspotForeColorEnabled(bool useForegroundColor, int
>>> hotspotNumber)
>>> bool hotspotForeColorEnabled(int hotspotNumber)
>>>
>>> int setHotspotBackColor(bool useBackgroundColor, QColor
>>> color, int hotspotNumber)
>>> QColor hotspotBackColor(int hotspotNumber)
>>> int sethotspotBackColorEnabled(bool useBackgroundColor, int
>>> hotspotNumber)
>>> bool hotspotBackColorEnabled(int hotspotNumber)
>>>
>>> int setHotspotUnderline(bool underline, int hotspotNumber)
>>> bool hotspotUnderline(int hotspotNumber)
>>>
>>> int setHotspotSingleLine(bool singleLine, int
>>> hotspotNumber)
>>> bool hotspotSingleLine(int hotspotNumber)
>>
>> I've added setHotspotForegroundColor(), resetHotspotForegroundColor(),
>> setHotspotBackgroundColor() and resetHotspotBackgroundColor() which
>> are similar to how the selection foreground and background are
>> handled.
>>
>> I've also added setHotspotUnderline() and setHotspotWrap(). Note that
>> these are all global - Scintilla doesn't support different values for
>> different styles.
>>
>>> Styling with a hotspot:
>>>
>>> fillHotspotRange(int lineFrom, int indexFrom, int lineTo, int
>>> indexTo, int hotspotNumber)
>>> clearHotspotRange(int lineFrom, int indexFrom, int lineTo, int
>>> indexTo, int hotspotNumber)
>>
>> Hotspots are implemented as styles and the normal way to apply a style
>> is via a lexer. If you use calls like the above and you have a lexer
>> installed then they are going to fight about what the style of
>> individual characters should be. If you don't have a lexer installed
>> than you can write a QsciLexerCustom sub-class that will apply a
>> QsciStyle with hotspot enabled wherever you want. Using the custom
>> lexer also has the advantage that Scintilla decides what needs styling
>> and when according to how the user is moving around and updating the
>> document.
>>
>> Given that, do you still need something like fillHotspotRange()?
>>
>> Phil
>
> That is brilliant Phil, thanks!
> Using styles to set the hotspot is already good enough, no need for
> fillHotspotRange/clearHotspotRange.
> Will try it out.
>
> Also, is there an efficient way of opening large binary files (up to
> 1Gb) without any styling?
> Example:
>
> binary_text = open(file,'rb').read()
> decoded_text = binary.decode("utf-8", errors="replace")
> scintilla.setLexer(None)
> scintilla.setText(decoded_text)
>
> I tried opening a 600MB file with the above example and the setText
> method spikes RAM usage
> to around 5GB and then returns to a normal 1.8GB.
> Is there a more efficient way of reading large files, maybe in chunks
> or something similar?
You could try QSciScintilla.read() which will avoid conversions to
Python strings. QScintilla is a programmers editor and not intended to
handle such large files.
Phil
More information about the QScintilla
mailing list