Context operators for adjusting context values directly to avoid adding operators for adjusting single values which also need duplicate notifiers.

wm.context_set(path="scene.tool_settings.someattr", somevalue)
wm.context_toggle(path="scene.tool_settings.somebool")
wm.context_toggle_values(path="scene.tool_settings.some_enum", value_1="somevalue", value_2="othervalue") # switch between 2 values
wm.context_cycle_enum(path="scene.tool_settings.some_enum", reverse=False)

the path value is taken from the context so the full path is 
context.scene.tool_settings...

This means in keymaps you can cycle draw modes, change PET- anything with rna access.
If its not so nice to map keys to operators like wm.context_set we could use macro's to wrap it and have its own name

Use this for PET and setting pivot options

- Made userpref key shortcut Ctrl+Alt+U since its not used in 2.4x
- added pivot_point_align (Alt+Comma)
- added PET wasnt rna wrapped correctly.
This commit is contained in:
Campbell Barton 2009-10-13 15:30:19 +00:00
parent bdbae46519
commit edfe78aec9
13 changed files with 177 additions and 10 deletions

@ -145,7 +145,7 @@ bpy.ops = bpy_ops()
class MESH_OT_delete_edgeloop(bpy.types.Operator): class MESH_OT_delete_edgeloop(bpy.types.Operator):
'''Export a single object as a stanford PLY with normals, colours and texture coordinates.''' '''Export a single object as a stanford PLY with normals, colours and texture coordinates.'''
__idname__ = "mesh.delete_edgeloop" __idname__ = "mesh.delete_edgeloop"
__label__ = "Export PLY" __label__ = "Delete Edge Loop"
def execute(self, context): def execute(self, context):
bpy.ops.tfm.edge_slide(value=1.0) bpy.ops.tfm.edge_slide(value=1.0)
@ -153,6 +153,100 @@ class MESH_OT_delete_edgeloop(bpy.types.Operator):
bpy.ops.mesh.remove_doubles() bpy.ops.mesh.remove_doubles()
return ('FINISHED',) return ('FINISHED',)
class WM_OT_context_set(bpy.types.Operator):
'''Set a context value.'''
__idname__ = "wm.context_set"
__label__ = "Context Set"
__register__ = True
__undo__ = True
__props__ = [
bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
bpy.props.StringProperty(attr="value", name="Value", description="Assignment value (as a string)", maxlen= 1024, default= "")
]
def execute(self, context):
exec("context.%s=%s" % (self.path, self.value)) # security nuts will complain.
return ('FINISHED',)
class WM_OT_context_toggle(bpy.types.Operator):
'''Toggle a context value.'''
__idname__ = "wm.context_toggle"
__label__ = "Context Toggle"
__register__ = True
__undo__ = True
__props__ = [
bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
]
def execute(self, context):
exec("context.%s=not (context.%s)" % (self.path, self.path)) # security nuts will complain.
return ('FINISHED',)
class WM_OT_context_toggle_values(bpy.types.Operator):
'''Toggle a context value.'''
__idname__ = "wm.context_toggle_values"
__label__ = "Context Toggle Values"
__register__ = True
__undo__ = True
__props__ = [
bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
bpy.props.StringProperty(attr="value_1", name="Value", description="Toggle value (as a string)", maxlen= 1024, default= ""),
bpy.props.StringProperty(attr="value_2", name="Value", description="Toggle value (as a string)", maxlen= 1024, default= "")
]
def execute(self, context):
exec("context.%s = [%s, %s][context.%s!=%s]" % (self.path, self.value_1, self.value_2, self.path, self.value_2)) # security nuts will complain.
return ('FINISHED',)
class WM_OT_context_cycle_enum(bpy.types.Operator):
'''Toggle a context value.'''
__idname__ = "wm.context_cycle_enum"
__label__ = "Context Toggle Values"
__register__ = True
__undo__ = True
__props__ = [
bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
bpy.props.BoolProperty(attr="reverse", name="Reverse", description="Cycle backwards", default= False)
]
def execute(self, context):
orig_value = eval("context.%s" % self.path) # security nuts will complain.
# Have to get rna enum values
rna_struct_str, rna_prop_str = self.path.rsplit('.', 1)
i = rna_prop_str.find('[')
if i != -1: rna_prop_str = rna_prop_str[0:i] # just incse we get "context.foo.bar[0]"
rna_struct = eval("context.%s.rna_type" % rna_struct_str)
rna_prop = rna_struct.properties[rna_prop_str]
if type(rna_prop) != bpy.types.EnumProperty:
raise Exception("expected an enum property")
enums = rna_struct.properties[rna_prop_str].items.keys()
orig_index = enums.index(orig_value)
# Have the info we need, advance to the next item
if self.reverse:
if orig_index==0: advance_enum = enums[-1]
else: advance_enum = enums[orig_index-1]
else:
if orig_index==len(enums)-1: advance_enum = enums[0]
else: advance_enum = enums[orig_index+1]
# set the new value
exec("context.%s=advance_enum" % self.path)
return ('FINISHED',)
bpy.ops.add(MESH_OT_delete_edgeloop) bpy.ops.add(MESH_OT_delete_edgeloop)
bpy.ops.add(WM_OT_context_set)
bpy.ops.add(WM_OT_context_toggle)
bpy.ops.add(WM_OT_context_toggle_values)
bpy.ops.add(WM_OT_context_cycle_enum)

@ -248,5 +248,7 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "unselected", 1); RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "CURVE_OT_specials_menu", WKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CURVE_OT_specials_menu", WKEY, KM_PRESS, 0, 0);
ED_object_generic_keymap(keyconf, keymap, TRUE);
} }

@ -47,6 +47,9 @@ void ED_operatortypes_object(void);
void ED_operatormacros_object(void); void ED_operatormacros_object(void);
void ED_keymap_object(struct wmKeyConfig *keyconf); void ED_keymap_object(struct wmKeyConfig *keyconf);
/* generic editmode keys like pet */
void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int do_pet);
/* send your own notifier for select! */ /* send your own notifier for select! */
void ED_base_object_select(struct Base *base, short mode); void ED_base_object_select(struct Base *base, short mode);
/* includes notifier */ /* includes notifier */

@ -291,5 +291,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
/* UV's */ /* UV's */
WM_keymap_add_item(keymap, "UV_OT_mapping_menu", UKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "UV_OT_mapping_menu", UKEY, KM_PRESS, 0, 0);
ED_object_generic_keymap(keyconf, keymap, TRUE);
} }

@ -273,3 +273,26 @@ void ED_keymap_object(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "LATTICE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "LATTICE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
} }
void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int do_pet)
{
wmKeyMapItem *km;
/* used by mesh, curve & lattice only */
if(do_pet) {
/* context ops */
km = WM_keymap_add_item(keymap, "WM_OT_context_cycle_enum", OKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(km->ptr, "path", "scene.tool_settings.proportional_editing_falloff");
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle_values", OKEY, KM_PRESS, 0, 0);
RNA_string_set(km->ptr, "path", "scene.tool_settings.proportional_editing");
RNA_string_set(km->ptr, "value_1", "'DISABLED'");
RNA_string_set(km->ptr, "value_2", "'ENABLED'");
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle_values", OKEY, KM_PRESS, KM_ALT, 0);
RNA_string_set(km->ptr, "path", "scene.tool_settings.proportional_editing");
RNA_string_set(km->ptr, "value_1", "'DISABLED'");
RNA_string_set(km->ptr, "value_2", "'CONNECTED'");
}
}

@ -2908,7 +2908,7 @@ static void brush_add(PEData *data, short number)
ParticleSimulationData sim = {scene, ob, psys, psmd}; ParticleSimulationData sim = {scene, ob, psys, psmd};
ParticleEditSettings *pset= PE_settings(scene); ParticleEditSettings *pset= PE_settings(scene);
int i, k, n= 0, totpart= psys->totpart; int i, k, n= 0, totpart= psys->totpart;
short mco[2]; float mco[2];
short dmx= 0, dmy= 0; short dmx= 0, dmy= 0;
float co1[3], co2[3], min_d, imat[4][4]; float co1[3], co2[3], min_d, imat[4][4];
float framestep, timestep= psys_get_timestep(&sim); float framestep, timestep= psys_get_timestep(&sim);

@ -3410,10 +3410,7 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "SCREEN_OT_render_view_show", F11KEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SCREEN_OT_render_view_show", F11KEY, KM_PRESS, 0, 0);
/* user prefs */ /* user prefs */
#ifdef __APPLE__ WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", UKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", COMMAKEY, KM_PRESS, KM_OSKEY, 0);
#endif
WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", COMMAKEY, KM_PRESS, KM_CTRL, 0);
/* Anim Playback ------------------------------------------------ */ /* Anim Playback ------------------------------------------------ */

@ -221,6 +221,31 @@ void view3d_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "VIEW3D_OT_snap_menu", SKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "VIEW3D_OT_snap_menu", SKEY, KM_PRESS, KM_SHIFT, 0);
/* context ops */
km = WM_keymap_add_item(keymap, "WM_OT_context_set", COMMAKEY, KM_PRESS, 0, 0);
RNA_string_set(km->ptr, "path", "space_data.pivot_point");
RNA_string_set(km->ptr, "value", "'BOUNDING_BOX_CENTER'");
km = WM_keymap_add_item(keymap, "WM_OT_context_set", COMMAKEY, KM_PRESS, KM_CTRL, 0); /* 2.4x allowed Comma+Shift too, rather not use both */
RNA_string_set(km->ptr, "path", "space_data.pivot_point");
RNA_string_set(km->ptr, "value", "'MEDIAN_POINT'");
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", COMMAKEY, KM_PRESS, KM_ALT, 0); /* new in 2.5 */
RNA_string_set(km->ptr, "path", "space_data.pivot_point_align");
km = WM_keymap_add_item(keymap, "WM_OT_context_set", PERIODKEY, KM_PRESS, 0, 0);
RNA_string_set(km->ptr, "path", "space_data.pivot_point");
RNA_string_set(km->ptr, "value", "'CURSOR'");
km = WM_keymap_add_item(keymap, "WM_OT_context_set", PERIODKEY, KM_PRESS, KM_CTRL, 0);
RNA_string_set(km->ptr, "path", "space_data.pivot_point");
RNA_string_set(km->ptr, "value", "'INDIVIDUAL_CENTERS'");
km = WM_keymap_add_item(keymap, "WM_OT_context_set", PERIODKEY, KM_PRESS, KM_ALT, 0);
RNA_string_set(km->ptr, "path", "space_data.pivot_point");
RNA_string_set(km->ptr, "value", "'ACTIVE_ELEMENT'");
transform_keymap_for_space(keyconf, keymap, SPACE_VIEW3D); transform_keymap_for_space(keyconf, keymap, SPACE_VIEW3D);
fly_modal_keymap(keyconf); fly_modal_keymap(keyconf);

@ -995,10 +995,10 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
} }
else else
{ {
if ((t->options & CTX_NO_PET) == 0 && (ts->proportional)) { if ((t->options & CTX_NO_PET) == 0 && (ts->proportional != PROP_EDIT_OFF)) {
t->flag |= T_PROP_EDIT; t->flag |= T_PROP_EDIT;
if(ts->proportional == 2) if(ts->proportional == PROP_EDIT_CONNECTED)
t->flag |= T_PROP_CONNECTED; // yes i know, has to become define t->flag |= T_PROP_CONNECTED; // yes i know, has to become define
} }
} }

@ -3129,6 +3129,8 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "UV_OT_cursor_set", ACTIONMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "UV_OT_cursor_set", ACTIONMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "UV_OT_tile_set", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "UV_OT_tile_set", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
ED_object_generic_keymap(keyconf, keymap, TRUE);
transform_keymap_for_space(keyconf, keymap, SPACE_IMAGE); transform_keymap_for_space(keyconf, keymap, SPACE_IMAGE);
} }

@ -1016,6 +1016,11 @@ typedef struct Scene {
#define PROP_CONST 5 #define PROP_CONST 5
#define PROP_RANDOM 6 #define PROP_RANDOM 6
/* toolsettings->proportional */
#define PROP_EDIT_OFF 0
#define PROP_EDIT_ON 1
#define PROP_EDIT_CONNECTED 2
/* sce->flag */ /* sce->flag */
#define SCE_DS_SELECTED (1<<0) #define SCE_DS_SELECTED (1<<0)
#define SCE_DS_COLLAPSED (1<<1) #define SCE_DS_COLLAPSED (1<<1)

@ -502,6 +502,12 @@ static void rna_def_tool_settings(BlenderRNA *brna)
{AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace", ""}, {AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace", ""},
{0, NULL, 0, NULL, NULL}}; {0, NULL, 0, NULL, NULL}};
static EnumPropertyItem proportional_editing_items[] = {
{PROP_EDIT_OFF, "DISABLED", 0, "Disable", ""},
{PROP_EDIT_ON, "ENABLED", 0, "Enable", ""},
{PROP_EDIT_CONNECTED, "CONNECTED", 0, "Connected", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ToolSettings", NULL); srna= RNA_def_struct(brna, "ToolSettings", NULL);
RNA_def_struct_ui_text(srna, "Tool Settings", ""); RNA_def_struct_ui_text(srna, "Tool Settings", "");
@ -526,14 +532,17 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Particle Edit", ""); RNA_def_property_ui_text(prop, "Particle Edit", "");
/* Transform */ /* Transform */
prop= RNA_def_property(srna, "proportional_editing", PROP_BOOLEAN, PROP_NONE); prop= RNA_def_property(srna, "proportional_editing", PROP_ENUM, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "proportional", 0); RNA_def_property_enum_sdna(prop, NULL, "proportional");
RNA_def_property_enum_items(prop, proportional_editing_items);
RNA_def_property_ui_text(prop, "Proportional Editing", "Proportional editing mode."); RNA_def_property_ui_text(prop, "Proportional Editing", "Proportional editing mode.");
RNA_def_property_update(prop, NC_SCENE|ND_MODE, NULL); /* header redraw */
prop= RNA_def_property(srna, "proportional_editing_falloff", PROP_ENUM, PROP_NONE); prop= RNA_def_property(srna, "proportional_editing_falloff", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "prop_mode"); RNA_def_property_enum_sdna(prop, NULL, "prop_mode");
RNA_def_property_enum_items(prop, prop_mode_items); RNA_def_property_enum_items(prop, prop_mode_items);
RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode."); RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode.");
RNA_def_property_update(prop, NC_SCENE|ND_MODE, NULL); /* header redraw */
prop= RNA_def_property(srna, "normal_size", PROP_FLOAT, PROP_DISTANCE); prop= RNA_def_property(srna, "normal_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "normalsize"); RNA_def_property_float_sdna(prop, NULL, "normalsize");

@ -766,6 +766,11 @@ static void rna_def_space_3dview(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pivot Point", "Pivot center for rotation/scaling."); RNA_def_property_ui_text(prop, "Pivot Point", "Pivot center for rotation/scaling.");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "pivot_point_align", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_ALIGN);
RNA_def_property_ui_text(prop, "Align", "Manipulate object centers only.");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "manipulator", PROP_BOOLEAN, PROP_NONE); prop= RNA_def_property(srna, "manipulator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twflag", V3D_USE_MANIPULATOR); RNA_def_property_boolean_sdna(prop, NULL, "twflag", V3D_USE_MANIPULATOR);
RNA_def_property_ui_text(prop, "Manipulator", "Use a 3D manipulator widget for controlling transforms."); RNA_def_property_ui_text(prop, "Manipulator", "Use a 3D manipulator widget for controlling transforms.");