2024-11-29 15:38:02 +01:00

176 lines
6.1 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