2424)
2525from AnyQt .QtGui import QStandardItemModel , QStandardItem , QKeySequence , QIcon
2626from AnyQt .QtCore import pyqtSignal as Signal , pyqtSlot as Slot
27- from AnyQt .QtCore import Qt , QEvent , QSize , QModelIndex , QAbstractListModel
27+ from AnyQt .QtCore import Qt , QEvent , QSize , QModelIndex
2828
2929import numpy as np
3030
3131import Orange .data
32- import Orange .preprocess .transformation
3332
3433from Orange .preprocess .transformation import Identity , Lookup
3534from Orange .widgets import widget , gui , settings
@@ -48,7 +47,7 @@ class Categorical(
4847 ("categories" , Tuple [str , ...]),
4948 ("base" , Optional [str ]),
5049 ("annotations" , AnnotationsType ),
51- ])): ...
50+ ])): pass
5251
5352
5453class Real (
@@ -57,21 +56,21 @@ class Real(
5756 # a precision (int, and a format specifier('f', 'g', or '')
5857 ("format" , Tuple [int , str ]),
5958 ("annotations" , AnnotationsType ),
60- ])): ...
59+ ])): pass
6160
6261
6362class String (
6463 NamedTuple ("String" , [
6564 ("name" , str ),
6665 ("annotations" , AnnotationsType ),
67- ])): ...
66+ ])): pass
6867
6968
7069class Time (
7170 NamedTuple ("Time" , [
7271 ("name" , str ),
7372 ("annotations" , AnnotationsType ),
74- ])): ...
73+ ])): pass
7574
7675
7776Variable = Union [Categorical , Real , Time , String ]
@@ -519,51 +518,8 @@ def __init__(self, *args, **kwargs):
519518 shortcutContext = Qt .WidgetShortcut ,
520519 )
521520
522- model = self .values_model
523- view = self .values_edit
524-
525- @self .add_new_item .triggered .connect
526- def _add_item ():
527- with disconnected (model .dataChanged , self .on_values_changed ,
528- Qt .UniqueConnection ):
529- row = model .rowCount ()
530- if not model .insertRow (model .rowCount ()):
531- return
532- index = model .index (row , 0 )
533- model .setItemData (
534- index , {
535- Qt .EditRole : "" ,
536- SourcePosRole : None ,
537- EditStateRole : ItemEditState .Added
538- }
539- )
540- view .setCurrentIndex (index )
541- view .edit (index )
542- self .on_values_changed ()
543-
544- @self .remove_item .triggered .connect
545- def _remove_item ():
546- view = self .values_edit
547- rows = view .selectionModel ().selectedRows (0 )
548- if not rows :
549- return
550- index = rows [0 ] # type: QModelIndex
551- model = index .model ()
552- state = index .data (EditStateRole )
553- pos = index .data (Qt .UserRole )
554- if pos is not None and pos >= 0 :
555- # existing level -> only mark/toggle its dropped state
556- model .setData (
557- index ,
558- ItemEditState .Dropped if state != ItemEditState .Dropped
559- else ItemEditState .NoState ,
560- EditStateRole )
561- elif state == ItemEditState .Added :
562- # new level -> remove it
563- model .removeRow (index .row ())
564- else :
565- assert False , "invalid state '{}' for {}" \
566- .format (state , index .row ())
521+ self .add_new_item .triggered .connect (self ._add_category )
522+ self .remove_item .triggered .connect (self ._remove_category )
567523
568524 button1 = FixedSizeButton (
569525 self , defaultAction = self .move_value_up ,
@@ -737,6 +693,61 @@ def on_value_selection_changed(self):
737693 self .move_value_up .setEnabled (False )
738694 self .move_value_down .setEnabled (False )
739695
696+ def _remove_category (self ):
697+ """
698+ Remove the current selected category.
699+
700+ If the item is an existing category present in the source variable it
701+ is marked as removed in the view. But if it was added in the set
702+ transformation it is removed entirely from the model and view.
703+ """
704+ view = self .values_edit
705+ rows = view .selectionModel ().selectedRows (0 )
706+ if not rows :
707+ return
708+ assert len (rows ) == 1
709+ index = rows [0 ] # type: QModelIndex
710+ model = index .model ()
711+ state = index .data (EditStateRole )
712+ pos = index .data (Qt .UserRole )
713+ if pos is not None and pos >= 0 :
714+ # existing level -> only mark/toggle its dropped state
715+ model .setData (
716+ index ,
717+ ItemEditState .Dropped if state != ItemEditState .Dropped
718+ else ItemEditState .NoState ,
719+ EditStateRole )
720+ elif state == ItemEditState .Added :
721+ # new level -> remove it
722+ model .removeRow (index .row ())
723+ else :
724+ assert False , "invalid state '{}' for {}" \
725+ .format (state , index .row ())
726+
727+ def _add_category (self ):
728+ """
729+ Add a new category
730+ """
731+ view = self .values_edit
732+ model = view .model ()
733+
734+ with disconnected (model .dataChanged , self .on_values_changed ,
735+ Qt .UniqueConnection ):
736+ row = model .rowCount ()
737+ if not model .insertRow (model .rowCount ()):
738+ return
739+ index = model .index (row , 0 )
740+ model .setItemData (
741+ index , {
742+ Qt .EditRole : "" ,
743+ SourcePosRole : None ,
744+ EditStateRole : ItemEditState .Added
745+ }
746+ )
747+ view .setCurrentIndex (index )
748+ view .edit (index )
749+ self .on_values_changed ()
750+
740751
741752class ContinuousVariableEditor (VariableEditor ):
742753 # TODO: enable editing of display format...
@@ -965,7 +976,7 @@ def reset_all(self):
965976 self ._invalidate ()
966977
967978 def selected_var_index (self ):
968- """Return the selected row in 'Domain Features' view ."""
979+ """Return the current selected variable index ."""
969980 rows = self .variables_view .selectedIndexes ()
970981 assert len (rows ) <= 1
971982 return rows [0 ].row () if rows else - 1
@@ -975,10 +986,6 @@ def set_domain(self, domain):
975986 self .variables_model [:] = [abstract (v )
976987 for v in domain .variables + domain .metas ]
977988
978- def set_variables (self , variables ):
979- # type: (Iterable[Variable]) -> None
980- self .variables_model [:] = variables
981-
982989 def _restore (self , ):
983990 """
984991 Restore the edit transform from saved state.
@@ -1060,8 +1067,6 @@ def _on_variable_changed(self):
10601067
10611068 def _store_transform (self , var , transform ):
10621069 # type: (Variable, List[Transform]) -> None
1063- # print("store:", deconstruct(var))
1064- # print(" ", [deconstruct(t) for t in transform])
10651070 self ._domain_change_store [deconstruct (var )] = [deconstruct (t ) for t in transform ]
10661071
10671072 def _restore_transform (self , var ):
@@ -1162,6 +1167,7 @@ def send_report(self):
11621167
11631168 @classmethod
11641169 def migrate_context (cls , context , version ):
1170+ # pylint: disable=bad-continuation
11651171 if version is None or version <= 1 :
11661172 hints_ = context .values .get ("domain_change_hints" , ({}, - 2 ))[0 ]
11671173 store = []
@@ -1175,10 +1181,10 @@ def migrate_context(cls, context, version):
11751181 ("Time" , (name , ())),
11761182 "ContinuousVariable" :
11771183 lambda name , _ , attrs :
1178- ("Real" , (name , (3 , "f" ), ())),
1184+ ("Real" , (name , (3 , "f" ), ())),
11791185 "StringVariable" :
11801186 lambda name , _ , attrs :
1181- ("String" , (name , ())),
1187+ ("String" , (name , ())),
11821188 }
11831189 for (module , class_name , * rest ), target in hints_ .items ():
11841190 if module != ns :
0 commit comments