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:
authorMartin Poirier <theeth@yahoo.com>2006-05-20 19:44:14 +0400
committerMartin Poirier <theeth@yahoo.com>2006-05-20 19:44:14 +0400
commitbefd0075112e14bbf1171134629705491f860dd0 (patch)
treeffcf04c8b500d4af136f8b5e46ff929d4792ff21 /source/blender/python/api2_2x/Draw.c
parent6d3afda093204398fbd42c38794c1f593d5cad37 (diff)
=== Python API ===
Blender.Draw.ColorPicker Enables scripters to use a color picker in there scripts. See this file for a trivial demo: http://blenderartists.org/~theeth/colorpicker.blend
Diffstat (limited to 'source/blender/python/api2_2x/Draw.c')
-rw-r--r--source/blender/python/api2_2x/Draw.c150
1 files changed, 120 insertions, 30 deletions
diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c
index f59981b2782..d6b0f179cca 100644
--- a/source/blender/python/api2_2x/Draw.c
+++ b/source/blender/python/api2_2x/Draw.c
@@ -101,6 +101,7 @@ static PyObject *Method_Menu( PyObject * self, PyObject * args );
static PyObject *Method_Toggle( PyObject * self, PyObject * args );
static PyObject *Method_Slider( PyObject * self, PyObject * args );
static PyObject *Method_Scrollbar( PyObject * self, PyObject * args );
+static PyObject *Method_ColorPicker( PyObject * self, PyObject * args );
static PyObject *Method_Number( PyObject * self, PyObject * args );
static PyObject *Method_String( PyObject * self, PyObject * args );
static PyObject *Method_GetStringWidth( PyObject * self, PyObject * args );
@@ -210,6 +211,15 @@ new Scrollbar\n\n\
A non-zero value (default) enables the events. A zero value supresses them.\n\
[tooltip=] The button's tooltip";
+static char Method_ColorPicker_doc[] =
+ "(event, x, y, width, height, initial, [tooltip]) - Create a new Button \
+Color picker button\n\n\
+(event) The event number to pass to the button event function when the color changes\n\
+(x, y) The lower left coordinate of the button\n\
+(width, height) The button width and height\n\
+(initial) 3-Float tuple of the color (values between 0 and 1)\
+[tooltip=] The button's tooltip";
+
static char Method_Number_doc[] =
"(name, event, x, y, width, height, initial, min, max, [tooltip]) - Create a \
new Number button\n\n\
@@ -322,6 +332,7 @@ static struct PyMethodDef Draw_methods[] = {
MethodDef( Menu ),
MethodDef( Slider ),
MethodDef( Scrollbar ),
+ MethodDef( ColorPicker ),
MethodDef( Number ),
MethodDef( String ),
MethodDef( GetStringWidth ),
@@ -370,7 +381,7 @@ static void Button_dealloc( PyObject * self )
static PyObject *Button_getattr( PyObject * self, char *name )
{
Button *but = ( Button * ) self;
-
+
if( strcmp( name, "val" ) == 0 ) {
if( but->type == BINT_TYPE )
return Py_BuildValue( "i", but->val.asint );
@@ -378,6 +389,8 @@ static PyObject *Button_getattr( PyObject * self, char *name )
return Py_BuildValue( "f", but->val.asfloat );
else if( but->type == BSTRING_TYPE )
return Py_BuildValue( "s", but->val.asstr );
+ else if( but->type == BVECTOR_TYPE )
+ return Py_BuildValue( "fff", but->val.asvec[0], but->val.asvec[1], but->val.asvec[2] );
}
PyErr_SetString( PyExc_AttributeError, name );
@@ -389,35 +402,58 @@ static int Button_setattr( PyObject * self, char *name, PyObject * v )
Button *but = ( Button * ) self;
if( strcmp( name, "val" ) == 0 ) {
- if( but->type == BINT_TYPE )
- PyArg_Parse( v, "i", &but->val.asint );
- else if( but->type == BFLOAT_TYPE )
- PyArg_Parse( v, "f", &but->val.asfloat );
- else if( but->type == BSTRING_TYPE ) {
+ if( but->type == BINT_TYPE && PyNumber_Check(v) ) {
+ PyObject *pyVal = PyNumber_Int( v );
+ if (pyVal) {
+ but->val.asint = (int)PyInt_AS_LONG( pyVal );
+ return 0;
+ }
+ }
+ else if( but->type == BFLOAT_TYPE && PyNumber_Check(v) ) {
+ PyObject *pyVal = PyNumber_Float( v );
+ if (pyVal) {
+ but->val.asfloat = (float)PyFloat_AS_DOUBLE( pyVal );
+ return 0;
+ }
+ }
+ else if( but->type == BVECTOR_TYPE ) {
+ if ( PyArg_ParseTuple( v, "fff", but->val.asvec, but->val.asvec+1, but->val.asvec+2 ) )
+ return 0;
+ }
+ else if( but->type == BSTRING_TYPE && PyString_Check(v) ) {
char *newstr;
- PyArg_Parse( v, "s", &newstr );
+ unsigned int newlen;
+
+ PyString_AsStringAndSize( v, &newstr, &newlen );
/* if the length of the new string is the same as */
/* the old one, just copy, else delete and realloc. */
- if( but->slen == strlen( newstr ) ) {
+ if( but->slen == newlen ) {
BLI_strncpy( but->val.asstr, newstr,
but->slen + 1 );
} else {
MEM_freeN( but->val.asstr );
- but->slen = strlen( newstr );
+ but->slen = newlen;
but->val.asstr =
MEM_mallocN( but->slen + 1,
"button setattr" );
BLI_strncpy( but->val.asstr, newstr,
but->slen + 1 );
+
+ return 0;
}
}
} else {
- PyErr_SetString( PyExc_AttributeError, name );
- return -1;
+ /*
+ * Accessing the wrong attribute.
+ */
+ return EXPP_ReturnIntError( PyExc_AttributeError, name );
}
- return 0;
+ /*
+ * Correct attribute but value is incompatible with current button value.
+ */
+ return EXPP_ReturnIntError( PyExc_ValueError, "value incompatible with current button type" );
}
static PyObject *Button_repr( PyObject * self )
@@ -427,7 +463,9 @@ static PyObject *Button_repr( PyObject * self )
static Button *newbutton( void )
{
- Button *but = ( Button * ) PyObject_NEW( Button, &Button_Type );
+ Button *but = NULL;
+
+ but = ( Button * ) PyObject_NEW( Button, &Button_Type );
return but;
}
@@ -720,31 +758,35 @@ static PyObject *Method_Draw( PyObject * self, PyObject * args )
static PyObject *Method_Create( PyObject * self, PyObject * args )
{
- Button *but;
- PyObject *in;
+ Button *but = NULL;
+ PyObject *val;
+ char *newstr;
- if( !PyArg_ParseTuple( args, "O", &in ) )
- return EXPP_ReturnPyObjError( PyExc_TypeError,
- "expected PyObject argument" );
+ but = newbutton();
- but = newbutton( );
- if( PyFloat_Check( in ) ) {
+ if ( PyArg_ParseTuple( args, "fff", but->val.asvec, but->val.asvec+1, but->val.asvec+2 ) ) {
+ but->type = BVECTOR_TYPE;
+ }
+ else if ( PyArg_ParseTuple( args, "O!", &PyFloat_Type, &val ) ) {
+ but->val.asfloat = (float)PyFloat_AS_DOUBLE(val);
but->type = BFLOAT_TYPE;
- but->val.asfloat = (float)PyFloat_AsDouble( in );
- } else if( PyInt_Check( in ) ) {
+ }
+ else if ( PyArg_ParseTuple( args, "O!", &PyInt_Type, &val ) ) {
+ but->val.asint = (int)PyInt_AS_LONG(val);
but->type = BINT_TYPE;
- but->val.asint = PyInt_AsLong( in );
- } else if( PyString_Check( in ) ) {
- char *newstr = PyString_AsString( in );
-
+ }
+ else if ( PyArg_ParseTuple( args, "s#", &newstr, &but->slen ) ) {
but->type = BSTRING_TYPE;
- but->slen = strlen( newstr );
but->val.asstr = MEM_mallocN( but->slen + 1, "button string" );
-
- strcpy( but->val.asstr, newstr );
+ BLI_strncpy( but->val.asstr, newstr, but->slen+1 );
+ }
+ else {
+ PyObject_DEL( (PyObject *) but );
+ but = NULL;
+ PyErr_SetString( PyExc_TypeError, "expected string, float, int or 3-float tuple argument" );
}
- return ( PyObject * ) but;
+ return (PyObject*) but;
}
static uiBlock *Get_uiBlock( void )
@@ -1021,6 +1063,54 @@ another int and string as arguments" );
return ( PyObject * ) but;
}
+static PyObject *Method_ColorPicker( PyObject * self, PyObject * args )
+{
+ char USAGE_ERROR[] = "expected a 3-float tuple of values between 0 and 1";
+ Button *but;
+ PyObject *inio;
+ uiBlock *block;
+ char *tip = NULL;
+ float col[3];
+ int event;
+ short x, y, w, h;
+
+ if( !PyArg_ParseTuple( args, "ihhhhO!|s", &event,
+ &x, &y, &w, &h, &PyTuple_Type, &inio, &tip ) )
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "expected five ints, one tuple and optionally a string as arguments." );
+
+ if (check_button_event(&event) == -1)
+ return EXPP_ReturnPyObjError( PyExc_ValueError,
+ "button event argument must be in the range [0, 16382]");
+
+ if ( !PyArg_ParseTuple( inio, "fff", col, col+1, col+2 ) )
+ return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR);
+
+ if ( col[0] < 0 || col[0] > 1
+ || col[1] < 0 || col[1] > 1
+ || col[2] < 0 || col[2] > 1 )
+ return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR);
+
+ if ( EXPP_check_sequence_consistency( inio, &PyFloat_Type ) != 1 )
+ return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR);
+
+ but = newbutton();
+
+ but->type = BVECTOR_TYPE;
+ but->val.asvec[0] = col[0];
+ but->val.asvec[1] = col[1];
+ but->val.asvec[2] = col[2];
+
+ block = Get_uiBlock( );
+ if( block ) {
+ uiBut *ubut;
+ ubut = uiDefButF( block, COL, event, "", x, y, w, h, but->val.asvec, 0, 0, 0, 0, tip);
+ }
+
+ return ( PyObject * ) but;
+}
+
+
static PyObject *Method_Number( PyObject * self, PyObject * args )
{
uiBlock *block;