Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-06-22 11:29:45 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-06-22 11:39:28 +0300
commitf1824507e2b73859ede1c2e850d05795f10da6bb (patch)
tree343d8c02b161506775d2825c83955737436b38b0 /source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
parent87adeb8dd91db5bfada04f6df749c28cc4b79251 (diff)
Manipulator: target property definitions
Changes from custom-manipulator branch. - use property type definitions. - add property free callback. - move properties into the wmManipulator struct (over alloc). - use array length from property types instead of arg passing.
Diffstat (limited to 'source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c')
-rw-r--r--source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c132
1 files changed, 103 insertions, 29 deletions
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 d43a9b8882d..9acd1a974cd 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c
@@ -53,36 +53,49 @@
/** \name Property Definition
* \{ */
-wmManipulatorProperty *WM_manipulator_target_property_find(wmManipulator *mpr, const char *idname)
+BLI_INLINE wmManipulatorProperty *wm_manipulator_target_property_array(wmManipulator *mpr)
+{
+ return (wmManipulatorProperty *)(POINTER_OFFSET(mpr, mpr->type->struct_size));
+}
+
+wmManipulatorProperty *WM_manipulator_target_property_array(wmManipulator *mpr)
{
- return BLI_findstring(&mpr->target_properties, idname, offsetof(wmManipulatorProperty, idname));
+ return wm_manipulator_target_property_array(mpr);
}
-static wmManipulatorProperty *wm_manipulator_target_property_def_internal(
- wmManipulator *mpr, const char *idname)
+wmManipulatorProperty *WM_manipulator_target_property_at_index(wmManipulator *mpr, int index)
{
- wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, idname);
+ BLI_assert(index < mpr->type->target_property_defs_len);
+ BLI_assert(index != -1);
+ wmManipulatorProperty *mpr_prop_array = wm_manipulator_target_property_array(mpr);
+ return &mpr_prop_array[index];
+}
- if (mpr_prop == NULL) {
- const uint idname_size = strlen(idname) + 1;
- mpr_prop = MEM_callocN(sizeof(wmManipulatorProperty) + idname_size, __func__);
- memcpy(mpr_prop->idname, idname, idname_size);
- BLI_addtail(&mpr->target_properties, mpr_prop);
+wmManipulatorProperty *WM_manipulator_target_property_find(wmManipulator *mpr, const char *idname)
+{
+ int index = BLI_findstringindex(
+ &mpr->type->target_property_defs, idname, offsetof(wmManipulatorPropertyType, idname));
+ if (index != -1) {
+ return WM_manipulator_target_property_at_index(mpr, index);
+ }
+ else {
+ return NULL;
}
- 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_at_index(mpr, mpr_prop_type->index_in_type);
/* if manipulator evokes an operator we cannot use it for property manipulation */
mpr->op_data.type = NULL;
+ mpr_prop->type = mpr_prop_type;
+
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,18 +103,30 @@ 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_at_index(mpr, mpr_prop_type->index_in_type);
/* if manipulator evokes an operator we cannot use it for property manipulation */
mpr->op_data.type = NULL;
+ mpr_prop->type = mpr_prop_type;
+
mpr_prop->custom_func.value_get_fn = params->value_get_fn;
mpr_prop->custom_func.value_set_fn = params->value_set_fn;
mpr_prop->custom_func.range_get_fn = params->range_get_fn;
+ mpr_prop->custom_func.free_fn = params->free_fn;
mpr_prop->custom_func.user_data = params->user_data;
if (mpr->type->property_update) {
@@ -109,6 +134,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);
+}
+
/** \} */
@@ -117,6 +150,18 @@ void WM_manipulator_target_property_def_func(
/** \name Property Access
* \{ */
+bool WM_manipulator_target_property_is_valid_any(wmManipulator *mpr)
+{
+ wmManipulatorProperty *mpr_prop_array = wm_manipulator_target_property_array(mpr);
+ for (int i = 0; i < mpr->type->target_property_defs_len; i++) {
+ wmManipulatorProperty *mpr_prop = &mpr_prop_array[i];
+ if (WM_manipulator_target_property_is_valid(mpr_prop)) {
+ return true;
+ }
+ }
+ return false;
+}
+
bool WM_manipulator_target_property_is_valid(const wmManipulatorProperty *mpr_prop)
{
return ((mpr_prop->prop != NULL) ||
@@ -128,7 +173,8 @@ float WM_manipulator_target_property_value_get(
{
if (mpr_prop->custom_func.value_get_fn) {
float value = 0.0f;
- mpr_prop->custom_func.value_get_fn(mpr, mpr_prop, mpr_prop->custom_func.user_data, &value, 1);
+ BLI_assert(mpr_prop->type->array_length == 1);
+ mpr_prop->custom_func.value_get_fn(mpr, mpr_prop, &value);
return value;
}
@@ -145,7 +191,8 @@ void WM_manipulator_target_property_value_set(
wmManipulatorProperty *mpr_prop, const float value)
{
if (mpr_prop->custom_func.value_set_fn) {
- mpr_prop->custom_func.value_set_fn(mpr, mpr_prop, mpr_prop->custom_func.user_data, &value, 1);
+ BLI_assert(mpr_prop->type->array_length == 1);
+ mpr_prop->custom_func.value_set_fn(mpr, mpr_prop, &value);
return;
}
@@ -161,27 +208,23 @@ void WM_manipulator_target_property_value_set(
void WM_manipulator_target_property_value_get_array(
const wmManipulator *mpr, wmManipulatorProperty *mpr_prop,
- float *value, const int value_len)
+ float *value)
{
if (mpr_prop->custom_func.value_get_fn) {
- mpr_prop->custom_func.value_get_fn(mpr, mpr_prop, mpr_prop->custom_func.user_data, value, value_len);
+ mpr_prop->custom_func.value_get_fn(mpr, mpr_prop, value);
return;
}
-
- BLI_assert(RNA_property_array_length(&mpr_prop->ptr, mpr_prop->prop) == value_len);
return RNA_property_float_get_array(&mpr_prop->ptr, mpr_prop->prop, value);
}
void WM_manipulator_target_property_value_set_array(
bContext *C, const wmManipulator *mpr, wmManipulatorProperty *mpr_prop,
- const float *value, const int value_len)
+ const float *value)
{
if (mpr_prop->custom_func.value_set_fn) {
- mpr_prop->custom_func.value_set_fn(mpr, mpr_prop, mpr_prop->custom_func.user_data, value, value_len);
+ mpr_prop->custom_func.value_set_fn(mpr, mpr_prop, value);
return;
}
-
- BLI_assert(RNA_property_array_length(&mpr_prop->ptr, mpr_prop->prop) == value_len);
RNA_property_float_set_array(&mpr_prop->ptr, mpr_prop->prop, value);
RNA_property_update(C, &mpr_prop->ptr, mpr_prop->prop);
@@ -192,7 +235,7 @@ void WM_manipulator_target_property_range_get(
float range[2])
{
if (mpr_prop->custom_func.range_get_fn) {
- mpr_prop->custom_func.range_get_fn(mpr, mpr_prop, mpr_prop->custom_func.user_data, range);
+ mpr_prop->custom_func.range_get_fn(mpr, mpr_prop, range);
return;
}
@@ -201,3 +244,34 @@ void WM_manipulator_target_property_range_get(
}
/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Property Define
+ * \{ */
+
+const wmManipulatorPropertyType *WM_manipulatortype_target_property_find(
+ const wmManipulatorType *wt, const char *idname)
+{
+ return BLI_findstring(&wt->target_property_defs, idname, offsetof(wmManipulatorPropertyType, idname));
+}
+
+void WM_manipulatortype_target_property_def(
+ wmManipulatorType *wt, const char *idname, int type, int array_length)
+{
+ wmManipulatorPropertyType *mpt;
+
+ BLI_assert(WM_manipulatortype_target_property_find(wt, idname) == NULL);
+
+ const uint idname_size = strlen(idname) + 1;
+ mpt = MEM_callocN(sizeof(wmManipulatorPropertyType) + idname_size, __func__);
+ memcpy(mpt->idname, idname, idname_size);
+ mpt->type = type;
+ mpt->array_length = array_length;
+ mpt->index_in_type = wt->target_property_defs_len;
+ wt->target_property_defs_len += 1;
+ BLI_addtail(&wt->target_property_defs, mpt);
+}
+
+/** \} */ \ No newline at end of file