Changeset 1850:5b514f87a15e in orange-bioinformatics for _bioinformatics/widgets/OWSelectGenes.py


Ignore:
Timestamp:
10/01/13 16:47:23 (7 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Added multi item completion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _bioinformatics/widgets/OWSelectGenes.py

    r1848 r1850  
    11import re 
    22import unicodedata 
     3from contextlib import contextmanager 
    34 
    45from PyQt4.QtGui import ( 
     
    78) 
    89 
    9 from PyQt4.QtCore import Qt, pyqtSignal as Signal 
     10from PyQt4.QtCore import Qt, QEvent, pyqtSignal as Signal 
    1011 
    1112import Orange 
     
    6768        box.layout().addWidget(self.entryField) 
    6869 
    69         completer = QCompleter(self) 
     70        completer = ListCompleter(self) 
    7071        completer.setCompletionMode(QCompleter.PopupCompletion) 
    7172        completer.setCaseSensitivity(Qt.CaseInsensitive) 
     73        completer.setMaxVisibleItems(10) 
    7274        completer.popup().setAlternatingRowColors(True) 
    7375        completer.setModel(QStringListModel([], self)) 
     
    191193 
    192194class ListTextEdit(QPlainTextEdit): 
    193     listChanged = Signal() 
    194  
    195195    def __init__(self, parent=None, **kwargs): 
    196196        QPlainTextEdit.__init__(self, parent, **kwargs) 
     
    204204        if self._completer is not None: 
    205205            self._completer.setWidget(None) 
    206             if isinstance(self._completer, ListCompleter): 
    207                 self._completer.activatedList.disconnect(self._insertCompletion) 
    208             else: 
    209                 self._completer.activated.disconnect(self._insertCompletion) 
     206            self._completer.activated.disconnect(self._insertCompletion) 
    210207 
    211208        self._completer = completer 
     
    213210        if self._completer: 
    214211            self._completer.setWidget(self) 
    215             if isinstance(self._completer, ListCompleter): 
    216                 self._completer.activatedList.connect(self._insertCompletion) 
    217             else: 
    218                 self._completer.activated.connect(self._insertCompletion) 
     212            self._completer.activated.connect(self._insertCompletion) 
    219213 
    220214    def completer(self): 
     
    275269 
    276270    def _insertCompletion(self, item): 
    277         completion = unicode(item) 
     271        if isinstance(item, list): 
     272            completion = " ".join(item) 
     273        else: 
     274            completion = unicode(item) 
     275 
    278276        prefix = self._completer.completionPrefix() 
    279277 
     
    331329 
    332330 
     331@contextmanager 
     332def signals_blocked(obj): 
     333    blocked = obj.signalsBlocked() 
     334    obj.blockSignals(True) 
     335    try: 
     336        yield 
     337    finally: 
     338        obj.blockSignals(blocked) 
     339 
     340 
    333341class ListCompleter(QCompleter): 
    334     activatedList = Signal(list) 
     342    activated = Signal(list) 
    335343 
    336344    def __init__(self, *args, **kwargs): 
     
    338346 
    339347        popup = QListView() 
     348        popup.setEditTriggers(QListView.NoEditTriggers) 
    340349        popup.setSelectionMode(QListView.ExtendedSelection) 
     350 
    341351        self.setPopup(popup) 
    342352 
     
    344354        QCompleter.setPopup(self, popup) 
    345355 
    346         popup.selectionModel().selectionChanged.connect( 
    347             self._completionSelected) 
    348  
    349     def _completionSelected(self, selected, deselected): 
     356        popup.viewport().installEventFilter(self) 
     357        popup.doubleClicked.connect(self._complete) 
     358 
     359    def eventFilter(self, receiver, event): 
     360        if event.type() == QEvent.KeyPress and receiver is self.popup(): 
     361            if event.key() in [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Tab]: 
     362                self._complete() 
     363                return True 
     364 
     365        elif event.type() == QEvent.MouseButtonRelease and \ 
     366                receiver is self.popup().viewport(): 
     367            # Process the event without emitting 'clicked', ... signal to 
     368            # override the default QCompleter behavior 
     369            with signals_blocked(self.popup()): 
     370                QApplication.sendEvent(self.popup(), event) 
     371                return True 
     372 
     373        return QCompleter.eventFilter(self, receiver, event) 
     374 
     375    def _complete(self): 
    350376        selection = self.popup().selectionModel().selection() 
    351377        indexes = selection.indexes() 
     
    354380                 for index in indexes] 
    355381 
    356         self.activatedList.emit(items) 
     382        if self.popup().isVisible(): 
     383            self.popup().hide() 
     384 
     385        self.activated.emit(items) 
    357386 
    358387 
Note: See TracChangeset for help on using the changeset viewer.