mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-24 00:47:57 -05:00
173 lines
6.2 KiB
Python
173 lines
6.2 KiB
Python
"""
|
|
***************************************************************************
|
|
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.BraceMatch.SloppyBraceMatch)
|
|
|
|
self.setWrapMode(QsciScintilla.WrapMode.WrapWord)
|
|
self.setWrapVisualFlags(QsciScintilla.WrapVisualFlag.WrapFlagByText,
|
|
QsciScintilla.WrapVisualFlag.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.FoldStyle.BoxedTreeFoldStyle)
|
|
self.setFoldMarginColors(QColor('#d3d7cf'), QColor('#d3d7cf'))
|
|
|
|
# Mark column 80 with vertical line
|
|
self.setEdgeMode(QsciScintilla.EdgeMode.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.AutoCompletionSource.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.StyleHint.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.Modifier.CTRL +
|
|
Qt.Key.Key_Space), self)
|
|
self.shortcutAutocomplete.setContext(Qt.ShortcutContext.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
|