[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31921] trunk/blender/release/scripts: button to remove presets.
Campbell Barton
ideasman42 at gmail.com
Tue Sep 14 06:58:28 CEST 2010
Revision: 31921
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31921
Author: campbellbarton
Date: 2010-09-14 06:58:25 +0200 (Tue, 14 Sep 2010)
Log Message:
-----------
button to remove presets.
note: this is an option to the add preset operator which is a bit odd but easiest since these classes have all the info needed for removal as well.
Modified Paths:
--------------
trunk/blender/release/scripts/modules/bpy/path.py
trunk/blender/release/scripts/modules/bpy/utils.py
trunk/blender/release/scripts/modules/bpy_types.py
trunk/blender/release/scripts/op/presets.py
trunk/blender/release/scripts/ui/properties_data_lamp.py
trunk/blender/release/scripts/ui/properties_material.py
trunk/blender/release/scripts/ui/properties_physics_cloth.py
trunk/blender/release/scripts/ui/properties_render.py
trunk/blender/release/scripts/ui/space_userpref.py
Modified: trunk/blender/release/scripts/modules/bpy/path.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy/path.py 2010-09-14 01:47:01 UTC (rev 31920)
+++ trunk/blender/release/scripts/modules/bpy/path.py 2010-09-14 04:58:25 UTC (rev 31921)
@@ -94,7 +94,7 @@
name_base = name_base.replace("_", " ")
if name_base.islower():
- return name_base.capitalize()
+ return name_base.lower().title()
else:
return name_base
Modified: trunk/blender/release/scripts/modules/bpy/utils.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy/utils.py 2010-09-14 01:47:01 UTC (rev 31920)
+++ trunk/blender/release/scripts/modules/bpy/utils.py 2010-09-14 04:58:25 UTC (rev 31921)
@@ -472,3 +472,20 @@
elif is_loaded:
print("\taddon_reset_all unloading", mod_name)
addon_disable(mod_name)
+
+def preset_find(name, preset_path, display_name=False):
+ for directory in preset_paths(preset_path):
+
+ if display_name:
+ filename = ""
+ for fn in _os.listdir(directory):
+ if fn.endswith(".py") and name == _bpy.path.display_name(fn):
+ filename = fn
+ break
+ else:
+ filename = name + ".py"
+
+ if filename:
+ filepath = _os.path.join(directory, filename)
+ if _os.path.exists(filepath):
+ return filepath\
Modified: trunk/blender/release/scripts/modules/bpy_types.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy_types.py 2010-09-14 01:47:01 UTC (rev 31920)
+++ trunk/blender/release/scripts/modules/bpy_types.py 2010-09-14 04:58:25 UTC (rev 31921)
@@ -761,7 +761,6 @@
props.filepath = filepath
if operator == "script.execute_preset":
props.menu_idname = self.bl_idname
- props.preset_name = preset_name
def draw_preset(self, context):
"""Define these on the subclass
Modified: trunk/blender/release/scripts/op/presets.py
===================================================================
--- trunk/blender/release/scripts/op/presets.py 2010-09-14 01:47:01 UTC (rev 31920)
+++ trunk/blender/release/scripts/op/presets.py 2010-09-14 04:58:25 UTC (rev 31921)
@@ -31,45 +31,75 @@
# bl_label = "Add a Python Preset"
name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="")
+ remove_active = bpy.props.BoolProperty(default=False, options={'HIDDEN'})
def _as_filename(self, name): # could reuse for other presets
for char in " !@#$%^&*(){}:\";'[]<>,./?":
- name = name.replace('.', '_')
- return name.lower()
+ name = name.replace(char, '_')
+ return name.lower().strip()
def execute(self, context):
+ import os
+ preset_menu_class = getattr(bpy.types, self.preset_menu)
- if not self.name:
- return {'FINISHED'}
+ if not self.remove_active:
+
+ if not self.name:
+ return {'FINISHED'}
- filename = self._as_filename(self.name) + ".py"
+ filename = self._as_filename(self.name) + ".py"
+
+ target_path = bpy.utils.preset_paths(self.preset_subdir)[0] # we need some way to tell the user and system preset path
- target_path = bpy.utils.preset_paths(self.preset_subdir)[0] # we need some way to tell the user and system preset path
+ filepath = os.path.join(target_path, filename)
+ if getattr(self, "save_keyconfig", False):
+ bpy.ops.wm.keyconfig_export(filepath=filepath, kc_name=self.name)
+ file_preset = open(filepath, 'a')
+ file_preset.write("wm.keyconfigs.active = kc\n\n")
+ else:
+ file_preset = open(filepath, 'w')
+ file_preset.write("import bpy\n")
- filepath = os.path.join(target_path, filename)
- if getattr(self, "save_keyconfig", False):
- bpy.ops.wm.keyconfig_export(filepath=filepath, kc_name=self.name)
- file_preset = open(filepath, 'a')
- file_preset.write("wm.keyconfigs.active = kc\n\n")
+ for rna_path in self.preset_values:
+ value = eval(rna_path)
+ file_preset.write("%s = %s\n" % (rna_path, repr(value)))
+
+ file_preset.close()
+
+ preset_menu_class.bl_label = bpy.path.display_name(self.name)
+
else:
- file_preset = open(filepath, 'w')
- file_preset.write("import bpy\n")
+ preset_active = preset_menu_class.bl_label
- for rna_path in self.preset_values:
- value = eval(rna_path)
- file_preset.write("%s = %s\n" % (rna_path, repr(value)))
+ # fairly sloppy but convenient.
+ filepath = bpy.utils.preset_find(preset_active, self.preset_subdir)
+ if not filepath:
+ filepath = bpy.utils.preset_find(preset_active, self.preset_subdir, display_name=True)
- file_preset.close()
+ if not filepath:
+ return {'CANCELLED'}
+ try:
+ os.remove(filepath)
+ except:
+ import traceback
+ traceback.print_exc()
+
+ # XXX, stupid!
+ preset_menu_class.bl_label = bpy.path.display_name(self.preset_menu.replace("_MT_", " ").lower())
+
return {'FINISHED'}
def invoke(self, context, event):
- wm = context.window_manager
- #crashes, TODO - fix
- #return wm.invoke_props_popup(self, event)
+ if not self.remove_active:
+ wm = context.window_manager
+ #crashes, TODO - fix
+ #return wm.invoke_props_popup(self, event)
- wm.invoke_props_popup(self, event)
- return {'RUNNING_MODAL'}
+ wm.invoke_props_popup(self, event)
+ return {'RUNNING_MODAL'}
+ else:
+ return self.execute(context)
class ExecutePreset(bpy.types.Operator):
@@ -78,16 +108,18 @@
bl_label = "Execute a Python Preset"
filepath = bpy.props.StringProperty(name="Path", description="Path of the Python file to execute", maxlen=512, default="")
- preset_name = bpy.props.StringProperty(name="Preset Name", description="Name of the Preset being executed", default="")
menu_idname = bpy.props.StringProperty(name="Menu ID Name", description="ID name of the menu this was called from", default="")
def execute(self, context):
+ from os.path import basename
+ filepath = self.filepath
+
# change the menu title to the most recently chosen option
preset_class = getattr(bpy.types, self.menu_idname)
- preset_class.bl_label = self.preset_name
+ preset_class.bl_label = bpy.path.display_name(basename(filepath))
# execute the preset using script.python_file_run
- bpy.ops.script.python_file_run(filepath=self.filepath)
+ bpy.ops.script.python_file_run(filepath=filepath)
return {'FINISHED'}
@@ -95,7 +127,7 @@
'''Add a Render Preset'''
bl_idname = "render.preset_add"
bl_label = "Add Render Preset"
- name = AddPresetBase.name
+ preset_menu = "RENDER_MT_presets"
preset_values = [
"bpy.context.scene.render.field_order",
@@ -117,7 +149,7 @@
'''Add a Subsurface Scattering Preset'''
bl_idname = "material.sss_preset_add"
bl_label = "Add SSS Preset"
- name = AddPresetBase.name
+ preset_menu = "MATERIAL_MT_sss_presets"
preset_values = [
"bpy.context.material.subsurface_scattering.back",
@@ -142,7 +174,7 @@
'''Add a Cloth Preset'''
bl_idname = "cloth.preset_add"
bl_label = "Add Cloth Preset"
- name = AddPresetBase.name
+ preset_menu = "CLOTH_MT_presets"
preset_values = [
"bpy.context.cloth.settings.air_damping",
@@ -160,7 +192,7 @@
'''Add a Sky & Atmosphere Preset'''
bl_idname = "lamp.sunsky_preset_add"
bl_label = "Add Sunsky Preset"
- name = AddPresetBase.name
+ preset_menu = "LAMP_MT_sunsky_presets"
preset_values = [
"bpy.context.object.data.sky.atmosphere_extinction",
@@ -185,7 +217,7 @@
'''Add an Application Interaction Preset'''
bl_idname = "wm.interaction_preset_add"
bl_label = "Add Interaction Preset"
- name = AddPresetBase.name
+ preset_menu = "USERPREF_MT_interaction_presets"
save_keyconfig = True
preset_values = [
Modified: trunk/blender/release/scripts/ui/properties_data_lamp.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_data_lamp.py 2010-09-14 01:47:01 UTC (rev 31920)
+++ trunk/blender/release/scripts/ui/properties_data_lamp.py 2010-09-14 04:58:25 UTC (rev 31921)
@@ -134,6 +134,7 @@
row.prop(lamp, "use_sky")
row.menu("LAMP_MT_sunsky_presets", text=bpy.types.LAMP_MT_sunsky_presets.bl_label)
row.operator("lamp.sunsky_preset_add", text="", icon="ZOOMIN")
+ row.operator("lamp.sunsky_preset_add", text="", icon="ZOOMOUT").remove_active = True
row = layout.row()
row.active = lamp.use_sky or lamp.use_atmosphere
Modified: trunk/blender/release/scripts/ui/properties_material.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_material.py 2010-09-14 01:47:01 UTC (rev 31920)
+++ trunk/blender/release/scripts/ui/properties_material.py 2010-09-14 04:58:25 UTC (rev 31921)
@@ -448,6 +448,7 @@
sub = row.row(align=True).split(percentage=0.75)
sub.menu("MATERIAL_MT_sss_presets", text=bpy.types.MATERIAL_MT_sss_presets.bl_label)
sub.operator("material.sss_preset_add", text="", icon="ZOOMIN")
+ sub.operator("material.sss_preset_add", text="", icon="ZOOMOUT").remove_active = True
split = layout.split()
Modified: trunk/blender/release/scripts/ui/properties_physics_cloth.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_physics_cloth.py 2010-09-14 01:47:01 UTC (rev 31920)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list