@@ -125,23 +125,30 @@ def on_model_item_changed(self, item):
125125 checked_indices = [i for i , item in enumerate (model [1 :]) if item .checked ]
126126 self .checkedItemsChanged .emit (checked_indices )
127127
128+ # function is called to implement wheel scrolling (select prev/next label)
128129 def select_offset (self , offset ):
129- """offset: 1 for next, - 1 for previous """
130-
130+ """offset: - 1 for previous, 1 for next """
131+ assert offset in { - 1 , 1 }
131132 model = self ._model
132133 model .blockSignals (True )
134+ # Remember the "(select all)" label shifts all indices by one
133135 indices_checked = [i for i , item in enumerate (model ) if item .checked ]
134- first_checked = indices_checked [0 ]
136+ if indices_checked :
137+ first_checked = indices_checked [0 ]
138+ else :
139+ # if no label is checked, act like "(select all)" was checked
140+ # (i.e. we will select the first real label)
141+ first_checked = 0
135142 # check first_checked + offset, uncheck the rest
136143 to_check = first_checked + offset
137144
138- # wrap around
145+ # wrap around (index 0 is reserved for "(select all)")
139146 to_check = to_check if to_check < len (model ) else 1
140147 to_check = to_check if to_check > 0 else len (model ) - 1
141148
142- is_checked = [ "partial" ] + [ i == to_check for i in range ( 1 , len ( model ))]
143- for checked , item in zip ( is_checked , model ):
144- item .checked = checked
149+ model [ 0 ]. checked = "partial"
150+ for i , item in enumerate ( model [ 1 :], start = 1 ):
151+ item .checked = i == to_check
145152 model .blockSignals (False )
146153 self .checkedItemsChanged .emit ([to_check - 1 ])
147154
0 commit comments