[Bf-blender-cvs] [e8a04a5a18f] custom-manipulators: PyAPI: Add Manipulator.target_prop_set_property
Campbell Barton
noreply at git.blender.org
Wed Jun 21 23:46:24 CEST 2017
Commit: e8a04a5a18f76c1ebea570af5aacb43da3d47ddc
Author: Campbell Barton
Date: Thu Jun 22 07:49:24 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rBe8a04a5a18f76c1ebea570af5aacb43da3d47ddc
PyAPI: Add Manipulator.target_prop_set_property
RNA method for Python to call into C or Py defined manipulators.
naming might change.
===================================================================
M source/blender/makesrna/intern/rna_wm_manipulator_api.c
M source/blender/windowmanager/manipulators/WM_manipulator_api.h
M source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
===================================================================
diff --git a/source/blender/makesrna/intern/rna_wm_manipulator_api.c b/source/blender/makesrna/intern/rna_wm_manipulator_api.c
index dd678a278d1..c413eff76b7 100644
--- a/source/blender/makesrna/intern/rna_wm_manipulator_api.c
+++ b/source/blender/makesrna/intern/rna_wm_manipulator_api.c
@@ -69,6 +69,70 @@ static void rna_manipulator_draw_preset_facemap(
ED_manipulator_draw_preset_facemap(mpr, scene, ob, facemap, select_id);
}
+static void rna_manipulator_target_prop_set_property(
+ wmManipulator *mpr, ReportList *reports, const char *target_propname,
+ PointerRNA *ptr, const char *propname, int index)
+{
+ const wmManipulatorPropertyType *mpr_prop_type =
+ WM_manipulatortype_target_property_find(mpr->type, target_propname);
+ if (mpr_prop_type == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "Manipulator target property '%s.%s' not found",
+ mpr->type->idname, target_propname);
+ return;
+ }
+
+ PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
+ if (prop == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "Property '%s.%s' not found",
+ RNA_struct_identifier(ptr->type), target_propname);
+ return;
+ }
+
+ if (mpr_prop_type->type != RNA_property_type(prop)) {
+ const int manipulator_type_index = RNA_enum_from_value(rna_enum_property_type_items, mpr_prop_type->type);
+ const int prop_type_index = RNA_enum_from_value(rna_enum_property_type_items, RNA_property_type(prop));
+ BLI_assert((manipulator_type_index != -1) && (prop_type_index == -1));
+
+ BKE_reportf(reports, RPT_ERROR, "Manipulator target '%s.%s' expects '%s', '%s.%s' is '%s'",
+ mpr->type->idname, target_propname,
+ rna_enum_property_type_items[manipulator_type_index].identifier,
+ RNA_struct_identifier(ptr->type), propname,
+ rna_enum_property_type_items[prop_type_index].identifier);
+ return;
+ }
+
+ if (RNA_property_array_check(prop)) {
+ if (index == -1) {
+ const int prop_array_length = RNA_property_array_length(ptr, prop);
+ if (mpr_prop_type->array_length != prop_array_length) {
+ BKE_reportf(reports, RPT_ERROR,
+ "Manipulator target property '%s.%s' expects an array of length %d, found %d",
+ mpr->type->idname, target_propname,
+ mpr_prop_type->array_length,
+ prop_array_length);
+ return;
+ }
+ }
+ }
+ else {
+ if (mpr_prop_type->array_length != 1) {
+ BKE_reportf(reports, RPT_ERROR,
+ "Manipulator target property '%s.%s' expects an array of length %d",
+ mpr->type->idname, target_propname,
+ mpr_prop_type->array_length);
+ return;
+ }
+ }
+
+ if (index >= mpr_prop_type->array_length) {
+ BKE_reportf(reports, RPT_ERROR, "Manipulator target property '%s.%s', index %d must be below %d",
+ mpr->type->idname, target_propname, index, mpr_prop_type->array_length);
+ return;
+ }
+
+ WM_manipulator_target_property_def_rna_ptr(mpr, mpr_prop_type, ptr, prop, index);
+}
+
#else
void RNA_api_manipulator(StructRNA *srna)
@@ -124,6 +188,22 @@ void RNA_api_manipulator(StructRNA *srna)
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
RNA_def_int(func, "facemap", 0, 0, INT_MAX, "Face map index", "", 0, INT_MAX);
RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
+
+
+ /* -------------------------------------------------------------------- */
+ /* Property API */
+
+ func = RNA_def_function(srna, "target_prop_set_property", "rna_manipulator_target_prop_set_property");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "");
+ parm = RNA_def_string(func, "target_property", NULL, 0, "", "Target property");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+ /* similar to UILayout.prop */
+ parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
+ parm = RNA_def_string(func, "property", NULL, 0, "", "Identifier of property in data");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+ RNA_def_int(func, "index", -1, -1, INT_MAX, "", "", -1, INT_MAX); /* RNA_NO_INDEX == -1 */
}
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index 5766f9f8050..e63e27372eb 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -39,9 +39,11 @@
struct ARegion;
struct GHashIterator;
struct Main;
+struct PropertyRNA;
struct wmKeyConfig;
struct wmManipulator;
struct wmManipulatorProperty;
+struct wmManipulatorPropertyType;
struct wmManipulatorType;
struct wmManipulatorGroup;
struct wmManipulatorGroupType;
@@ -135,9 +137,16 @@ void WM_manipulatorconfig_update(struct Main *bmain);
struct wmManipulatorProperty *WM_manipulator_target_property_find(
struct wmManipulator *mpr, const char *idname);
+void WM_manipulator_target_property_def_rna_ptr(
+ struct wmManipulator *mpr, const struct wmManipulatorPropertyType *mpr_prop_type,
+ struct PointerRNA *ptr, struct PropertyRNA *prop, int index);
void WM_manipulator_target_property_def_rna(
struct wmManipulator *mpr, const char *idname,
struct PointerRNA *ptr, const char *propname, int index);
+
+void WM_manipulator_target_property_def_func_ptr(
+ struct wmManipulator *mpr, const struct wmManipulatorPropertyType *mpr_prop_type,
+ const struct wmManipulatorPropertyFnParams *params);
void WM_manipulator_target_property_def_func(
struct wmManipulator *mpr, const char *idname,
const struct wmManipulatorPropertyFnParams *params);
@@ -162,8 +171,8 @@ void WM_manipulator_target_property_range_get(
float range[2]);
/* definitions */
-struct wmManipulatorPropertyType *WM_manipulatortype_target_property_find(
- struct wmManipulatorType *wt, const char *idname);
+const struct wmManipulatorPropertyType *WM_manipulatortype_target_property_find(
+ const struct wmManipulatorType *wt, const char *idname);
void WM_manipulatortype_target_property_def(
struct wmManipulatorType *wt, const char *idname, int type, int array_length);
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
index b9897b32f44..b629213b11b 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
@@ -59,30 +59,30 @@ wmManipulatorProperty *WM_manipulator_target_property_find(wmManipulator *mpr, c
}
static wmManipulatorProperty *wm_manipulator_target_property_def_internal(
- wmManipulator *mpr, const char *idname)
+ wmManipulator *mpr, const wmManipulatorPropertyType *mpr_prop_type)
{
- wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, idname);
+ wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, mpr_prop_type->idname);
if (mpr_prop == NULL) {
- const uint idname_size = strlen(idname) + 1;
+ const uint idname_size = strlen(mpr_prop_type->idname) + 1;
mpr_prop = MEM_callocN(sizeof(wmManipulatorProperty) + idname_size, __func__);
- memcpy(mpr_prop->idname, idname, idname_size);
+ memcpy(mpr_prop->idname, mpr_prop_type->idname, idname_size);
BLI_addtail(&mpr->target_properties, mpr_prop);
}
return mpr_prop;
}
-void WM_manipulator_target_property_def_rna(
- wmManipulator *mpr, const char *idname,
- PointerRNA *ptr, const char *propname, int index)
+void WM_manipulator_target_property_def_rna_ptr(
+ wmManipulator *mpr, const wmManipulatorPropertyType *mpr_prop_type,
+ PointerRNA *ptr, PropertyRNA *prop, int index)
{
- wmManipulatorProperty *mpr_prop = wm_manipulator_target_property_def_internal(mpr, idname);
+ wmManipulatorProperty *mpr_prop = wm_manipulator_target_property_def_internal(mpr, mpr_prop_type);
/* if manipulator evokes an operator we cannot use it for property manipulation */
mpr->op_data.type = NULL;
mpr_prop->ptr = *ptr;
- mpr_prop->prop = RNA_struct_find_property(ptr, propname);
+ mpr_prop->prop = prop;
mpr_prop->index = index;
if (mpr->type->property_update) {
@@ -90,11 +90,20 @@ void WM_manipulator_target_property_def_rna(
}
}
-void WM_manipulator_target_property_def_func(
+void WM_manipulator_target_property_def_rna(
wmManipulator *mpr, const char *idname,
+ PointerRNA *ptr, const char *propname, int index)
+{
+ const wmManipulatorPropertyType *mpr_prop_type = WM_manipulatortype_target_property_find(mpr->type, idname);
+ PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
+ WM_manipulator_target_property_def_rna_ptr(mpr, mpr_prop_type, ptr, prop, index);
+}
+
+void WM_manipulator_target_property_def_func_ptr(
+ wmManipulator *mpr, const wmManipulatorPropertyType *mpr_prop_type,
const wmManipulatorPropertyFnParams *params)
{
- wmManipulatorProperty *mpr_prop = wm_manipulator_target_property_def_internal(mpr, idname);
+ wmManipulatorProperty *mpr_prop = wm_manipulator_target_property_def_internal(mpr, mpr_prop_type);
/* if manipulator evokes an operator we cannot use it for property manipulation */
mpr->op_data.type = NULL;
@@ -109,6 +118,14 @@ void WM_manipulator_target_property_def_func(
}
}
+void WM_manipulator_target_property_def_func(
+ wmManipulator *mpr, const char *idname,
+ const wmManipulatorPropertyFnParams *params)
+{
+ const wmManipulatorPropertyType *mpr_prop_type = WM_manipulatortype_target_property_find(mpr->type, idname);
+ WM_manipulator_target_property_def_func_ptr(mpr, mpr_prop_type, params);
+}
+
/** \} */
@@ -208,8 +225,8 @@ void WM_manipulator_target_property_range_get(
/** \name Property Define
* \{ */
-wmManipulatorPropertyType *WM_manipulatortype_target_property_find(
- wmManipulatorType *wt, const char *idname)
+const wmManipulatorPropertyType *WM_manipulatortype_target
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list