From 823bcd500ed62a3367e7f6833bba8fc6002493f8 Mon Sep 17 00:00:00 2001 From: pax Date: Sat, 4 Apr 2026 20:41:52 -0500 Subject: [PATCH] Merge Save/Unsave into toggle button, add Ctrl+H to hide UI - Single Save/Unsave button that toggles based on library state - Ctrl+H in slideshow hides/shows toolbar and video controls --- booru_viewer/gui/app.py | 9 +++++++-- booru_viewer/gui/preview.py | 36 ++++++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/booru_viewer/gui/app.py b/booru_viewer/gui/app.py index 9ba06f5..97ef69d 100644 --- a/booru_viewer/gui/app.py +++ b/booru_viewer/gui/app.py @@ -923,6 +923,12 @@ class BooruApp(QMainWindow): self._status.showMessage(f"#{post.id} not in library") self._update_fullscreen_state() + def _save_toggle_from_slideshow(self) -> None: + if self._fullscreen_window and self._fullscreen_window._is_saved: + self._unsave_from_preview() + else: + self._save_from_preview("") + def _open_fullscreen_preview(self) -> None: path = self._preview._current_path if not path: @@ -934,8 +940,7 @@ class BooruApp(QMainWindow): self._fullscreen_window = FullscreenPreview(grid_cols=cols, parent=self) self._fullscreen_window.navigate.connect(self._navigate_fullscreen) self._fullscreen_window.favorite_requested.connect(self._favorite_from_preview) - self._fullscreen_window.save_requested.connect(lambda: self._save_from_preview("")) - self._fullscreen_window.unsave_requested.connect(self._unsave_from_preview) + self._fullscreen_window.save_toggle_requested.connect(self._save_toggle_from_slideshow) self._fullscreen_window.destroyed.connect(self._on_fullscreen_closed) self._fullscreen_window.set_media(path, self._preview._info_label.text()) self._update_fullscreen_state() diff --git a/booru_viewer/gui/preview.py b/booru_viewer/gui/preview.py index a5a3bef..6588e74 100644 --- a/booru_viewer/gui/preview.py +++ b/booru_viewer/gui/preview.py @@ -27,8 +27,7 @@ class FullscreenPreview(QMainWindow): navigate = Signal(int) # direction: -1/+1 for left/right, -cols/+cols for up/down favorite_requested = Signal() - save_requested = Signal() - unsave_requested = Signal() + save_toggle_requested = Signal() # save or unsave depending on state def __init__(self, grid_cols: int = 3, parent=None) -> None: super().__init__(parent, Qt.WindowType.Window) @@ -41,7 +40,8 @@ class FullscreenPreview(QMainWindow): main_layout.setSpacing(0) # Top toolbar - toolbar = QHBoxLayout() + self._toolbar = QWidget() + toolbar = QHBoxLayout(self._toolbar) toolbar.setContentsMargins(8, 4, 8, 4) self._fav_btn = QPushButton("Favorite") @@ -50,21 +50,17 @@ class FullscreenPreview(QMainWindow): toolbar.addWidget(self._fav_btn) self._save_btn = QPushButton("Save") - self._save_btn.setFixedWidth(60) - self._save_btn.clicked.connect(self.save_requested) + self._save_btn.setFixedWidth(70) + self._save_btn.clicked.connect(self.save_toggle_requested) toolbar.addWidget(self._save_btn) - - self._unsave_btn = QPushButton("Unsave") - self._unsave_btn.setFixedWidth(70) - self._unsave_btn.clicked.connect(self.unsave_requested) - toolbar.addWidget(self._unsave_btn) + self._is_saved = False toolbar.addStretch() self._info_label = QLabel() toolbar.addWidget(self._info_label) - main_layout.addLayout(toolbar) + main_layout.addWidget(self._toolbar) # Media stack self._stack = QStackedWidget() @@ -86,8 +82,8 @@ class FullscreenPreview(QMainWindow): def update_state(self, favorited: bool, saved: bool) -> None: self._fav_btn.setText("Unfavorite" if favorited else "Favorite") self._fav_btn.setFixedWidth(90 if favorited else 80) - self._save_btn.setEnabled(not saved) - self._unsave_btn.setEnabled(saved) + self._is_saved = saved + self._save_btn.setText("Unsave" if saved else "Save") def set_media(self, path: str, info: str = "") -> None: self._info_label.setText(info) @@ -116,7 +112,19 @@ class FullscreenPreview(QMainWindow): if isinstance(obj, (QLineEdit, QTextEdit, QSpinBox, QComboBox)): return super().eventFilter(obj, event) key = event.key() - if key in (Qt.Key.Key_Escape, Qt.Key.Key_Q): + mods = event.modifiers() + if key == Qt.Key.Key_H and mods & Qt.KeyboardModifier.ControlModifier: + self._toolbar.setVisible(not self._toolbar.isVisible()) + # Also hide video controls if showing video + if self._stack.currentIndex() == 1: + for child in self._video.findChildren(QPushButton): + child.setVisible(self._toolbar.isVisible()) + for child in self._video.findChildren(QSlider): + child.setVisible(self._toolbar.isVisible()) + for child in self._video.findChildren(QLabel): + child.setVisible(self._toolbar.isVisible()) + return True + elif key in (Qt.Key.Key_Escape, Qt.Key.Key_Q): self.close() return True elif key in (Qt.Key.Key_Left, Qt.Key.Key_H):