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: