Skip to content

Commit 26d3b19

Browse files
authored
fix(ui): hide library actions when no library is open (#787)
1 parent f38a79b commit 26d3b19

File tree

1 file changed

+116
-69
lines changed

1 file changed

+116
-69
lines changed

tagstudio/src/qt/ts_qt.py

Lines changed: 116 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ def __init__(self, backend, args):
211211
def init_workers(self):
212212
"""Init workers for rendering thumbnails."""
213213
if not self.thumb_threads:
214-
max_threads = os.cpu_count()
214+
max_threads = os.cpu_count() or 1
215215
for i in range(max_threads):
216216
thread = Consumer(self.thumb_job_queue)
217217
thread.setObjectName(f"ThumbRenderer_{i}")
@@ -355,12 +355,12 @@ def start(self) -> None:
355355

356356
file_menu.addSeparator()
357357

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(
361361
lambda: self.callback_library_needed_check(self.backup_library)
362362
)
363-
save_library_backup_action.setShortcut(
363+
self.save_library_backup_action.setShortcut(
364364
QtCore.QKeyCombination(
365365
QtCore.Qt.KeyboardModifier(
366366
QtCore.Qt.KeyboardModifier.ControlModifier
@@ -369,65 +369,71 @@ def start(self) -> None:
369369
QtCore.Qt.Key.Key_S,
370370
)
371371
)
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)
374375

375376
file_menu.addSeparator()
376377

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(
380381
lambda: self.callback_library_needed_check(self.add_new_files_callback)
381382
)
382-
add_new_files_action.setShortcut(
383+
self.refresh_dir_action.setShortcut(
383384
QtCore.QKeyCombination(
384385
QtCore.Qt.KeyboardModifier(QtCore.Qt.KeyboardModifier.ControlModifier),
385386
QtCore.Qt.Key.Key_R,
386387
)
387388
)
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)
390392
file_menu.addSeparator()
391393

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)
396399
file_menu.addSeparator()
397400

398401
# 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(
403406
QtCore.QKeyCombination(
404407
QtCore.Qt.KeyboardModifier(QtCore.Qt.KeyboardModifier.ControlModifier),
405408
QtCore.Qt.Key.Key_T,
406409
)
407410
)
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)
410414

411415
edit_menu.addSeparator()
412416

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(
417421
QtCore.QKeyCombination(
418422
QtCore.Qt.KeyboardModifier(QtCore.Qt.KeyboardModifier.ControlModifier),
419423
QtCore.Qt.Key.Key_A,
420424
)
421425
)
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)
431437

432438
self.copy_buffer: dict = {"fields": [], "tags": []}
433439

@@ -477,24 +483,26 @@ def start(self) -> None:
477483

478484
edit_menu.addSeparator()
479485

480-
manage_file_extensions_action = QAction(menu_bar)
486+
self.manage_file_ext_action = QAction(menu_bar)
481487
Translations.translate_qobject(
482-
manage_file_extensions_action, "menu.edit.manage_file_extensions"
488+
self.manage_file_ext_action, "menu.edit.manage_file_extensions"
483489
)
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(
491498
QtCore.QKeyCombination(
492499
QtCore.Qt.KeyboardModifier(QtCore.Qt.KeyboardModifier.ControlModifier),
493500
QtCore.Qt.Key.Key_M,
494501
)
495502
)
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)
498506

499507
# View Menu ============================================================
500508
show_libs_list_action = QAction(menu_bar)
@@ -524,32 +532,37 @@ def create_fix_unlinked_entries_modal():
524532
self.unlinked_modal = FixUnlinkedEntriesModal(self.lib, self)
525533
self.unlinked_modal.show()
526534

527-
fix_unlinked_entries_action = QAction(menu_bar)
535+
self.fix_unlinked_entries_action = QAction(menu_bar)
528536
Translations.translate_qobject(
529-
fix_unlinked_entries_action, "menu.tools.fix_unlinked_entries"
537+
self.fix_unlinked_entries_action, "menu.tools.fix_unlinked_entries"
530538
)
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)
533542

534543
def create_dupe_files_modal():
535544
if not hasattr(self, "dupe_modal"):
536545
self.dupe_modal = FixDupeFilesModal(self.lib, self)
537546
self.dupe_modal.show()
538547

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)
543553

544554
tools_menu.addSeparator()
545555

546556
# 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(
550562
lambda: CacheManager.clear_cache(self.lib.library_dir)
551563
)
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)
553566

554567
# create_collage_action = QAction("Create Collage", menu_bar)
555568
# create_collage_action.triggered.connect(lambda: self.create_collage())
@@ -570,10 +583,11 @@ def create_folders_tags_modal():
570583
self.folders_modal = FoldersToTagsModal(self.lib, self)
571584
self.folders_modal.show()
572585

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)
577591

578592
# Help Menu ============================================================
579593
def create_about_modal():
@@ -797,6 +811,21 @@ def close_library(self, is_shutdown: bool = False):
797811
self.preview_panel.update_widgets()
798812
self.main_window.toggle_landing_page(enabled=True)
799813
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+
)
800829

801830
# NOTE: Doesn't try to disable during tests
802831
if self.add_tag_to_selected_action:
@@ -855,13 +884,13 @@ def select_all_action_callback(self):
855884

856885
self.set_macro_menu_viability()
857886
self.set_clipboard_menu_viability()
858-
self.set_add_to_selected_visibility()
887+
self.set_select_actions_visibility()
859888

860889
self.preview_panel.update_widgets(update_preview=False)
861890

862891
def clear_select_action_callback(self):
863892
self.selected.clear()
864-
self.set_add_to_selected_visibility()
893+
self.set_select_actions_visibility()
865894
for item in self.item_thumbs:
866895
item.thumb_button.set_selected(False)
867896

@@ -873,7 +902,7 @@ def add_tags_to_selected_callback(self, tag_ids: list[int]):
873902
for entry_id in self.selected:
874903
self.lib.add_tags_to_entry(entry_id, tag_ids)
875904

876-
def show_tag_database(self):
905+
def show_tag_manager(self):
877906
self.modal = PanelModal(
878907
widget=TagDatabasePanel(self.lib),
879908
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):
12441273

12451274
self.set_macro_menu_viability()
12461275
self.set_clipboard_menu_viability()
1247-
self.set_add_to_selected_visibility()
1276+
self.set_select_actions_visibility()
12481277

12491278
self.preview_panel.update_widgets()
12501279

@@ -1261,14 +1290,21 @@ def set_clipboard_menu_viability(self):
12611290
else:
12621291
self.paste_fields_action.setEnabled(False)
12631292

1264-
def set_add_to_selected_visibility(self):
1293+
def set_select_actions_visibility(self):
12651294
if not self.add_tag_to_selected_action:
12661295
return
12671296

1297+
if self.frame_content:
1298+
self.select_all_action.setEnabled(True)
1299+
else:
1300+
self.select_all_action.setEnabled(False)
1301+
12681302
if self.selected:
12691303
self.add_tag_to_selected_action.setEnabled(True)
1304+
self.clear_select_action.setEnabled(True)
12701305
else:
12711306
self.add_tag_to_selected_action.setEnabled(False)
1307+
self.clear_select_action.setEnabled(False)
12721308

12731309
def update_completions_list(self, text: str) -> None:
12741310
matches = re.search(
@@ -1633,7 +1669,18 @@ def init_library(self, path: Path, open_status: LibraryStatus):
16331669
self.main_window.setAcceptDrops(True)
16341670

16351671
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+
16371684
self.preview_panel.update_widgets()
16381685

16391686
# page (re)rendering, extract eventually

0 commit comments

Comments
 (0)