"""Privacy-screen overlay for the main window.""" from __future__ import annotations from typing import TYPE_CHECKING from PySide6.QtWidgets import QWidget if TYPE_CHECKING: from .main_window import BooruApp class PrivacyController: """Owns the privacy overlay toggle and popout coordination.""" def __init__(self, app: BooruApp) -> None: self._app = app self._on = False self._overlay: QWidget | None = None self._popout_was_visible = False @property def is_active(self) -> bool: return self._on def resize_overlay(self) -> None: """Re-fit the overlay to the main window's current rect.""" if self._overlay is not None and self._on: self._overlay.setGeometry(self._app.rect()) def toggle(self) -> None: if self._overlay is None: self._overlay = QWidget(self._app) self._overlay.setStyleSheet("background: black;") self._overlay.hide() self._on = not self._on if self._on: self._overlay.setGeometry(self._app.rect()) self._overlay.raise_() self._overlay.show() self._app.setWindowTitle("booru-viewer") # Pause preview video if self._app._preview._stack.currentIndex() == 1: self._app._preview._video_player.pause() # Delegate popout hide-and-pause to FullscreenPreview so it # can capture its own geometry for restore. self._popout_was_visible = bool( self._app._popout_ctrl.window and self._app._popout_ctrl.window.isVisible() ) if self._popout_was_visible: self._app._popout_ctrl.window.privacy_hide() else: self._overlay.hide() # Resume embedded preview video — unconditional resume, the # common case (privacy hides -> user comes back -> video should # be playing again) wins over the manually-paused edge case. if self._app._preview._stack.currentIndex() == 1: self._app._preview._video_player.resume() # Restore the popout via its own privacy_show method, which # also re-dispatches the captured geometry to Hyprland (Qt # show() alone doesn't preserve position on Wayland) and # resumes its video. if self._popout_was_visible and self._app._popout_ctrl.window: self._app._popout_ctrl.window.privacy_show()