@@ -211,7 +211,7 @@ def __init__(self, backend, args):
211
211
def init_workers (self ):
212
212
"""Init workers for rendering thumbnails."""
213
213
if not self .thumb_threads :
214
- max_threads = os .cpu_count ()
214
+ max_threads = os .cpu_count () or 1
215
215
for i in range (max_threads ):
216
216
thread = Consumer (self .thumb_job_queue )
217
217
thread .setObjectName (f"ThumbRenderer_{ i } " )
@@ -355,12 +355,12 @@ def start(self) -> None:
355
355
356
356
file_menu .addSeparator ()
357
357
358
- save_library_backup_action = QAction (menu_bar )
359
- Translations .translate_qobject (save_library_backup_action , "menu.file.save_backup" )
360
- save_library_backup_action .triggered .connect (
358
+ self . save_library_backup_action = QAction (menu_bar )
359
+ Translations .translate_qobject (self . save_library_backup_action , "menu.file.save_backup" )
360
+ self . save_library_backup_action .triggered .connect (
361
361
lambda : self .callback_library_needed_check (self .backup_library )
362
362
)
363
- save_library_backup_action .setShortcut (
363
+ self . save_library_backup_action .setShortcut (
364
364
QtCore .QKeyCombination (
365
365
QtCore .Qt .KeyboardModifier (
366
366
QtCore .Qt .KeyboardModifier .ControlModifier
@@ -369,65 +369,71 @@ def start(self) -> None:
369
369
QtCore .Qt .Key .Key_S ,
370
370
)
371
371
)
372
- save_library_backup_action .setStatusTip ("Ctrl+Shift+S" )
373
- file_menu .addAction (save_library_backup_action )
372
+ self .save_library_backup_action .setStatusTip ("Ctrl+Shift+S" )
373
+ self .save_library_backup_action .setEnabled (False )
374
+ file_menu .addAction (self .save_library_backup_action )
374
375
375
376
file_menu .addSeparator ()
376
377
377
- add_new_files_action = QAction (menu_bar )
378
- Translations .translate_qobject (add_new_files_action , "menu.file.refresh_directories" )
379
- add_new_files_action .triggered .connect (
378
+ self . refresh_dir_action = QAction (menu_bar )
379
+ Translations .translate_qobject (self . refresh_dir_action , "menu.file.refresh_directories" )
380
+ self . refresh_dir_action .triggered .connect (
380
381
lambda : self .callback_library_needed_check (self .add_new_files_callback )
381
382
)
382
- add_new_files_action .setShortcut (
383
+ self . refresh_dir_action .setShortcut (
383
384
QtCore .QKeyCombination (
384
385
QtCore .Qt .KeyboardModifier (QtCore .Qt .KeyboardModifier .ControlModifier ),
385
386
QtCore .Qt .Key .Key_R ,
386
387
)
387
388
)
388
- add_new_files_action .setStatusTip ("Ctrl+R" )
389
- file_menu .addAction (add_new_files_action )
389
+ self .refresh_dir_action .setStatusTip ("Ctrl+R" )
390
+ self .refresh_dir_action .setEnabled (False )
391
+ file_menu .addAction (self .refresh_dir_action )
390
392
file_menu .addSeparator ()
391
393
392
- close_library_action = QAction (menu_bar )
393
- Translations .translate_qobject (close_library_action , "menu.file.close_library" )
394
- close_library_action .triggered .connect (self .close_library )
395
- file_menu .addAction (close_library_action )
394
+ self .close_library_action = QAction (menu_bar )
395
+ Translations .translate_qobject (self .close_library_action , "menu.file.close_library" )
396
+ self .close_library_action .triggered .connect (self .close_library )
397
+ self .close_library_action .setEnabled (False )
398
+ file_menu .addAction (self .close_library_action )
396
399
file_menu .addSeparator ()
397
400
398
401
# Edit Menu ============================================================
399
- new_tag_action = QAction (menu_bar )
400
- Translations .translate_qobject (new_tag_action , "menu.edit.new_tag" )
401
- new_tag_action .triggered .connect (lambda : self .add_tag_action_callback ())
402
- new_tag_action .setShortcut (
402
+ self . new_tag_action = QAction (menu_bar )
403
+ Translations .translate_qobject (self . new_tag_action , "menu.edit.new_tag" )
404
+ self . new_tag_action .triggered .connect (lambda : self .add_tag_action_callback ())
405
+ self . new_tag_action .setShortcut (
403
406
QtCore .QKeyCombination (
404
407
QtCore .Qt .KeyboardModifier (QtCore .Qt .KeyboardModifier .ControlModifier ),
405
408
QtCore .Qt .Key .Key_T ,
406
409
)
407
410
)
408
- new_tag_action .setToolTip ("Ctrl+T" )
409
- edit_menu .addAction (new_tag_action )
411
+ self .new_tag_action .setToolTip ("Ctrl+T" )
412
+ self .new_tag_action .setEnabled (False )
413
+ edit_menu .addAction (self .new_tag_action )
410
414
411
415
edit_menu .addSeparator ()
412
416
413
- select_all_action = QAction (menu_bar )
414
- Translations .translate_qobject (select_all_action , "select.all" )
415
- select_all_action .triggered .connect (self .select_all_action_callback )
416
- select_all_action .setShortcut (
417
+ self . select_all_action = QAction (menu_bar )
418
+ Translations .translate_qobject (self . select_all_action , "select.all" )
419
+ self . select_all_action .triggered .connect (self .select_all_action_callback )
420
+ self . select_all_action .setShortcut (
417
421
QtCore .QKeyCombination (
418
422
QtCore .Qt .KeyboardModifier (QtCore .Qt .KeyboardModifier .ControlModifier ),
419
423
QtCore .Qt .Key .Key_A ,
420
424
)
421
425
)
422
- select_all_action .setToolTip ("Ctrl+A" )
423
- edit_menu .addAction (select_all_action )
424
-
425
- clear_select_action = QAction (menu_bar )
426
- Translations .translate_qobject (clear_select_action , "select.clear" )
427
- clear_select_action .triggered .connect (self .clear_select_action_callback )
428
- clear_select_action .setShortcut (QtCore .Qt .Key .Key_Escape )
429
- clear_select_action .setToolTip ("Esc" )
430
- edit_menu .addAction (clear_select_action )
426
+ self .select_all_action .setToolTip ("Ctrl+A" )
427
+ self .select_all_action .setEnabled (False )
428
+ edit_menu .addAction (self .select_all_action )
429
+
430
+ self .clear_select_action = QAction (menu_bar )
431
+ Translations .translate_qobject (self .clear_select_action , "select.clear" )
432
+ self .clear_select_action .triggered .connect (self .clear_select_action_callback )
433
+ self .clear_select_action .setShortcut (QtCore .Qt .Key .Key_Escape )
434
+ self .clear_select_action .setToolTip ("Esc" )
435
+ self .clear_select_action .setEnabled (False )
436
+ edit_menu .addAction (self .clear_select_action )
431
437
432
438
self .copy_buffer : dict = {"fields" : [], "tags" : []}
433
439
@@ -477,24 +483,26 @@ def start(self) -> None:
477
483
478
484
edit_menu .addSeparator ()
479
485
480
- manage_file_extensions_action = QAction (menu_bar )
486
+ self . manage_file_ext_action = QAction (menu_bar )
481
487
Translations .translate_qobject (
482
- manage_file_extensions_action , "menu.edit.manage_file_extensions"
488
+ self . manage_file_ext_action , "menu.edit.manage_file_extensions"
483
489
)
484
- manage_file_extensions_action .triggered .connect (self .show_file_extension_modal )
485
- edit_menu .addAction (manage_file_extensions_action )
486
-
487
- tag_database_action = QAction (menu_bar )
488
- Translations .translate_qobject (tag_database_action , "menu.edit.manage_tags" )
489
- tag_database_action .triggered .connect (lambda : self .show_tag_database ())
490
- tag_database_action .setShortcut (
490
+ self .manage_file_ext_action .triggered .connect (self .show_file_extension_modal )
491
+ edit_menu .addAction (self .manage_file_ext_action )
492
+ self .manage_file_ext_action .setEnabled (False )
493
+
494
+ self .tag_manager_action = QAction (menu_bar )
495
+ Translations .translate_qobject (self .tag_manager_action , "menu.edit.manage_tags" )
496
+ self .tag_manager_action .triggered .connect (lambda : self .show_tag_manager ())
497
+ self .tag_manager_action .setShortcut (
491
498
QtCore .QKeyCombination (
492
499
QtCore .Qt .KeyboardModifier (QtCore .Qt .KeyboardModifier .ControlModifier ),
493
500
QtCore .Qt .Key .Key_M ,
494
501
)
495
502
)
496
- save_library_backup_action .setStatusTip ("Ctrl+M" )
497
- edit_menu .addAction (tag_database_action )
503
+ self .tag_manager_action .setEnabled (False )
504
+ self .tag_manager_action .setToolTip ("Ctrl+M" )
505
+ edit_menu .addAction (self .tag_manager_action )
498
506
499
507
# View Menu ============================================================
500
508
show_libs_list_action = QAction (menu_bar )
@@ -524,32 +532,37 @@ def create_fix_unlinked_entries_modal():
524
532
self .unlinked_modal = FixUnlinkedEntriesModal (self .lib , self )
525
533
self .unlinked_modal .show ()
526
534
527
- fix_unlinked_entries_action = QAction (menu_bar )
535
+ self . fix_unlinked_entries_action = QAction (menu_bar )
528
536
Translations .translate_qobject (
529
- fix_unlinked_entries_action , "menu.tools.fix_unlinked_entries"
537
+ self . fix_unlinked_entries_action , "menu.tools.fix_unlinked_entries"
530
538
)
531
- fix_unlinked_entries_action .triggered .connect (create_fix_unlinked_entries_modal )
532
- tools_menu .addAction (fix_unlinked_entries_action )
539
+ self .fix_unlinked_entries_action .triggered .connect (create_fix_unlinked_entries_modal )
540
+ self .fix_unlinked_entries_action .setEnabled (False )
541
+ tools_menu .addAction (self .fix_unlinked_entries_action )
533
542
534
543
def create_dupe_files_modal ():
535
544
if not hasattr (self , "dupe_modal" ):
536
545
self .dupe_modal = FixDupeFilesModal (self .lib , self )
537
546
self .dupe_modal .show ()
538
547
539
- fix_dupe_files_action = QAction (menu_bar )
540
- Translations .translate_qobject (fix_dupe_files_action , "menu.tools.fix_duplicate_files" )
541
- fix_dupe_files_action .triggered .connect (create_dupe_files_modal )
542
- tools_menu .addAction (fix_dupe_files_action )
548
+ self .fix_dupe_files_action = QAction (menu_bar )
549
+ Translations .translate_qobject (self .fix_dupe_files_action , "menu.tools.fix_duplicate_files" )
550
+ self .fix_dupe_files_action .triggered .connect (create_dupe_files_modal )
551
+ self .fix_dupe_files_action .setEnabled (False )
552
+ tools_menu .addAction (self .fix_dupe_files_action )
543
553
544
554
tools_menu .addSeparator ()
545
555
546
556
# TODO: Move this to a settings screen.
547
- clear_thumb_cache_action = QAction (menu_bar )
548
- Translations .translate_qobject (clear_thumb_cache_action , "settings.clear_thumb_cache.title" )
549
- clear_thumb_cache_action .triggered .connect (
557
+ self .clear_thumb_cache_action = QAction (menu_bar )
558
+ Translations .translate_qobject (
559
+ self .clear_thumb_cache_action , "settings.clear_thumb_cache.title"
560
+ )
561
+ self .clear_thumb_cache_action .triggered .connect (
550
562
lambda : CacheManager .clear_cache (self .lib .library_dir )
551
563
)
552
- tools_menu .addAction (clear_thumb_cache_action )
564
+ self .clear_thumb_cache_action .setEnabled (False )
565
+ tools_menu .addAction (self .clear_thumb_cache_action )
553
566
554
567
# create_collage_action = QAction("Create Collage", menu_bar)
555
568
# create_collage_action.triggered.connect(lambda: self.create_collage())
@@ -570,10 +583,11 @@ def create_folders_tags_modal():
570
583
self .folders_modal = FoldersToTagsModal (self .lib , self )
571
584
self .folders_modal .show ()
572
585
573
- folders_to_tags_action = QAction (menu_bar )
574
- Translations .translate_qobject (folders_to_tags_action , "menu.macros.folders_to_tags" )
575
- folders_to_tags_action .triggered .connect (create_folders_tags_modal )
576
- macros_menu .addAction (folders_to_tags_action )
586
+ self .folders_to_tags_action = QAction (menu_bar )
587
+ Translations .translate_qobject (self .folders_to_tags_action , "menu.macros.folders_to_tags" )
588
+ self .folders_to_tags_action .triggered .connect (create_folders_tags_modal )
589
+ self .folders_to_tags_action .setEnabled (False )
590
+ macros_menu .addAction (self .folders_to_tags_action )
577
591
578
592
# Help Menu ============================================================
579
593
def create_about_modal ():
@@ -797,6 +811,21 @@ def close_library(self, is_shutdown: bool = False):
797
811
self .preview_panel .update_widgets ()
798
812
self .main_window .toggle_landing_page (enabled = True )
799
813
self .main_window .pagination .setHidden (True )
814
+ try :
815
+ self .save_library_backup_action .setEnabled (False )
816
+ self .close_library_action .setEnabled (False )
817
+ self .refresh_dir_action .setEnabled (False )
818
+ self .tag_manager_action .setEnabled (False )
819
+ self .manage_file_ext_action .setEnabled (False )
820
+ self .new_tag_action .setEnabled (False )
821
+ self .fix_unlinked_entries_action .setEnabled (False )
822
+ self .fix_dupe_files_action .setEnabled (False )
823
+ self .clear_thumb_cache_action .setEnabled (False )
824
+ self .folders_to_tags_action .setEnabled (False )
825
+ except AttributeError :
826
+ logger .warning (
827
+ "[Library] Could not disable library management menu actions. Is this in a test?"
828
+ )
800
829
801
830
# NOTE: Doesn't try to disable during tests
802
831
if self .add_tag_to_selected_action :
@@ -855,13 +884,13 @@ def select_all_action_callback(self):
855
884
856
885
self .set_macro_menu_viability ()
857
886
self .set_clipboard_menu_viability ()
858
- self .set_add_to_selected_visibility ()
887
+ self .set_select_actions_visibility ()
859
888
860
889
self .preview_panel .update_widgets (update_preview = False )
861
890
862
891
def clear_select_action_callback (self ):
863
892
self .selected .clear ()
864
- self .set_add_to_selected_visibility ()
893
+ self .set_select_actions_visibility ()
865
894
for item in self .item_thumbs :
866
895
item .thumb_button .set_selected (False )
867
896
@@ -873,7 +902,7 @@ def add_tags_to_selected_callback(self, tag_ids: list[int]):
873
902
for entry_id in self .selected :
874
903
self .lib .add_tags_to_entry (entry_id , tag_ids )
875
904
876
- def show_tag_database (self ):
905
+ def show_tag_manager (self ):
877
906
self .modal = PanelModal (
878
907
widget = TagDatabasePanel (self .lib ),
879
908
done_callback = lambda : self .preview_panel .update_widgets (update_preview = False ),
@@ -1244,7 +1273,7 @@ def toggle_item_selection(self, item_id: int, append: bool, bridge: bool):
1244
1273
1245
1274
self .set_macro_menu_viability ()
1246
1275
self .set_clipboard_menu_viability ()
1247
- self .set_add_to_selected_visibility ()
1276
+ self .set_select_actions_visibility ()
1248
1277
1249
1278
self .preview_panel .update_widgets ()
1250
1279
@@ -1261,14 +1290,21 @@ def set_clipboard_menu_viability(self):
1261
1290
else :
1262
1291
self .paste_fields_action .setEnabled (False )
1263
1292
1264
- def set_add_to_selected_visibility (self ):
1293
+ def set_select_actions_visibility (self ):
1265
1294
if not self .add_tag_to_selected_action :
1266
1295
return
1267
1296
1297
+ if self .frame_content :
1298
+ self .select_all_action .setEnabled (True )
1299
+ else :
1300
+ self .select_all_action .setEnabled (False )
1301
+
1268
1302
if self .selected :
1269
1303
self .add_tag_to_selected_action .setEnabled (True )
1304
+ self .clear_select_action .setEnabled (True )
1270
1305
else :
1271
1306
self .add_tag_to_selected_action .setEnabled (False )
1307
+ self .clear_select_action .setEnabled (False )
1272
1308
1273
1309
def update_completions_list (self , text : str ) -> None :
1274
1310
matches = re .search (
@@ -1633,7 +1669,18 @@ def init_library(self, path: Path, open_status: LibraryStatus):
1633
1669
self .main_window .setAcceptDrops (True )
1634
1670
1635
1671
self .selected .clear ()
1636
- self .set_add_to_selected_visibility ()
1672
+ self .set_select_actions_visibility ()
1673
+ self .save_library_backup_action .setEnabled (True )
1674
+ self .close_library_action .setEnabled (True )
1675
+ self .refresh_dir_action .setEnabled (True )
1676
+ self .tag_manager_action .setEnabled (True )
1677
+ self .manage_file_ext_action .setEnabled (True )
1678
+ self .new_tag_action .setEnabled (True )
1679
+ self .fix_dupe_files_action .setEnabled (True )
1680
+ self .fix_unlinked_entries_action .setEnabled (True )
1681
+ self .clear_thumb_cache_action .setEnabled (True )
1682
+ self .folders_to_tags_action .setEnabled (True )
1683
+
1637
1684
self .preview_panel .update_widgets ()
1638
1685
1639
1686
# page (re)rendering, extract eventually
0 commit comments