diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-06-22 11:29:45 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-06-22 11:39:28 +0300 |
commit | f1824507e2b73859ede1c2e850d05795f10da6bb (patch) | |
tree | 343d8c02b161506775d2825c83955737436b38b0 /source/blender/windowmanager/manipulators/intern/wm_manipulator_target_props.c | |
parent | 87adeb8dd91db5bfada04f6df749c28cc4b79251 (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.c | 132 |
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 |