66
77from AnyQt .QtWidgets import QHeaderView , QStyledItemDelegate , QMenu
88from AnyQt .QtGui import QStandardItemModel , QStandardItem
9- from AnyQt .QtCore import Qt , QSize , QObject , pyqtSignal as Signal
9+ from AnyQt .QtCore import Qt , QSize , QObject , pyqtSignal as Signal , \
10+ QSortFilterProxyModel
1011from sklearn .exceptions import UndefinedMetricWarning
1112
1213from Orange .data import Variable , DiscreteVariable , ContinuousVariable
@@ -98,6 +99,19 @@ def thunked():
9899 return thunked
99100
100101
102+ class ScoreModel (QSortFilterProxyModel ):
103+ def lessThan (self , left , right ):
104+ left = left .data ()
105+ right = right .data ()
106+ if type (left ) is not type (right ) or left is None or right is None :
107+ # put the one which is not a number (= an error) at the bottom
108+ return isinstance (left , float ) == (
109+ self .sortOrder () == Qt .AscendingOrder )
110+ if isinstance (left , str ):
111+ return left .upper () < right .upper ()
112+ return left < right
113+
114+
101115class ScoreTable (OWComponent , QObject ):
102116 shown_scores = \
103117 Setting (set (chain (* BUILTIN_SCORERS_ORDER .values ())))
@@ -109,6 +123,12 @@ def sizeHint(self, *args):
109123 size = super ().sizeHint (* args )
110124 return QSize (size .width (), size .height () + 6 )
111125
126+ def displayText (self , value , locale ):
127+ if isinstance (value , float ):
128+ return f"{ value :.3f} "
129+ else :
130+ return super ().displayText (value , locale )
131+
112132 def __init__ (self , master ):
113133 QObject .__init__ (self )
114134 OWComponent .__init__ (self , master )
@@ -125,7 +145,9 @@ def __init__(self, master):
125145
126146 self .model = QStandardItemModel (master )
127147 self .model .setHorizontalHeaderLabels (["Method" ])
128- self .view .setModel (self .model )
148+ self .sorted_model = ScoreModel ()
149+ self .sorted_model .setSourceModel (self .model )
150+ self .view .setModel (self .sorted_model )
129151 self .view .setItemDelegate (self .ItemDelegate ())
130152
131153 def _column_names (self ):
0 commit comments