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
This commit is contained in:
pax 2026-04-04 20:41:52 -05:00
parent cb249d9b36
commit 823bcd500e
2 changed files with 29 additions and 16 deletions

View File

@ -923,6 +923,12 @@ class BooruApp(QMainWindow):
self._status.showMessage(f"#{post.id} not in library") self._status.showMessage(f"#{post.id} not in library")
self._update_fullscreen_state() 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: def _open_fullscreen_preview(self) -> None:
path = self._preview._current_path path = self._preview._current_path
if not path: if not path:
@ -934,8 +940,7 @@ class BooruApp(QMainWindow):
self._fullscreen_window = FullscreenPreview(grid_cols=cols, parent=self) self._fullscreen_window = FullscreenPreview(grid_cols=cols, parent=self)
self._fullscreen_window.navigate.connect(self._navigate_fullscreen) self._fullscreen_window.navigate.connect(self._navigate_fullscreen)
self._fullscreen_window.favorite_requested.connect(self._favorite_from_preview) self._fullscreen_window.favorite_requested.connect(self._favorite_from_preview)
self._fullscreen_window.save_requested.connect(lambda: self._save_from_preview("")) self._fullscreen_window.save_toggle_requested.connect(self._save_toggle_from_slideshow)
self._fullscreen_window.unsave_requested.connect(self._unsave_from_preview)
self._fullscreen_window.destroyed.connect(self._on_fullscreen_closed) self._fullscreen_window.destroyed.connect(self._on_fullscreen_closed)
self._fullscreen_window.set_media(path, self._preview._info_label.text()) self._fullscreen_window.set_media(path, self._preview._info_label.text())
self._update_fullscreen_state() self._update_fullscreen_state()

View File

@ -27,8 +27,7 @@ class FullscreenPreview(QMainWindow):
navigate = Signal(int) # direction: -1/+1 for left/right, -cols/+cols for up/down navigate = Signal(int) # direction: -1/+1 for left/right, -cols/+cols for up/down
favorite_requested = Signal() favorite_requested = Signal()
save_requested = Signal() save_toggle_requested = Signal() # save or unsave depending on state
unsave_requested = Signal()
def __init__(self, grid_cols: int = 3, parent=None) -> None: def __init__(self, grid_cols: int = 3, parent=None) -> None:
super().__init__(parent, Qt.WindowType.Window) super().__init__(parent, Qt.WindowType.Window)
@ -41,7 +40,8 @@ class FullscreenPreview(QMainWindow):
main_layout.setSpacing(0) main_layout.setSpacing(0)
# Top toolbar # Top toolbar
toolbar = QHBoxLayout() self._toolbar = QWidget()
toolbar = QHBoxLayout(self._toolbar)
toolbar.setContentsMargins(8, 4, 8, 4) toolbar.setContentsMargins(8, 4, 8, 4)
self._fav_btn = QPushButton("Favorite") self._fav_btn = QPushButton("Favorite")
@ -50,21 +50,17 @@ class FullscreenPreview(QMainWindow):
toolbar.addWidget(self._fav_btn) toolbar.addWidget(self._fav_btn)
self._save_btn = QPushButton("Save") self._save_btn = QPushButton("Save")
self._save_btn.setFixedWidth(60) self._save_btn.setFixedWidth(70)
self._save_btn.clicked.connect(self.save_requested) self._save_btn.clicked.connect(self.save_toggle_requested)
toolbar.addWidget(self._save_btn) toolbar.addWidget(self._save_btn)
self._is_saved = False
self._unsave_btn = QPushButton("Unsave")
self._unsave_btn.setFixedWidth(70)
self._unsave_btn.clicked.connect(self.unsave_requested)
toolbar.addWidget(self._unsave_btn)
toolbar.addStretch() toolbar.addStretch()
self._info_label = QLabel() self._info_label = QLabel()
toolbar.addWidget(self._info_label) toolbar.addWidget(self._info_label)
main_layout.addLayout(toolbar) main_layout.addWidget(self._toolbar)
# Media stack # Media stack
self._stack = QStackedWidget() self._stack = QStackedWidget()
@ -86,8 +82,8 @@ class FullscreenPreview(QMainWindow):
def update_state(self, favorited: bool, saved: bool) -> None: def update_state(self, favorited: bool, saved: bool) -> None:
self._fav_btn.setText("Unfavorite" if favorited else "Favorite") self._fav_btn.setText("Unfavorite" if favorited else "Favorite")
self._fav_btn.setFixedWidth(90 if favorited else 80) self._fav_btn.setFixedWidth(90 if favorited else 80)
self._save_btn.setEnabled(not saved) self._is_saved = saved
self._unsave_btn.setEnabled(saved) self._save_btn.setText("Unsave" if saved else "Save")
def set_media(self, path: str, info: str = "") -> None: def set_media(self, path: str, info: str = "") -> None:
self._info_label.setText(info) self._info_label.setText(info)
@ -116,7 +112,19 @@ class FullscreenPreview(QMainWindow):
if isinstance(obj, (QLineEdit, QTextEdit, QSpinBox, QComboBox)): if isinstance(obj, (QLineEdit, QTextEdit, QSpinBox, QComboBox)):
return super().eventFilter(obj, event) return super().eventFilter(obj, event)
key = event.key() 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() self.close()
return True return True
elif key in (Qt.Key.Key_Left, Qt.Key.Key_H): elif key in (Qt.Key.Key_Left, Qt.Key.Key_H):