manuskript/src/ui/views/textEditCompleter.py
2015-06-27 10:27:52 +02:00

109 lines
3.4 KiB
Python

#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
from ui.views.textEditView import *
from ui.editors.completer import *
from models.references import *
import settings
import re
try:
import enchant
except ImportError:
enchant = None
class textEditCompleter(textEditView):
def __init__(self, parent=None, index=None, html=None, spellcheck=True, highlighting=False, dict="", autoResize=False):
textEditView.__init__(self, parent=parent, index=index, html=html, spellcheck=spellcheck, highlighting=True, dict=dict, autoResize=autoResize)
self.completer = None
def setCurrentModelIndex(self, index):
textEditView.setCurrentModelIndex(self, index)
if self._index:
self.setCompleter(completer())
def setCompleter(self, completer):
self.completer = completer
self.completer.activated.connect(self.insertCompletion)
def insertCompletion(self, txt):
tc = self.textCursor()
tc.insertText(txt)
self.setTextCursor(tc)
def textUnderCursor(self, select=False):
tc = self.textCursor()
tc.select(QTextCursor.WordUnderCursor)
if select:
self.setTextCursor(tc)
return tc.selectedText()
def refUnderCursor(self, cursor):
pos = cursor.position()
cursor.select(QTextCursor.LineUnderCursor)
text = cursor.selectedText()
pos -= cursor.selectionStart()
match = re.findall(r"::\w:\d+?::", text)
for m in match:
if text.find(m) <= pos <= text.find(m) + len(m):
return m
def event(self, event):
if event.type() == QEvent.ToolTip:
cursor = self.cursorForPosition(event.pos())
ref = self.refUnderCursor(cursor)
if ref:
QToolTip.showText(self.mapToGlobal(event.pos()), infoForRef(ref))
else:
QToolTip.hideText()
return True
return textEditView.event(self, event)
def createStandardContextMenu(self):
menu = textEditView.createStandardContextMenu(self)
a = QAction(self.tr("Insert reference"), menu)
a.triggered.connect(self.popupCompleter)
menu.insertSeparator(menu.actions()[0])
menu.insertAction(menu.actions()[0], a)
return menu
def keyPressEvent(self, event):
if self.completer.isVisible():
if event.key() in (
Qt.Key_Enter,
Qt.Key_Return,
Qt.Key_Escape,
Qt.Key_Tab,
Qt.Key_Backtab):
event.ignore()
return
isShortcut = (event.modifiers() == Qt.ControlModifier and\
event.key() == Qt.Key_Space)
if not self.completer or not isShortcut:
self.completer.setVisible(False)
textEditView.keyPressEvent(self, event)
return
self.popupCompleter()
def popupCompleter(self):
if self.completer:
cr = self.cursorRect()
cr.moveTopLeft(self.mapToGlobal(cr.bottomLeft()))
cr.setWidth(self.completer.sizeHint().width())
self.completer.setGeometry(cr)
self.completer.popup(self.textUnderCursor(select=True))