From 30a251c422a574430a0ac6a42b2ed430fa920641 Mon Sep 17 00:00:00 2001 From: Billy Date: Sun, 14 Apr 2024 01:10:21 +0530 Subject: [PATCH] feat: Check for unsaved changes on app destroyed event --- biscuit/core/commands.py | 1 + biscuit/core/gui.py | 5 +++++ .../layout/base/content/editors/__init__.py | 12 ++++++++++-- .../core/layout/base/content/editors/tabs.py | 18 ++++++++++-------- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/biscuit/core/commands.py b/biscuit/core/commands.py index edd3c047..d30ab00d 100644 --- a/biscuit/core/commands.py +++ b/biscuit/core/commands.py @@ -90,6 +90,7 @@ def close_dir(self, *_) -> None: self.base.close_active_directory() def quit(self, *_) -> None: + self.base.on_close_app() self.base.destroy() def toggle_maximize(self, *_) -> None: diff --git a/biscuit/core/gui.py b/biscuit/core/gui.py index d5c6db28..0ae4cb95 100644 --- a/biscuit/core/gui.py +++ b/biscuit/core/gui.py @@ -60,6 +60,8 @@ def setup_tk(self) -> None: self.setup_floating_widgets() self.setup_root() + + self.protocol("WM_DELETE_WINDOW", self.on_close_app) def setup_root(self): # the very parent of all GUI parts @@ -137,6 +139,9 @@ def on_gui_update(self, *_) -> None: def register_onfocus(self, fn) -> None: self.onfocus_callbacks.append(fn) + + def on_close_app(self) -> None: + self.editorsmanager.delete_all_editors() def on_focus(self, *_) -> None: for fn in self.onfocus_callbacks: diff --git a/biscuit/core/layout/base/content/editors/__init__.py b/biscuit/core/layout/base/content/editors/__init__.py index f9705697..9ebef994 100644 --- a/biscuit/core/layout/base/content/editors/__init__.py +++ b/biscuit/core/layout/base/content/editors/__init__.py @@ -74,19 +74,23 @@ def generate_actionsets(self) -> None: def add_default_editors(self) -> None: "Adds all default editors" + self.add_editors(self.default_editors) def add_welcome(self) -> None: "Shows welcome tab" + self.add_editor(Welcome(self)) def add_editors(self, editors: list[Editor]) -> None: "Append s to list. Create tabs for them." + for editor in editors: self.add_editor(editor) def add_editor(self, editor: Union[Editor,BaseEditor]) -> Editor | BaseEditor: "Appends a editor to list. Create a tab." + self.active_editors.append(editor) if editor.content: editor.content.create_buttons(self.editorsbar.container) @@ -97,9 +101,12 @@ def add_editor(self, editor: Union[Editor,BaseEditor]) -> Editor | BaseEditor: def delete_all_editors(self) -> None: "Permanently delete all editors." - for editor in self.active_editors: - editor.destroy() + for tab in self.tabs.tabs: + if e := tab.editor: + self.tabs.save_unsaved_changes(e) + e.destroy() + self.editorsbar.clear() self.tabs.clear_all_tabs() self.active_editors.clear() @@ -108,6 +115,7 @@ def delete_all_editors(self) -> None: def reopen_active_editor(self) -> None: "Reopen the active editor" + if self.active_editor and self.active_editor.exists: self.delete_editor(self.active_editor) self.update() diff --git a/biscuit/core/layout/base/content/editors/tabs.py b/biscuit/core/layout/base/content/editors/tabs.py index f7e19b8c..c659e5c1 100644 --- a/biscuit/core/layout/base/content/editors/tabs.py +++ b/biscuit/core/layout/base/content/editors/tabs.py @@ -32,17 +32,19 @@ def add_tab(self, editor: Editor) -> None: def close_active_tab(self) -> None: self.close_tab(self.active_tab) + + def save_unsaved_changes(self, e) -> None: + if e.content and e.content.editable and e.content.unsaved_changes: + if askyesno(f"Unsaved changes", f"Do you want to save the changes you made to {e.filename}"): + if e.exists: + e.save() + else: + self.base.commands.save_as() + print(f"Saved changes to {e.path}.") def close_tab(self, tab: Tab) -> None: if e := tab.editor: - # checking if its a text editor - if e.content and e.content.editable and e.content.unsaved_changes: - if askyesno(f"Unsaved changes", f"Do you want to save the changes you made to {tab.editor.filename}"): - if e.exists: - e.save() - else: - self.base.commands.save_as() - print(f"Saved changes to {e.path}.") + self.save_unsaved_changes(e) try: i = self.tabs.index(tab)