UI: Add save button to theme selection UI #111506

Closed
Ludvik Koutny wants to merge 1 commits from Rawalanche/blender:themes-save-button into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
2 changed files with 50 additions and 22 deletions

View File

@ -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"

View File

@ -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