5353from .widgets .graph_widget import GraphWidget , HorizontalGraphLayout , Node
5454from .widgets .attributes_widget import AttributesWidget
5555from .widgets .graphmap import GraphMap # TODO
56+ from .widgets import loading_indicator
5657from .dialogs import (
5758 about_dialog ,
5859 open_file_dialog ,
8182from .workflows .duplicate_clipcat import duplicate_clipcat_dialog
8283from .workflows .fix_common_problems import fix_common_problems_dialog
8384from .workflows .verify_behavior import verify_behavior
84- from .helpers import make_copy_menu , center_window , common_loading_indicator
85+ from .helpers import make_copy_menu , center_window
8586from . import style
8687
8788
@@ -104,7 +105,6 @@ def emit(this, record):
104105 logging .root .addHandler (LogHandler ())
105106
106107 self .beh : HavokBehavior = None
107- self ._busy = False
108108 self .alias_manager = AliasManager ()
109109 self .attributes_widget : AttributesWidget = None
110110 self .pinned_objects_table : str = None
@@ -300,21 +300,12 @@ def file_save_as(self) -> bool:
300300 return False
301301
302302 def _do_write_to_file (self , file_path ):
303- if self ._busy :
304- return
305-
306- self ._busy = True
307- loading = common_loading_indicator ("Saving" )
308-
309- try :
303+ with loading_indicator ("Saving" ):
310304 if self .config .save_backups :
311305 shutil .copy (self .beh .file , self .beh .file + ".backup" )
312306
313307 self .beh .save_to_file (file_path )
314308 self .logger .info (f"Saved to { file_path } " )
315- finally :
316- dpg .delete_item (loading )
317- self ._busy = False
318309
319310 def _locate_witchy (self ) -> str :
320311 if not self .config .witchy_exe or not os .path .isfile (self .config .witchy_exe ):
@@ -343,14 +334,8 @@ def _locate_hklib(self) -> str:
343334 return self .config .hklib_exe
344335
345336 def _reload_character (self ) -> None :
346- if self ._busy :
347- return
348-
349- self ._busy = True
350337 chr = self .beh .get_character_id ()
351- loading = common_loading_indicator (f"Reloading { chr } ..." )
352-
353- try :
338+ with loading_indicator (f"Reloading { chr } ..." ):
354339 if not self .chr_reloader :
355340 if ChrReloader :
356341 game_config = detect_game_config ()
@@ -359,33 +344,20 @@ def _reload_character(self) -> None:
359344 raise RuntimeError ("ChrReloader is not available" )
360345
361346 self .chr_reloader .reload_character (chr )
362- finally :
363- dpg .delete_item (loading )
364- self ._busy = False
365347
366348 def _repack_binder (self ) -> None :
367- if self ._busy :
368- return
369-
370- self ._busy = True
371-
372349 # Locate external tools
373350 self ._locate_witchy ()
374351 self ._locate_hklib ()
375352
376- loading = common_loading_indicator ("Repacking binder..." )
377-
378- try :
353+ with loading_indicator ("Repacking binder..." ):
379354 self .logger .info ("Saving XML..." )
380355 self .file_save ()
381356 self .logger .info ("Converting XML to HKX..." )
382357 xml_to_hkx (self .beh .file )
383358 self .logger .info ("Repacking Binder..." )
384359 pack_binder (self .beh .file )
385360 self .logger .info ("Done!" )
386- finally :
387- dpg .delete_item (loading )
388- self ._busy = False
389361
390362 def exit_app (self ):
391363 if not self .beh or self .beh .top_undo_id () == self .last_save_undo_id :
@@ -2217,19 +2189,10 @@ def open_mirror_skeleton_dialog(self):
22172189 skeleton_mirror_dialog (self .loaded_skeleton_path , tag = tag )
22182190
22192191 def verify_behavior (self ):
2220- if self ._busy :
2221- return
2222-
2223- self ._busy = True
2224- loading = common_loading_indicator ("Validating behavior..." )
2225-
2226- try :
2192+ with loading_indicator ("Validating behavior..." )
22272193 verify_behavior (self .beh )
22282194 # TODO summary dialog?
22292195 logging .info ("Validation complete, check log for results!" )
2230- finally :
2231- dpg .delete_item (loading )
2232- self ._busy = False
22332196
22342197 def open_apply_template_dialog (self , template_file : str ):
22352198 tag = f"{ self .tag } _apply_template_dialog"
0 commit comments