Skip to content

Commit

Permalink
feat: Check for unsaved changes on app destroyed event
Browse files Browse the repository at this point in the history
  • Loading branch information
tomlin7 committed Apr 13, 2024
1 parent c9dd044 commit 30a251c
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 10 deletions.
1 change: 1 addition & 0 deletions biscuit/core/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
5 changes: 5 additions & 0 deletions biscuit/core/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
12 changes: 10 additions & 2 deletions biscuit/core/layout/base/content/editors/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <Editor>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)
Expand All @@ -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()
Expand All @@ -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()
Expand Down
18 changes: 10 additions & 8 deletions biscuit/core/layout/base/content/editors/tabs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 30a251c

Please sign in to comment.