55from bisect import bisect_left
66from operator import attrgetter
77
8- from AnyQt .QtCore import Qt , QSize , pyqtSignal as Signal
8+ from AnyQt .QtCore import Qt , QSize , pyqtSignal as Signal , QSortFilterProxyModel
99from AnyQt .QtGui import QStandardItemModel , QStandardItem , QColor , QBrush , QPen
1010from AnyQt .QtWidgets import (
1111 QTableView , QGraphicsTextItem , QGraphicsRectItem , QGraphicsView , QDialog ,
12- QVBoxLayout
12+ QVBoxLayout , QLineEdit
1313)
1414from Orange .data import Variable
1515from Orange .widgets import gui
@@ -96,7 +96,16 @@ def __init__(self, master):
9696 self .saved_progress = 0
9797 self .scores = []
9898
99+ self .filter = QLineEdit ()
100+ self .filter .setPlaceholderText ("Filter ..." )
101+ self .filter .textChanged .connect (self .filter_changed )
102+ self .layout ().addWidget (self .filter )
103+ # Remove focus from line edit
104+ self .setFocus (Qt .ActiveWindowFocusReason )
105+
99106 self .rank_model = QStandardItemModel (self )
107+ self .model_proxy = QSortFilterProxyModel (self )
108+ self .model_proxy .setSourceModel (self .rank_model )
100109 self .rank_table = view = QTableView (
101110 selectionBehavior = QTableView .SelectRows ,
102111 selectionMode = QTableView .SingleSelection ,
@@ -105,7 +114,7 @@ def __init__(self, master):
105114 view .setItemDelegate (TableBarItem ())
106115 else :
107116 view .setItemDelegate (HorizontalGridDelegate ())
108- view .setModel (self .rank_model )
117+ view .setModel (self .model_proxy )
109118 view .selectionModel ().selectionChanged .connect (
110119 self .on_selection_changed )
111120 view .horizontalHeader ().setStretchLastSection (True )
@@ -185,6 +194,9 @@ def initialize(self):
185194 self .button .setText ("Start" )
186195 self .button .setEnabled (self .check_preconditions ())
187196
197+ def filter_changed (self , text ):
198+ self .model_proxy .setFilterFixedString (text )
199+
188200 def stop_and_reset (self , reset_method = None ):
189201 if self .keep_running :
190202 self .scheduled_call = reset_method or self .initialize
@@ -388,6 +400,9 @@ def check_preconditions(self):
388400 return can_rank
389401
390402 def on_selection_changed (self , selected , deselected ):
403+ selection = selected .indexes ()
404+ if not selection :
405+ return
391406 attrs = selected .indexes ()[0 ].data (self ._AttrRole )
392407 self .selectionChanged .emit (attrs )
393408
0 commit comments