diff --git a/src/widgets/file_tabs.py b/src/widgets/file_tabs.py index 405cf82..bc76fc7 100644 --- a/src/widgets/file_tabs.py +++ b/src/widgets/file_tabs.py @@ -9,6 +9,7 @@ from textual_fspicker import FileOpen, FileSave, SelectDirectory from widgets.text_editor import TextEditor from widgets.home_page import HomePage from widgets.context_menu import ContextMenu +from widgets.prompt import Prompt import os, pathlib @@ -99,9 +100,26 @@ class FileTabs(TabbedContent): return False return True + async def close_tab(self, tab: FileTab): + if tab.saved: + self.remove_pane(tab.id) + return + + def callback(should_close: bool): + if should_close: + self.remove_pane(tab.id) + + await self.app.push_screen(Prompt( + f"{tab.file_name} has unsaved changes, are you sure you want to close it?", + prompt_type="confirm" + ), callback=callback) + async def close_open_tab(self): if self.active_pane: - self.remove_pane(self.active) + if not isinstance(self.active_pane, FileTab): + self.remove_pane(self.active) + else: + await self.close_tab(self.active_pane) async def new_file(self): new_tab = FileTab(None) diff --git a/src/widgets/prompt.py b/src/widgets/prompt.py index be841d9..0d8cd55 100644 --- a/src/widgets/prompt.py +++ b/src/widgets/prompt.py @@ -61,7 +61,7 @@ class Prompt(ModalScreen): elif event.button.id == "confirm-list": self.dismiss(self.query_one("#select").value) - def __init__(self, question: str, prompt_type: Literal["confirm", "string"], title: str = "Confirm", **kwargs): + def __init__(self, question: str, prompt_type: Literal["confirm", "string", "list"], title: str = "Confirm", **kwargs): super().__init__() self.question = question self.window_title = title