Source code for glue.utils.qt.autocomplete_widget

# Code adapted from:
#
# http://rowinggolfer.blogspot.de/2010/08/qtextedit-with-autocompletion-using.html
#
# and based on:
#
# http://qt-project.org/doc/qt-4.8/tools-customcompleter.html

from __future__ import absolute_import, division, print_function

from glue.external.qt import QtGui
from glue.external.qt.QtCore import Qt


__all__ = ["CompletionTextEdit"]


[docs]class CompletionTextEdit(QtGui.QTextEdit): def __init__(self, parent=None): super(CompletionTextEdit, self).__init__(parent) self.setMinimumWidth(400) self.completer = None self.word_list = None self.moveCursor(QtGui.QTextCursor.End)
[docs] def set_word_list(self, word_list): self.word_list = word_list self.set_completer(QtGui.QCompleter(word_list))
[docs] def set_completer(self, completer): if self.completer: self.disconnect(self.completer, 0, self, 0) if not completer: return self.completer = completer self.completer.setWidget(self) self.completer.setCompletionMode(QtGui.QCompleter.PopupCompletion) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.activated.connect(self.insert_completion)
[docs] def insert_completion(self, completion): tc = self.textCursor() tc.select(QtGui.QTextCursor.WordUnderCursor) tc.deleteChar() completion = completion + " " self.setTextCursor(tc) self.insertPlainText(completion)
[docs] def text_under_cursor(self): tc = self.textCursor() tc.select(QtGui.QTextCursor.WordUnderCursor) return tc.selectedText()
# The following methods override methods in QTextEdit and should not be # renamed.
[docs] def focusInEvent(self, event): if self.completer: self.completer.setWidget(self) QtGui.QTextEdit.focusInEvent(self, event)
[docs] def keyPressEvent(self, event): if self.completer and self.completer.popup().isVisible(): if event.key() in ( Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab, Qt.Key_Backtab): event.ignore() return # Check if TAB has been pressed is_shortcut = event.key() == Qt.Key_Tab if not self.completer or not is_shortcut: QtGui.QTextEdit.keyPressEvent(self, event) return eow = "~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-=" completion_prefix = self.text_under_cursor() if not is_shortcut and (len(event.text()) == 0 or event.text()[-1:] in eow): self.completer.popup().hide() return if (completion_prefix != self.completer.completionPrefix()): self.completer.setCompletionPrefix(completion_prefix) popup = self.completer.popup() popup.setCurrentIndex(self.completer.completionModel().index(0, 0)) cr = self.cursorRect() cr.setWidth(self.completer.popup().sizeHintForColumn(0) + self.completer.popup().verticalScrollBar().sizeHint().width()) self.completer.complete(cr)