diff options
author | Diego Borghetti <bdiego@gmail.com> | 2008-01-15 07:49:09 +0300 |
---|---|---|
committer | Diego Borghetti <bdiego@gmail.com> | 2008-01-15 07:49:09 +0300 |
commit | 5ed9571ea51a7a159e03475011b06079c16ca2bb (patch) | |
tree | 645acb59f09be8f1492c84065a176aaffef584ca /source/blender/windowmanager | |
parent | 8a7558a4fb50f006ef19faa5933f2aae3fd8f7ef (diff) |
More "data types" for the Operator property system.
Now you can set/get: float, arrays (int and float) and string.
The only special function is OP_get_string, it is special
because return a pointer to the IDProperty data, so you can't
change/resize/free the string.
It's possible "fix" this with:
1) Return a "const char"
2) Return a duplicate string
All this new function are not in use yet, but i make a simple test
with the "move areas" operator (add a property of every type and then
print the result in the other size) and work fine, more test are welcome.
Other thing to check is the new OP_free_property function, because this
properties are only local to the operator, i choice free all this in the
"exit callback" of every operator (only move areas have property now),
so comment about this are welcome too :)
Also add some notes to the WM_api.h file.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 43 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm.c | 14 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 135 |
3 files changed, 174 insertions, 18 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 727b228405b..ae79492fd49 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -86,16 +86,51 @@ void WM_operatortypelist_append(ListBase *lb); * * Some notes to take care: * - * OP_set_int try to append a new property to the operator, - * if the property already exist, just replace it with the + * All the OP_set_* functions append a new property to the operator, + * if the property already exist, just replace it with the new * value in other case make a new property and append it. * - * OP_get_int return 0 on success (found the property) or - * != 0 if can't found the property in the operator. + * The OP_get_string function is a "special case", this function + * return a pointer to property data, so don't change/resize/free + * the string, because probably we get a segfault. + * I really think that is better duplicate the string, so we are + * really sure that the property data don't change. + * + * OP_get_int/float/array return 0 on success (found the property) + * or != 0 if can't found the property in the operator. * The property value are store in the "value" pointer. + * + * Both array function copy the property data into the "array" + * pointer, but you need init the len pointer to the "array" size. + * + * For example: + * int vec[] = { 1, 2, 3, 4 }; + * OP_set_int_array (op, "vector", vec, 4); + * + * ... + * + * short len; + * int vec[4]; + * len= 4; <---- set the size!! + * OP_get_int_array (op, "vector", vec, &len); */ void OP_set_int(wmOperator *op, char *name, int value); +void OP_set_float(wmOperator *op, char *name, float value); +void OP_set_string(wmOperator *op, char *name, char *str); +void OP_set_int_array(wmOperator *op, char *name, int *array, short len); +void OP_set_float_array(wmOperator *op, char *name, float *array, short len); + int OP_get_int(wmOperator *op, char *name, int *value); +int OP_get_float(wmOperator *op, char *name, float *value); +char *OP_get_string(wmOperator *op, char *name); +int OP_get_int_array(wmOperator *op, char *name, int *array, short *len); +int OP_get_float_array(wmOperator *op, char *name, float *array, short *len); + +/* + * Need call this function in the "exit callback" + * of the operator, but only if you use the property system. + **/ +void OP_free_property(wmOperator *op); /* OpenGL wrappers, mimicing opengl syntax */ void wmLoadMatrix (wmWindow *win, float mat[][4]); diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index d0319da593b..423bcd51c8d 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -125,7 +125,6 @@ void wm_add_default(bContext *C) /* context is allowed to be NULL, do net free wm itself (library.c) */ void wm_close_and_free(bContext *C, wmWindowManager *wm) { - wmOperator *op; wmWindow *win; while((win= wm->windows.first)) { @@ -133,19 +132,6 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm) wm_window_free(C, win); } - op= wm->operators.first; - while(op) { - /* - * Need this, because if the operator don't have - * properties also don't have group. - */ - if(op->properties) { - IDP_FreeGroup(op->properties); - op->properties= NULL; - } - op= op->next; - } - BLI_freelistN(&wm->operators); BLI_freelistN(&wm->windowkeymap); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 4c26ef4b115..d1fce510433 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -158,6 +158,17 @@ void op_init_property(wmOperator *op) } /* ***** Property API, exported ***** */ +void OP_free_property(wmOperator *op) +{ + IDP_FreeProperty(op->properties); + /* + * This need change, when the idprop code only + * need call IDP_FreeProperty. (check BKE_idprop.h) + */ + MEM_freeN(op->properties); + op->properties= NULL; +} + void OP_set_int(wmOperator *op, char *name, int value) { IDPropertyTemplate val; @@ -171,6 +182,72 @@ void OP_set_int(wmOperator *op, char *name, int value) IDP_ReplaceInGroup(op->properties, prop); } +void OP_set_float(wmOperator *op, char *name, float value) +{ + IDPropertyTemplate val; + IDProperty *prop; + + if(!op->properties) + op_init_property(op); + + val.f= value; + prop= IDP_New(IDP_FLOAT, val, name); + IDP_ReplaceInGroup(op->properties, prop); +} + +void OP_set_int_array(wmOperator *op, char *name, int *array, short len) +{ + IDPropertyTemplate val; + IDProperty *prop; + short i; + int *pointer; + + if(!op->properties) + op_init_property(op); + + val.array.len= len; + val.array.type= IDP_INT; + prop= IDP_New(IDP_ARRAY, val, name); + + pointer= (int *)prop->data.pointer; + for(i= 0; i < len; i++) + pointer[i]= array[i]; + IDP_ReplaceInGroup(op->properties, prop); +} + +void OP_set_float_array(wmOperator *op, char *name, float *array, short len) +{ + IDPropertyTemplate val; + IDProperty *prop; + short i; + float *pointer; + + if(!op->properties) + op_init_property(op); + + val.array.len= len; + val.array.type= IDP_FLOAT; + prop= IDP_New(IDP_ARRAY, val, name); + + pointer= (float *) prop->data.pointer; + for(i= 0; i < len; i++) + pointer[i]= array[i]; + IDP_ReplaceInGroup(op->properties, prop); +} + +void OP_set_string(wmOperator *op, char *name, char *str) +{ + IDPropertyTemplate val; + IDProperty *prop; + + if(!op->properties) + op_init_property(op); + + val.str= str; + prop= IDP_New(IDP_STRING, val, name); + IDP_ReplaceInGroup(op->properties, prop); +} + int OP_get_int(wmOperator *op, char *name, int *value) { IDProperty *prop= op_get_property(op, name); @@ -182,3 +259,61 @@ int OP_get_int(wmOperator *op, char *name, int *value) } return (status); } + +int OP_get_float(wmOperator *op, char *name, float *value) +{ + IDProperty *prop= op_get_property(op, name); + int status= 1; + + if ((prop) && (prop->type == IDP_FLOAT)) { + (*value)= *(float*)&prop->data.val; + status= 0; + } + return (status); +} + +int OP_get_int_array(wmOperator *op, char *name, int *array, short *len) +{ + IDProperty *prop= op_get_property(op, name); + short i; + int status= 1; + int *pointer; + + if ((prop) && (prop->type == IDP_ARRAY)) { + pointer= (int *) prop->data.pointer; + + for(i= 0; (i < prop->len) && (i < *len); i++) + array[i]= pointer[i]; + + (*len)= i; + status= 0; + } + return (status); +} + +int OP_get_float_array(wmOperator *op, char *name, float *array, short *len) +{ + IDProperty *prop= op_get_property(op, name); + short i; + float *pointer; + int status= 1; + + if ((prop) && (prop->type == IDP_ARRAY)) { + pointer= (float *) prop->data.pointer; + + for(i= 0; (i < prop->len) && (i < *len); i++) + array[i]= pointer[i]; + + (*len)= i; + status= 0; + } + return (status); +} + +char *OP_get_string(wmOperator *op, char *name) +{ + IDProperty *prop= op_get_property(op, name); + if ((prop) && (prop->type == IDP_STRING)) + return ((char *) prop->data.pointer); + return (NULL); +} |