100 lines
2.6 KiB
Python
100 lines
2.6 KiB
Python
"""Native file dialog wrappers. Uses zenity on Linux when GTK dialogs are preferred."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import subprocess
|
|
|
|
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
|