[PyQt] Problem with colors and QSciScintilla

projetmbc projetmbc at club-internet.fr
Sun Jul 12 22:22:57 BST 2009


Baz Walter, I don't know if you are in the riverbanks'team but it could 
be very usefull to put your example in the official documentation.

Regards.
Christophe.


projetmbc a écrit :
> Your example is great. Easy to understand.  Thanks a lot !  :-)
>
> With this, I could start to study how to do more sophisticated things 
> like folding.
>
> Christophe an happy man. :-D
>
> Baz Walter a écrit :
>> >> I hope that someone can help me.
>> >>
>> >> Best regards.
>> >> Christophe
>>
>> hello christophe
>>
>> here's a basic line-based custom lexer that should get you started:
>>
>>
>> import sys
>> from PyQt4 import QtCore, QtGui, Qsci
>>
>>
>> class MainWindow(QtGui.QMainWindow):
>>     def __init__(self):
>>         QtGui.QMainWindow.__init__(self)
>>         self.setWindowTitle('Custom Lexer Example')
>>         self.setGeometry(QtCore.QRect(50,200,400,400))
>>         self.editor = Qsci.QsciScintilla(self)
>>         self.editor.setUtf8(True)
>>         self.editor.setMarginWidth(2, 15)
>>         self.editor.setFolding(True)
>>         self.setCentralWidget(self.editor)
>>         self.lexer = CustomLexer(self.editor)
>>         self.editor.setLexer(self.lexer)
>>         self.editor.setText('\n# sample source\n\nfoo = 1\nbar = 2\n')
>>
>>
>> class CustomLexer(Qsci.QsciLexerCustom):
>>     def __init__(self, parent):
>>         Qsci.QsciLexerCustom.__init__(self, parent)
>>         self._styles = {
>>             0: 'Default',
>>             1: 'Comment',
>>             2: 'Key',
>>             3: 'Assignment',
>>             4: 'Value',
>>             }
>>         for key,value in self._styles.iteritems():
>>             setattr(self, value, key)
>>
>>     def description(self, style):
>>         return self._styles.get(style, '')
>>
>>     def defaultColor(self, style):
>>         if style == self.Default:
>>             return QtGui.QColor('#000000')
>>         elif style == self.Comment:
>>             return QtGui.QColor('#C0C0C0')
>>         elif style == self.Key:
>>             return QtGui.QColor('#0000CC')
>>         elif style == self.Assignment:
>>             return QtGui.QColor('#CC0000')
>>         elif style == self.Value:
>>             return QtGui.QColor('#00CC00')
>>         return Qsci.QsciLexerCustom.defaultColor(self, style)
>>
>>     def styleText(self, start, end):
>>         editor = self.editor()
>>         if editor is None:
>>             return
>>
>>         # scintilla works with encoded bytes, not decoded characters.
>>         # this matters if the source contains non-ascii characters and
>>         # a multi-byte encoding is used (e.g. utf-8)
>>         source = ''
>>         if end > editor.length():
>>             end = editor.length()
>>         if end > start:
>>             if sys.hexversion >= 0x02060000:
>>                 # faster when styling big files, but needs python 2.6
>>                 source = bytearray(end - start)
>>                 editor.SendScintilla(
>>                     editor.SCI_GETTEXTRANGE, start, end, source)
>>             else:
>>                 source = unicode(editor.text()
>>                                 ).encode('utf-8')[start:end]
>>         if not source:
>>             return
>>
>>         # the line index will also be needed to implement folding
>>         index = editor.SendScintilla(editor.SCI_LINEFROMPOSITION, start)
>>         if index > 0:
>>             # the previous state may be needed for multi-line styling
>>             pos = editor.SendScintilla(
>>                       editor.SCI_GETLINEENDPOSITION, index - 1)
>>             state = editor.SendScintilla(editor.SCI_GETSTYLEAT, pos)
>>         else:
>>             state = self.Default
>>
>>         set_style = self.setStyling
>>         self.startStyling(start, 0x1f)
>>
>>         # scintilla always asks to style whole lines
>>         for line in source.splitlines(True):
>>             length = len(line)
>>             if line.startswith('#'):
>>                 state = self.Comment
>>             else:
>>                 # the following will style lines like "x = 0"
>>                 pos = line.find('=')
>>                 if pos > 0:
>>                     set_style(pos, self.Key)
>>                     set_style(1, self.Assignment)
>>                     length = length - pos - 1
>>                     state = self.Value
>>                 else:
>>                     state = self.Default
>>             set_style(length, state)
>>             # folding implementation goes here
>>             index += 1
>>
>>
>> if __name__ == "__main__":
>>     app = QtGui.QApplication(sys.argv)
>>     app.connect(app, QtCore.SIGNAL('lastWindowClosed()'),
>>                 QtCore.SLOT('quit()'))
>>     win = MainWindow()
>>     win.show()
>>     sys.exit(app.exec_())
>>
>>
>
>
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>
>




More information about the PyQt mailing list