diff --git a/gradience/main.py b/gradience/main.py
index 3b06801b..cde326f3 100644
--- a/gradience/main.py
+++ b/gradience/main.py
@@ -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 {0}. 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 {0}. 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 {0}. 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"]:
diff --git a/gradience/window.py b/gradience/window.py
index d1e55169..1b45eea7 100644
--- a/gradience/window.py
+++ b/gradience/window.py
@@ -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: