99
1010import aqt .clayout
1111from anki import stdmodels
12- from anki .collection import Collection , OpChangesWithId
12+ from anki .collection import Collection , OpChangesWithCount , OpChangesWithId
1313from anki .lang import without_unicode_isolation
1414from anki .models import NotetypeDict , NotetypeId , NotetypeNameIdUseCount
1515from anki .notes import Note
1818from aqt .operations .notetype import (
1919 add_notetype_legacy ,
2020 remove_notetype ,
21+ remove_notetypes ,
22+ selected_notetype_ids_to_remove ,
2123 update_notetype_legacy ,
2224)
2325from aqt .qt import *
3234 restoreGeom ,
3335 saveGeom ,
3436 showInfo ,
37+ tooltip ,
3538 tr ,
3639)
3740
@@ -113,6 +116,7 @@ def setupModels(self) -> None:
113116 button = box .addButton (label , QDialogButtonBox .ButtonRole .ActionRole )
114117 qconnect (button .clicked , func )
115118
119+ f .modelsList .setSelectionMode (QAbstractItemView .SelectionMode .ExtendedSelection )
116120 qconnect (f .modelsList .itemDoubleClicked , self .onRename )
117121
118122 def on_done (fut : Future ) -> None :
@@ -163,6 +167,17 @@ def current_notetype(self) -> NotetypeDict:
163167 row = self .form .modelsList .currentRow ()
164168 return self .mm .get (NotetypeId (self .models [row ].id ))
165169
170+ def selected_notetype_rows (self ) -> list [int ]:
171+ rows = sorted ({index .row () for index in self .form .modelsList .selectedIndexes ()})
172+ if rows :
173+ return rows
174+
175+ row = self .form .modelsList .currentRow ()
176+ if row != - 1 :
177+ return [row ]
178+
179+ return []
180+
166181 def onAdd (self ) -> None :
167182 def on_success (notetype : NotetypeDict ) -> None :
168183 # if legacy add-ons already added the notetype, skip adding
@@ -190,7 +205,16 @@ def onDelete(self) -> None:
190205 if len (self .models ) < 2 :
191206 showInfo (tr .notetypes_please_add_another_note_type_first (), parent = self )
192207 return
193- idx = self .form .modelsList .currentRow ()
208+
209+ selected_rows = self .selected_notetype_rows ()
210+ if not selected_rows :
211+ return
212+
213+ if len (selected_rows ) > 1 :
214+ self .onDeleteSelected (selected_rows )
215+ return
216+
217+ idx = selected_rows [0 ]
194218 if self .models [idx ].use_count :
195219 msg = tr .notetypes_delete_this_note_type_and_all ()
196220 else :
@@ -202,10 +226,65 @@ def onDelete(self) -> None:
202226 if not tracker .mark_schema ():
203227 return
204228
205- nt = self .current_notetype ()
206- remove_notetype (parent = self , notetype_id = nt ["id" ]).success (
207- lambda _ : self .refresh_list (None )
208- ).run_in_background ()
229+ remove_notetype (
230+ parent = self , notetype_id = NotetypeId (self .models [idx ].id )
231+ ).success (lambda _ : self .refresh_list (None )).run_in_background ()
232+
233+ def onDeleteSelected (self , selected_rows : Sequence [int ]) -> None :
234+ selected_notetype_ids = [
235+ NotetypeId (self .models [row ].id )
236+ for row in selected_rows
237+ if 0 <= row < len (self .models )
238+ ]
239+ current_row = self .form .modelsList .currentRow ()
240+ protected_notetype_id = (
241+ NotetypeId (self .models [current_row ].id )
242+ if len (selected_notetype_ids ) == len (self .models ) and current_row != - 1
243+ else None
244+ )
245+ notetype_ids = selected_notetype_ids_to_remove (
246+ self .models ,
247+ selected_notetype_ids ,
248+ protected_notetype_id ,
249+ )
250+ if not notetype_ids :
251+ showInfo (tr .notetypes_please_add_another_note_type_first (), parent = self )
252+ return
253+
254+ use_counts = {
255+ NotetypeId (notetype .id ): notetype .use_count for notetype in self .models
256+ }
257+ has_notes = any (use_counts [notetype_id ] for notetype_id in notetype_ids )
258+ msg = (
259+ tr .notetypes_delete_selected_note_types_and_all (count = len (notetype_ids ))
260+ if has_notes
261+ else tr .notetypes_delete_selected_note_types (count = len (notetype_ids ))
262+ )
263+ if not askUser (
264+ msg ,
265+ parent = self ,
266+ ):
267+ return
268+
269+ tracker = ChangeTracker (self .mw )
270+ if not tracker .mark_schema ():
271+ return
272+
273+ def on_success (out : OpChangesWithCount ) -> None :
274+ if out .count :
275+ tooltip (
276+ tr .notetypes_selected_note_types_removed (count = out .count ),
277+ parent = self ,
278+ )
279+ else :
280+ showInfo (tr .notetypes_please_add_another_note_type_first (), parent = self )
281+ self .refresh_list (None )
282+
283+ remove_notetypes (
284+ parent = self ,
285+ notetype_ids = notetype_ids ,
286+ protected_notetype_id = protected_notetype_id ,
287+ ).success (on_success ).run_in_background ()
209288
210289 def onAdvanced (self ) -> None :
211290 nt = self .current_notetype ()
0 commit comments