From 79689d149e81a9eee5a9b844d08ef625f60c4ad8 Mon Sep 17 00:00:00 2001 From: Rawalanche Date: Fri, 25 Aug 2023 10:18:15 +0200 Subject: [PATCH] UI: Add save button to theme selection UI --- scripts/startup/bl_operators/presets.py | 71 +++++++++++++++++-------- scripts/startup/bl_ui/space_userpref.py | 1 + 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/scripts/startup/bl_operators/presets.py b/scripts/startup/bl_operators/presets.py index 8b0b103d8b1..95eb6e89fb6 100644 --- a/scripts/startup/bl_operators/presets.py +++ b/scripts/startup/bl_operators/presets.py @@ -51,6 +51,12 @@ class AddPresetBase: default=False, options={'HIDDEN', 'SKIP_SAVE'}, ) + overwrite_active: BoolProperty( + default=False, + options={'HIDDEN', 'SKIP_SAVE'}, + ) + + ask_overwrite = False @staticmethod def as_filename(name): # could reuse for other presets @@ -72,8 +78,16 @@ class AddPresetBase: # Strip surrounding "_" as they are displayed as spaces. return name.translate(trans).strip("_") + def draw(self, _context): + layout = self.layout + if self.ask_overwrite: + layout.label(text="Overwrite existing preset?") + else: + layout.prop(self, "name") + def execute(self, context): import os + import rna_xml from bpy.utils import is_path_builtin if hasattr(self, "pre_cb"): @@ -82,7 +96,7 @@ class AddPresetBase: preset_menu_class = getattr(bpy.types, self.preset_menu) is_xml = getattr(preset_menu_class, "preset_type", None) == 'XML' - is_preset_add = not (self.remove_name or self.remove_active) + is_preset_add = not (self.remove_name or self.remove_active or self.overwrite_active) if is_xml: ext = ".xml" @@ -117,7 +131,6 @@ class AddPresetBase: print("Writing Preset: %r" % filepath) if is_xml: - import rna_xml rna_xml.xml_file_write(context, filepath, preset_menu_class.preset_xml_map) @@ -162,9 +175,8 @@ class AddPresetBase: preset_menu_class.bl_label = bpy.path.display_name(filename) - else: - if self.remove_active: - name = preset_menu_class.bl_label + elif self.remove_active or self.overwrite_active: + name = preset_menu_class.bl_label # fairly sloppy but convenient. filepath = bpy.utils.preset_find(name, @@ -182,22 +194,34 @@ class AddPresetBase: # Do not remove bundled presets if is_path_builtin(filepath): - self.report({'WARNING'}, "Unable to remove default presets") + self.report({'WARNING'}, "Unable to modify default presets") return {'CANCELLED'} - try: - if hasattr(self, "remove"): - self.remove(context, filepath) - else: - os.remove(filepath) - except BaseException as ex: - self.report({'ERROR'}, tip_("Unable to remove preset: %r") % ex) - import traceback - traceback.print_exc() - return {'CANCELLED'} + if self.remove_active: + try: + if hasattr(self, "remove"): + self.remove(context, filepath) + else: + os.remove(filepath) + except BaseException as ex: + self.report({'ERROR'}, tip_("Unable to remove preset: %r") % ex) + import traceback + traceback.print_exc() + return {'CANCELLED'} - # XXX, stupid! - preset_menu_class.bl_label = "Presets" + # XXX, stupid! + preset_menu_class.bl_label = "Presets" + + elif self.overwrite_active: + # Reset the flag so preset name prompt works again + self.ask_overwrite = False + try: + rna_xml.xml_file_write(context, filepath, preset_menu_class.preset_xml_map) + except BaseException as ex: + self.report({'ERROR'}, f"Unable to overwrite preset: {ex}") + import traceback + traceback.print_exc() + return {'CANCELLED'} if hasattr(self, "post_cb"): self.post_cb(context) @@ -208,8 +232,11 @@ class AddPresetBase: self.name = self.as_filename(self.name.strip()) def invoke(self, context, _event): - if not (self.remove_active or self.remove_name): - wm = context.window_manager + wm = context.window_manager + if self.overwrite_active: + self.ask_overwrite = True + return wm.invoke_props_dialog(self) + elif not (self.remove_active or self.remove_name): return wm.invoke_props_dialog(self) else: return self.execute(context) @@ -534,9 +561,9 @@ class AddPresetNodeColor(AddPresetBase, Operator): class AddPresetInterfaceTheme(AddPresetBase, Operator): - """Add or remove a theme preset""" + """Add, remove or save a theme preset""" bl_idname = "wm.interface_theme_preset_add" - bl_label = "Add Theme Preset" + bl_label = "Edit Theme Preset" preset_menu = "USERPREF_MT_interface_theme_presets" preset_subdir = "interface_theme" diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index d8c6e8a6d6f..b06475ae405 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -826,6 +826,7 @@ class USERPREF_PT_theme(ThemePanel, Panel): row = split.row(align=True) row.menu("USERPREF_MT_interface_theme_presets", text=USERPREF_MT_interface_theme_presets.bl_label) + row.operator("wm.interface_theme_preset_add", text="", icon='FILE_TICK').overwrite_active = True row.operator("wm.interface_theme_preset_add", text="", icon='ADD') row.operator("wm.interface_theme_preset_add", text="", icon='REMOVE').remove_active = True -- 2.30.2