123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- """
- ***************************************************************************
- ScriptEdit.py
- ---------------------
- Date : February 2014
- Copyright : (C) 2014 by Alexander Bruy
- Email : alexander dot bruy at gmail dot com
- ***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************
- """
- __author__ = 'Alexander Bruy'
- __date__ = 'February 2014'
- __copyright__ = '(C) 2014, Alexander Bruy'
- from qgis.PyQt.QtCore import Qt
- from qgis.PyQt.QtGui import QColor, QFont, QKeySequence
- from qgis.PyQt.QtWidgets import QShortcut
- from qgis.PyQt.Qsci import QsciScintilla, QsciLexerSQL
- from qgis.core import QgsSettings
- class SqlEdit(QsciScintilla):
- LEXER_PYTHON = 0
- LEXER_R = 1
- def __init__(self, parent=None):
- QsciScintilla.__init__(self, parent)
- self.mylexer = None
- self.api = None
- self.setCommonOptions()
- self.initShortcuts()
- def setCommonOptions(self):
- # Enable non-ASCII characters
- self.setUtf8(True)
- # Default font
- font = QFont()
- font.setFamily('Courier')
- font.setFixedPitch(True)
- font.setPointSize(10)
- self.setFont(font)
- self.setMarginsFont(font)
- self.setBraceMatching(QsciScintilla.SloppyBraceMatch)
- self.setWrapMode(QsciScintilla.WrapWord)
- self.setWrapVisualFlags(QsciScintilla.WrapFlagByText,
- QsciScintilla.WrapFlagNone, 4)
- self.setSelectionForegroundColor(QColor('#2e3436'))
- self.setSelectionBackgroundColor(QColor('#babdb6'))
- # Show line numbers
- self.setMarginWidth(1, '000')
- self.setMarginLineNumbers(1, True)
- self.setMarginsForegroundColor(QColor('#2e3436'))
- self.setMarginsBackgroundColor(QColor('#babdb6'))
- # Highlight current line
- self.setCaretLineVisible(True)
- self.setCaretLineBackgroundColor(QColor('#d3d7cf'))
- # Folding
- self.setFolding(QsciScintilla.BoxedTreeFoldStyle)
- self.setFoldMarginColors(QColor('#d3d7cf'), QColor('#d3d7cf'))
- # Mark column 80 with vertical line
- self.setEdgeMode(QsciScintilla.EdgeLine)
- self.setEdgeColumn(80)
- self.setEdgeColor(QColor('#eeeeec'))
- # Indentation
- self.setAutoIndent(True)
- self.setIndentationsUseTabs(False)
- self.setIndentationWidth(4)
- self.setTabIndents(True)
- self.setBackspaceUnindents(True)
- self.setTabWidth(4)
- # Autocomletion
- self.setAutoCompletionThreshold(2)
- self.setAutoCompletionSource(QsciScintilla.AcsAPIs)
- self.setAutoCompletionCaseSensitivity(False)
- # Load font from Python console settings
- settings = QgsSettings()
- fontName = settings.value('pythonConsole/fontfamilytext', 'Monospace')
- fontSize = int(settings.value('pythonConsole/fontsize', 10))
- self.defaultFont = QFont(fontName)
- self.defaultFont.setFixedPitch(True)
- self.defaultFont.setPointSize(fontSize)
- self.defaultFont.setStyleHint(QFont.TypeWriter)
- self.defaultFont.setBold(False)
- self.boldFont = QFont(self.defaultFont)
- self.boldFont.setBold(True)
- self.italicFont = QFont(self.defaultFont)
- self.italicFont.setItalic(True)
- self.setFont(self.defaultFont)
- self.setMarginsFont(self.defaultFont)
- self.initLexer()
- def initShortcuts(self):
- (ctrl, shift) = (self.SCMOD_CTRL << 16, self.SCMOD_SHIFT << 16)
- # Disable some shortcuts
- self.SendScintilla(QsciScintilla.SCI_CLEARCMDKEY, ord('D') + ctrl)
- self.SendScintilla(QsciScintilla.SCI_CLEARCMDKEY, ord('L') + ctrl)
- self.SendScintilla(QsciScintilla.SCI_CLEARCMDKEY, ord('L') + ctrl +
- shift)
- self.SendScintilla(QsciScintilla.SCI_CLEARCMDKEY, ord('T') + ctrl)
- # self.SendScintilla(QsciScintilla.SCI_CLEARCMDKEY, ord("Z") + ctrl)
- # self.SendScintilla(QsciScintilla.SCI_CLEARCMDKEY, ord("Y") + ctrl)
- # Use Ctrl+Space for autocompletion
- self.shortcutAutocomplete = QShortcut(QKeySequence(Qt.CTRL +
- Qt.Key_Space), self)
- self.shortcutAutocomplete.setContext(Qt.WidgetShortcut)
- self.shortcutAutocomplete.activated.connect(self.autoComplete)
- def autoComplete(self):
- self.autoCompleteFromAll()
- def initLexer(self):
- self.mylexer = QsciLexerSQL()
- colorDefault = QColor('#2e3436')
- colorComment = QColor('#c00')
- colorCommentBlock = QColor('#3465a4')
- colorNumber = QColor('#4e9a06')
- colorType = QColor('#4e9a06')
- colorKeyword = QColor('#204a87')
- colorString = QColor('#ce5c00')
- self.mylexer.setDefaultFont(self.defaultFont)
- self.mylexer.setDefaultColor(colorDefault)
- self.mylexer.setColor(colorComment, 1)
- self.mylexer.setColor(colorNumber, 2)
- self.mylexer.setColor(colorString, 3)
- self.mylexer.setColor(colorString, 4)
- self.mylexer.setColor(colorKeyword, 5)
- self.mylexer.setColor(colorString, 6)
- self.mylexer.setColor(colorString, 7)
- self.mylexer.setColor(colorType, 8)
- self.mylexer.setColor(colorCommentBlock, 12)
- self.mylexer.setColor(colorString, 15)
- self.mylexer.setFont(self.italicFont, 1)
- self.mylexer.setFont(self.boldFont, 5)
- self.mylexer.setFont(self.boldFont, 8)
- self.mylexer.setFont(self.italicFont, 12)
- self.setLexer(self.mylexer)
- def lexer(self):
- return self.mylexer
|