pax b10c00d6bf Initial release — booru image viewer with Qt6 GUI and Textual TUI
Supports Danbooru, Gelbooru, Moebooru, and e621. Features include tag search
with autocomplete, favorites with folders, save-to-library, video playback,
drag-and-drop, multi-select, custom CSS theming, and cross-platform support.
2026-04-04 06:00:50 -05:00

102 lines
2.7 KiB
Python

"""Native file dialog wrappers. Uses zenity on Linux when GTK dialogs are preferred."""
from __future__ import annotations
import subprocess
import sys
from pathlib import Path
from PySide6.QtWidgets import QFileDialog, QWidget
from ..core.config import IS_WINDOWS
def _use_gtk() -> bool:
if IS_WINDOWS:
return False
try:
from ..core.db import Database
db = Database()
val = db.get_setting("file_dialog_platform")
db.close()
return val == "gtk"
except Exception:
return False
def save_file(
parent: QWidget | None,
title: str,
default_name: str,
filter_str: str,
) -> str | None:
"""Show a save file dialog. Returns path or None."""
if _use_gtk():
try:
result = subprocess.run(
[
"zenity", "--file-selection", "--save",
"--title", title,
"--filename", default_name,
"--confirm-overwrite",
],
capture_output=True, text=True,
)
if result.returncode == 0:
return result.stdout.strip()
return None
except FileNotFoundError:
pass # zenity not installed, fall through to Qt
path, _ = QFileDialog.getSaveFileName(parent, title, default_name, filter_str)
return path or None
def open_file(
parent: QWidget | None,
title: str,
filter_str: str,
) -> str | None:
"""Show an open file dialog. Returns path or None."""
if _use_gtk():
try:
result = subprocess.run(
[
"zenity", "--file-selection",
"--title", title,
],
capture_output=True, text=True,
)
if result.returncode == 0:
return result.stdout.strip()
return None
except FileNotFoundError:
pass
path, _ = QFileDialog.getOpenFileName(parent, title, "", filter_str)
return path or None
def select_directory(
parent: QWidget | None,
title: str,
) -> str | None:
"""Show a directory picker. Returns path or None."""
if _use_gtk():
try:
result = subprocess.run(
[
"zenity", "--file-selection", "--directory",
"--title", title,
],
capture_output=True, text=True,
)
if result.returncode == 0:
return result.stdout.strip()
return None
except FileNotFoundError:
pass
path = QFileDialog.getExistingDirectory(parent, title)
return path or None