feat: show close dialog if app is dirty #406

This commit is contained in:
0xMRTT 2022-09-13 23:16:14 +02:00
parent 9ee15e1098
commit 9891485f1e
No known key found for this signature in database
GPG key ID: AC9E06BF3DECB6FB
2 changed files with 83 additions and 7 deletions

View file

@ -199,8 +199,6 @@ class GradienceApplication(Adw.Application):
)
buglog(self.custom_presets)
print(self.custom_presets)
custom_menu_section = Gio.Menu()
if self.custom_presets["user"] or self.custom_presets["curated"] or self.custom_presets["official"]:
for repo, content in self.custom_presets.items():
@ -216,7 +214,6 @@ class GradienceApplication(Adw.Application):
menu_item.set_action_and_target_value("")
custom_menu_section.append_item(menu_item)
else:
print("no presets")
menu_item = Gio.MenuItem()
menu_item.set_label("No presets found")
custom_menu_section.append_item(menu_item)
@ -636,6 +633,79 @@ class GradienceApplication(Adw.Application):
dialog.present()
def show_exit_dialog(self, *_args):
dialog = Adw.MessageDialog(
transient_for=self.props.active_window,
heading=_("You have unsaved changes!"),
body=_(
"Saving preset to <tt>{0}</tt>. If that preset already exists, it will be overwritten!"
).format(
os.path.join(
os.environ.get("XDG_CONFIG_HOME",
os.environ["HOME"] + "/.config"),
"presets",
"user",
to_slug_case(self.preset_name) + ".json",
)
),
body_use_markup=True,
)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("discard", _("Discard"))
dialog.add_response("save", _("Save"))
dialog.set_response_appearance(
"save", Adw.ResponseAppearance.SUGGESTED)
dialog.set_response_appearance(
"discard", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.set_default_response("cancel")
dialog.set_close_response("cancel")
preset_entry = Gtk.Entry(placeholder_text="Preset Name")
preset_entry.set_text(self.preset_name)
def on_preset_entry_change(*_args):
if len(preset_entry.get_text()) == 0:
dialog.set_body(
_(
"Saving preset to <tt>{0}</tt>. If that preset already exists, it will be overwritten!"
).format(
os.path.join(
os.environ.get(
"XDG_CONFIG_HOME", os.environ["HOME"] +
"/.config"
),
"presets",
"user",
)
)
)
dialog.set_response_enabled("save", False)
else:
dialog.set_body(
_(
"Saving preset to <tt>{0}</tt>. If that preset already exists, it will be overwritten!"
).format(
os.path.join(
os.environ.get(
"XDG_CONFIG_HOME", os.environ["HOME"] +
"/.config"
),
"presets",
"user",
to_slug_case(preset_entry.get_text()) + ".json",
)
)
)
dialog.set_response_enabled("save", True)
preset_entry.connect("changed", on_preset_entry_change)
dialog.set_extra_child(preset_entry)
dialog.connect("response", self.save_preset, preset_entry)
dialog.present()
def save_preset(self, _unused, response, entry):
if response == "save":
if not os.path.exists(
@ -678,7 +748,9 @@ class GradienceApplication(Adw.Application):
self.clear_dirty()
self.win.toast_overlay.add_toast(
Adw.Toast(title=_("Preset saved")))
elif response == "discard":
self.clear_dirty()
self.win.close()
def apply_color_scheme(self, widget, response):
if response == "apply":
if widget.get_app_types()["gtk4"]:

View file

@ -78,7 +78,7 @@ class GradienceMainWindow(Adw.ApplicationWindow):
"window-fullscreen", self, "fullscreened", Gio.SettingsBindFlags.DEFAULT
)
self.connect("close-request", self.close_window)
self.connect("close-request", self.on_close_request)
self.style_manager = self.get_application().style_manager
self.first_apply = True
@ -109,9 +109,13 @@ class GradienceMainWindow(Adw.ApplicationWindow):
def on_file_picker_button_clicked(self, *args):
self.monet_file_chooser_dialog.show()
def close_window(self, *args):
def on_close_request(self, *args):
if self.get_application().is_dirty:
buglog("app is dirty")
buglog("Window close request")
self.get_application().show_exit_dialog()
return True
else:
self.close()
def on_monet_file_chooser_response(self, widget, response):
if response == Gtk.ResponseType.ACCEPT: