Final commit of the gui/app.py + gui/preview.py structural refactor.
Updates the four call sites that were importing through the
preview.py / app.py shims to import from each entity's canonical
sibling module instead, then deletes the now-empty shim files.
Edits:
- main_gui.py:38 from booru_viewer.gui.app import run
→ from booru_viewer.gui.app_runtime import run
- main_window.py:44 from .preview import ImagePreview
→ from .preview_pane import ImagePreview
- main_window.py:1133 from .preview import VIDEO_EXTENSIONS
→ from .media.constants import VIDEO_EXTENSIONS
- main_window.py:2061 from .preview import FullscreenPreview
→ from .popout.window import FullscreenPreview
- main_window.py:2135 from .preview import FullscreenPreview
→ from .popout.window import FullscreenPreview
Deleted:
- booru_viewer/gui/app.py
- booru_viewer/gui/preview.py
Final gui/ tree:
gui/
__init__.py (unchanged, empty)
app_runtime.py entry point + style loader
main_window.py BooruApp QMainWindow
preview_pane.py ImagePreview embedded preview
info_panel.py InfoPanel widget
log_handler.py LogHandler (Qt-aware logger adapter)
async_signals.py AsyncSignals signal hub
search_state.py SearchState dataclass
media/
__init__.py
constants.py VIDEO_EXTENSIONS, _is_video
image_viewer.py ImageViewer (zoom/pan)
mpv_gl.py _MpvGLWidget, _MpvOpenGLSurface
video_player.py VideoPlayer + _ClickSeekSlider
popout/
__init__.py
viewport.py Viewport NamedTuple, _DRIFT_TOLERANCE
window.py FullscreenPreview popout window
grid.py, bookmarks.py, library.py, search.py, sites.py,
settings.py, dialogs.py (all untouched)
Net result for the refactor: 2 god-files (app.py 3608 lines +
preview.py 2273 lines = 5881 lines mixing every concern) replaced
by 12 small clean modules + 2 oversize-by-design god-class files
(main_window.py and popout/window.py — see docs/REFACTOR_PLAN.md
for the indivisible-class rationale).
Followups discovered during execution are recorded in
docs/REFACTOR_NOTES.md (gitignored, local-only).
44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
"""GUI entry point."""
|
|
|
|
import os
|
|
import sys
|
|
|
|
|
|
def main() -> None:
|
|
# Windows: set App User Model ID so taskbar pinning works
|
|
if sys.platform == "win32":
|
|
try:
|
|
import ctypes
|
|
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(
|
|
u"pax.booru-viewer.gui.1"
|
|
)
|
|
except Exception:
|
|
pass
|
|
|
|
# Apply file dialog platform setting before Qt initializes
|
|
if sys.platform != "win32":
|
|
try:
|
|
from booru_viewer.core.db import Database
|
|
db = Database()
|
|
platform = db.get_setting("file_dialog_platform")
|
|
db.close()
|
|
if platform == "gtk":
|
|
# Use xdg-desktop-portal which routes to GTK portal (Thunar)
|
|
os.environ.setdefault("QT_QPA_PLATFORMTHEME", "xdgdesktopportal")
|
|
except Exception as e:
|
|
# Surface DB-init failures to stderr — silently swallowing meant
|
|
# users debugging "why is my file picker the wrong one" had no
|
|
# signal at all when the DB was missing or corrupt.
|
|
print(
|
|
f"booru-viewer: file_dialog_platform DB probe failed: "
|
|
f"{type(e).__name__}: {e}",
|
|
file=sys.stderr,
|
|
)
|
|
|
|
from booru_viewer.gui.app_runtime import run
|
|
run()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|