from pathlib import Path from dzgui.util.strings import picker import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk class FilePicker(Gtk.FileChooserDialog): def __init__(self, parent: Gtk.Window) -> None: super().__init__( title=picker.title, action=Gtk.FileChooserAction.SAVE, transient_for=parent, resizable=True, ) self.add_buttons("_Cancel", Gtk.ResponseType.CANCEL) # type: ignore[no-untyped-call] self.add_buttons("_Save", Gtk.ResponseType.OK) # type: ignore[no-untyped-call] self.set_default_response(Gtk.ResponseType.OK) self.set_current_name(picker.placeholder) def pick_file(self) -> Path | None: res = self.run() # type: ignore[no-untyped-call] if res in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT): self.destroy() return None if res == Gtk.ResponseType.OK: file = self.get_filename() if file is not None: self.destroy() return Path(file) return None class FolderPicker(Gtk.FileChooserDialog): def __init__(self, parent: Gtk.Window, title: str) -> None: super().__init__( title=title, action=Gtk.FileChooserAction.SELECT_FOLDER, parent=parent, resizable=True, ) self.add_buttons("_Cancel", Gtk.ResponseType.CANCEL) # type: ignore[no-untyped-call] self.add_buttons("_OK", Gtk.ResponseType.OK) # type: ignore[no-untyped-call] self.set_default_response(Gtk.ResponseType.OK) def pick_folder(self) -> Path | None: res = self.run() # type: ignore[no-untyped-call] if res in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT): self.destroy() return None if res == Gtk.ResponseType.OK: folder = self.get_current_folder() if folder is None: try: uri = self.get_uri() if uri is None: return None return Path.from_uri(uri) except Exception: # FIXME: edge cases return Path("/") self.destroy() return Path(folder) return None