68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from enum import Enum, auto
|
|
from pathlib import Path
|
|
|
|
from PySide6.QtWidgets import QFileDialog, QMessageBox, QWidget
|
|
|
|
|
|
class SaveChangesChoice(Enum):
|
|
SAVE = auto()
|
|
DISCARD = auto()
|
|
CANCEL = auto()
|
|
|
|
|
|
class DocumentDialogs:
|
|
"""All modal dialogs used by the document workflow."""
|
|
|
|
FILE_FILTER = "BEdit documents (*.beb *.json);;BEdit binary (*.beb);;JSON (*.json)"
|
|
|
|
def __init__(self, parent: QWidget) -> None:
|
|
self._parent = parent
|
|
|
|
def choose_open_path(self, current_path: Path | None) -> Path | None:
|
|
directory = str(current_path.parent) if current_path else ""
|
|
file_name, _ = QFileDialog.getOpenFileName(
|
|
self._parent,
|
|
"Open BEdit Document",
|
|
directory,
|
|
self.FILE_FILTER,
|
|
)
|
|
return Path(file_name) if file_name else None
|
|
|
|
def choose_save_path(self, current_path: Path | None) -> Path | None:
|
|
suggested = str(current_path) if current_path else "Untitled.beb"
|
|
file_name, selected_filter = QFileDialog.getSaveFileName(
|
|
self._parent,
|
|
"Save BEdit Document",
|
|
suggested,
|
|
self.FILE_FILTER,
|
|
)
|
|
if not file_name:
|
|
return None
|
|
|
|
path = Path(file_name)
|
|
if not path.suffix:
|
|
suffix = ".json" if "JSON" in selected_filter else ".beb"
|
|
path = path.with_suffix(suffix)
|
|
return path
|
|
|
|
def ask_save_changes(self) -> SaveChangesChoice:
|
|
answer = QMessageBox.warning(
|
|
self._parent,
|
|
"Unsaved Changes",
|
|
"The current document has unsaved changes.",
|
|
QMessageBox.StandardButton.Save
|
|
| QMessageBox.StandardButton.Discard
|
|
| QMessageBox.StandardButton.Cancel,
|
|
QMessageBox.StandardButton.Save,
|
|
)
|
|
if answer == QMessageBox.StandardButton.Save:
|
|
return SaveChangesChoice.SAVE
|
|
if answer == QMessageBox.StandardButton.Discard:
|
|
return SaveChangesChoice.DISCARD
|
|
return SaveChangesChoice.CANCEL
|
|
|
|
def show_file_error(self, title: str, error: Exception) -> None:
|
|
QMessageBox.critical(self._parent, title, str(error))
|