mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-06 00:07:29 -04:00
Merge pull request #1686 from alexbruy/dbmanager-sqleditor
switch DB Manager's SQL editor to QgsCodeEditorSQL
This commit is contained in:
commit
77328b207c
@ -24,6 +24,7 @@ The content of this file is based on
|
||||
|
||||
from PyQt4.QtCore import *
|
||||
from PyQt4.QtGui import *
|
||||
from PyQt4.Qsci import *
|
||||
from qgis.core import *
|
||||
|
||||
from .db_plugins.plugin import BaseError
|
||||
@ -49,7 +50,7 @@ class DlgSqlWindow(QDialog, Ui_Dialog):
|
||||
|
||||
self.editSql.setFocus()
|
||||
self.editSql.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||||
self.editSql.initCompleter(self.db)
|
||||
self.initCompleter()
|
||||
|
||||
# allow to copy results
|
||||
copyAction = QAction("copy", self)
|
||||
@ -284,3 +285,24 @@ class DlgSqlWindow(QDialog, Ui_Dialog):
|
||||
QApplication.clipboard().setText( text, QClipboard.Selection )
|
||||
QApplication.clipboard().setText( text, QClipboard.Clipboard )
|
||||
|
||||
def initCompleter(self):
|
||||
dictionary = None
|
||||
if self.db:
|
||||
dictionary = self.db.connector.getSqlDictionary()
|
||||
if not dictionary:
|
||||
# use the generic sql dictionary
|
||||
from .sql_dictionary import getSqlDictionary
|
||||
dictionary = getSqlDictionary()
|
||||
|
||||
wordlist = []
|
||||
for name, value in dictionary.iteritems():
|
||||
wordlist += value # concat lists
|
||||
wordlist = list(set(wordlist)) # remove duplicates
|
||||
|
||||
api = QsciAPIs(self.editSql.lexer())
|
||||
for word in wordlist:
|
||||
api.add(word)
|
||||
|
||||
api.prepare()
|
||||
self.editSql.lexer().setAPIs(api)
|
||||
self.editSql.setAutoCompletionCaseSensitivity(False)
|
||||
|
@ -1,201 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
***************************************************************************
|
||||
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'
|
||||
|
||||
# This will get replaced with a git SHA1 when you do a git archive
|
||||
|
||||
__revision__ = '$Format:%H$'
|
||||
|
||||
import os
|
||||
|
||||
from PyQt4.QtCore import *
|
||||
from PyQt4.QtGui import *
|
||||
from PyQt4.Qsci import *
|
||||
|
||||
from qgis.core import *
|
||||
|
||||
|
||||
class SqlEdit(QsciScintilla):
|
||||
|
||||
LEXER_PYTHON = 0
|
||||
LEXER_R = 1
|
||||
|
||||
def __init__(self, parent=None):
|
||||
QsciScintilla.__init__(self, parent)
|
||||
|
||||
self.lexer = 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 = QSettings()
|
||||
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.setStretch(QFont.SemiCondensed)
|
||||
self.defaultFont.setLetterSpacing(QFont.PercentageSpacing, 87.0)
|
||||
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.lexer = QsciLexerSQL()
|
||||
|
||||
colorDefault = QColor('#2e3436')
|
||||
colorComment = QColor('#c00')
|
||||
colorCommentBlock = QColor('#3465a4')
|
||||
colorNumber = QColor('#4e9a06')
|
||||
colorType = QColor('#4e9a06')
|
||||
colorKeyword = QColor('#204a87')
|
||||
colorString = QColor('#ce5c00')
|
||||
|
||||
self.lexer.setDefaultFont(self.defaultFont)
|
||||
self.lexer.setDefaultColor(colorDefault)
|
||||
|
||||
self.lexer.setColor(colorComment, 1)
|
||||
self.lexer.setColor(colorNumber, 2)
|
||||
self.lexer.setColor(colorString, 3)
|
||||
self.lexer.setColor(colorString, 4)
|
||||
self.lexer.setColor(colorKeyword, 5)
|
||||
self.lexer.setColor(colorString, 6)
|
||||
self.lexer.setColor(colorString, 7)
|
||||
self.lexer.setColor(colorType, 8)
|
||||
self.lexer.setColor(colorCommentBlock, 12)
|
||||
self.lexer.setColor(colorString, 15)
|
||||
|
||||
self.lexer.setFont(self.italicFont, 1)
|
||||
self.lexer.setFont(self.boldFont, 5)
|
||||
self.lexer.setFont(self.boldFont, 8)
|
||||
self.lexer.setFont(self.italicFont, 12)
|
||||
|
||||
self.setLexer(self.lexer)
|
||||
|
||||
def initCompleter(self, db):
|
||||
dictionary = None
|
||||
if db:
|
||||
dictionary = db.connector.getSqlDictionary()
|
||||
if not dictionary:
|
||||
# use the generic sql dictionary
|
||||
from .sql_dictionary import getSqlDictionary
|
||||
dictionary = getSqlDictionary()
|
||||
|
||||
wordlist = []
|
||||
for name, value in dictionary.iteritems():
|
||||
wordlist += value # concat lists
|
||||
wordlist = list(set(wordlist)) # remove duplicates
|
||||
|
||||
self.api = QsciAPIs(self.lexer)
|
||||
for word in wordlist:
|
||||
self.api.add(word)
|
||||
|
||||
self.api.prepare()
|
||||
self.lexer.setAPIs(self.api)
|
@ -70,7 +70,7 @@
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="SqlEdit" name="editSql"/>
|
||||
<widget class="QgsCodeEditorSQL" name="editSql"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout">
|
||||
@ -356,9 +356,9 @@ columns</string>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>SqlEdit</class>
|
||||
<class>QgsCodeEditorSQL</class>
|
||||
<extends>QTextEdit</extends>
|
||||
<header>..sqledit</header>
|
||||
<header>qgscodeeditorsql.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
|
Loading…
x
Reference in New Issue
Block a user