preview_pane: fix bookmark state in context menu, add folder submenu

behavior change: right-click context menu now shows "Unbookmark" when
the post is already bookmarked, and "Bookmark as" with a folder submenu
(Unfiled / existing folders / + New Folder) when not. Previously showed
a stateless "Bookmark" action regardless of state.
This commit is contained in:
pax 2026-04-10 00:27:36 -05:00
parent 38c5aefa27
commit 48feafa977

View File

@ -310,7 +310,24 @@ class ImagePreview(QWidget):
def _on_context_menu(self, pos) -> None: def _on_context_menu(self, pos) -> None:
menu = QMenu(self) menu = QMenu(self)
fav_action = menu.addAction("Bookmark")
# Bookmark: unbookmark if already bookmarked, folder submenu if not
fav_action = None
bm_folder_actions = {}
bm_new_action = None
bm_unfiled = None
if self._is_bookmarked:
fav_action = menu.addAction("Unbookmark")
else:
bm_menu = menu.addMenu("Bookmark as")
bm_unfiled = bm_menu.addAction("Unfiled")
bm_menu.addSeparator()
if self._bookmark_folders_callback:
for folder in self._bookmark_folders_callback():
a = bm_menu.addAction(folder)
bm_folder_actions[id(a)] = folder
bm_menu.addSeparator()
bm_new_action = bm_menu.addAction("+ New Folder...")
save_menu = menu.addMenu("Save to Library") save_menu = menu.addMenu("Save to Library")
save_unsorted = save_menu.addAction("Unfiled") save_unsorted = save_menu.addAction("Unfiled")
@ -347,6 +364,14 @@ class ImagePreview(QWidget):
return return
if action == fav_action: if action == fav_action:
self.bookmark_requested.emit() self.bookmark_requested.emit()
elif action == bm_unfiled:
self.bookmark_to_folder.emit("")
elif action == bm_new_action:
name, ok = QInputDialog.getText(self, "New Bookmark Folder", "Folder name:")
if ok and name.strip():
self.bookmark_to_folder.emit(name.strip())
elif id(action) in bm_folder_actions:
self.bookmark_to_folder.emit(bm_folder_actions[id(action)])
elif action == save_unsorted: elif action == save_unsorted:
self.save_to_folder.emit("") self.save_to_folder.emit("")
elif action == save_new: elif action == save_new: