StudioLight Editor: Add copy settings and overwrite prompt

Copy settings let users create variations more easily.

Ovewrite prompt is there to be able to edit already existing studiolight.
This commit is contained in:
Clément Foucault 2018-11-30 15:40:46 +01:00
parent 4251ab4675
commit fe28554898
Notes: blender-bot 2023-02-14 04:51:54 +01:00
Referenced by issue #58329, Clearing keyframes not working
3 changed files with 83 additions and 29 deletions

View File

@ -2480,18 +2480,21 @@ class WM_OT_studiolight_install(Operator):
class WM_OT_studiolight_new(Operator):
"""Create custom studio light from the studio light editor settings"""
"""Save custom studio light from the studio light editor settings"""
bl_idname = 'wm.studiolight_new'
bl_label = "Create custom Studio light"
bl_label = "Save custom Studio light"
filename: StringProperty(
name="Name",
default="StudioLight",
)
ask_overide = False
def execute(self, context):
import pathlib
userpref = context.user_preferences
wm = context.window_manager
path_studiolights = bpy.utils.user_resource('DATAFILES')
@ -2508,8 +2511,13 @@ class WM_OT_studiolight_new(Operator):
finalpath = str(path_studiolights.joinpath(self.filename));
if pathlib.Path(finalpath + ".sl").is_file():
self.report({'ERROR'}, "File already exists")
return {'CANCELLED'}
if not self.ask_overide:
self.ask_overide = True
return wm.invoke_props_dialog(self, width=600)
else:
for studio_light in userpref.studio_lights:
if studio_light.name == self.filename + ".sl":
bpy.ops.wm.studiolight_uninstall(index=studio_light.index)
userpref.studio_lights.new(path=finalpath)
@ -2524,7 +2532,10 @@ class WM_OT_studiolight_new(Operator):
def draw(self, context):
layout = self.layout
layout.prop(self, "filename")
if self.ask_overide:
layout.label(text="Warning, file already exists. Overwrite existing file?")
else:
layout.prop(self, "filename")
def invoke(self, context, event):
wm = context.window_manager
@ -2532,6 +2543,7 @@ class WM_OT_studiolight_new(Operator):
class WM_OT_studiolight_uninstall(Operator):
"""Delete Studio Light"""
bl_idname = 'wm.studiolight_uninstall'
bl_label = "Uninstall Studio Light"
index: bpy.props.IntProperty()
@ -2556,6 +2568,28 @@ class WM_OT_studiolight_uninstall(Operator):
return {'CANCELLED'}
class WM_OT_studiolight_copy_settings(Operator):
"""Copy Studio Light settings to the Studio light editor"""
bl_idname = 'wm.studiolight_copy_settings'
bl_label = "Copy Studio Light settings"
index: bpy.props.IntProperty()
def execute(self, context):
userpref = context.user_preferences
system = userpref.system
for studio_light in userpref.studio_lights:
if studio_light.index == self.index:
system.light_ambient = studio_light.light_ambient
for sys_light, light in zip(system.solid_lights, studio_light.solid_lights):
sys_light.use = light.use
sys_light.diffuse_color = light.diffuse_color
sys_light.specular_color = light.specular_color
sys_light.smooth = light.smooth
sys_light.direction = light.direction
return {'FINISHED'}
return {'CANCELLED'}
class WM_OT_studiolight_userpref_show(Operator):
"""Show light user preferences"""
bl_idname = "wm.studiolight_userpref_show"
@ -2819,6 +2853,7 @@ classes = (
WM_OT_studiolight_install,
WM_OT_studiolight_new,
WM_OT_studiolight_uninstall,
WM_OT_studiolight_copy_settings,
WM_OT_studiolight_userpref_show,
WM_OT_tool_set_by_name,
WM_OT_toolbar,

View File

@ -1516,9 +1516,14 @@ class StudioLightPanelMixin():
row = box.row()
row.template_icon(layout.icon(studio_light), scale=6.0)
op = row.operator('wm.studiolight_uninstall', text="", icon='REMOVE')
col = row.column()
op = col.operator('wm.studiolight_uninstall', text="", icon='REMOVE')
op.index = studio_light.index
if studio_light.type == 'STUDIO':
op = col.operator('wm.studiolight_copy_settings', text="", icon='IMPORT')
op.index = studio_light.index
box.label(text=studio_light.name)
@ -1536,29 +1541,6 @@ class USERPREF_PT_studiolight_lights(Panel, StudioLightPanelMixin):
bl_label = "Studio Lights"
sl_type = 'STUDIO'
@classmethod
def poll(cls, context):
userpref = context.user_preferences
return (userpref.active_section == 'LIGHTS')
def opengl_light_buttons(self, layout, light):
col = layout.column()
col.active = light.use
col.prop(light, "use", text="Use Light")
col.prop(light, "diffuse_color", text="Diffuse")
col.prop(light, "specular_color", text="Specular")
col.prop(light, "smooth")
col.prop(light, "direction")
def draw(self, context):
userpref = context.user_preferences
lights = self._get_lights(userpref)
layout = self.layout
self.draw_light_list(layout, lights)
class USERPREF_PT_studiolight_light_editor(Panel):
bl_label = "Studio Light Editor"

View File

@ -743,6 +743,28 @@ static void rna_UserDef_studiolight_spherical_harmonics_coefficients_get(Pointer
}
}
/* StudioLight.solid_lights */
static void rna_UserDef_studiolight_solid_lights_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
StudioLight *sl = (StudioLight *)ptr->data;
rna_iterator_array_begin(iter, sl->light, sizeof(*sl->light), ARRAY_SIZE(sl->light), 0, NULL);
}
static int rna_UserDef_studiolight_solid_lights_length(PointerRNA *ptr)
{
StudioLight *sl = (StudioLight *)ptr->data;
return ARRAY_SIZE(sl->light);
}
/* StudioLight.light_ambient */
static void rna_UserDef_studiolight_light_ambient_get(PointerRNA *ptr, float *values)
{
StudioLight *sl = (StudioLight *)ptr->data;
copy_v3_v3(values, sl->light_ambient);
}
#else
/* TODO(sergey): This technically belongs to blenlib, but we don't link
@ -3387,6 +3409,21 @@ static void rna_def_userdef_studiolight(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Path", "");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "solid_lights", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "light_param", "");
RNA_def_property_struct_type(prop, "UserSolidLight");
RNA_def_property_collection_funcs(prop, "rna_UserDef_studiolight_solid_lights_begin", "rna_iterator_array_next",
"rna_iterator_array_end", "rna_iterator_array_get",
"rna_UserDef_studiolight_solid_lights_length", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Solid Lights", "Lights user to display objects in solid draw mode");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "light_ambient", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_UserDef_studiolight_light_ambient_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Ambient Color", "Color of the ambient light that uniformly lit the scene");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "path_irr_cache", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_funcs(prop, "rna_UserDef_studiolight_path_irr_cache_get", "rna_UserDef_studiolight_path_irr_cache_length", NULL);
RNA_def_property_ui_text(prop, "Irradiance Cache Path", "Path where the irradiance cache is stored");