gimp r25961 - in branches/soc-2008-python: . plug-ins/pygimp



Author: larsc
Date: Mon Jun 16 19:41:25 2008
New Revision: 25961
URL: http://svn.gnome.org/viewvc/gimp?rev=25961&view=rev

Log:
2008-08-16  Lars-Peter Clausen  <lars metafoo de>

	* plug-ins/pygimp/gimpmodule.c
	* plug-ins/pygimp/pygimp.h
	* plug-ins/pygimp/pygimp-pdb.c: Set more descriptive exceptions when a 
	pdb call fails.
	* plug-ins/pygimp/gimpui.defs: Readded some defintions that got lost during
	* the regeneration.
	* plug-ins/pygimp/testui.py: Test for the readded defintions.



Modified:
   branches/soc-2008-python/ChangeLog
   branches/soc-2008-python/plug-ins/pygimp/gimpmodule.c
   branches/soc-2008-python/plug-ins/pygimp/gimpui.defs
   branches/soc-2008-python/plug-ins/pygimp/pygimp-pdb.c
   branches/soc-2008-python/plug-ins/pygimp/pygimp.h
   branches/soc-2008-python/plug-ins/pygimp/testui.py

Modified: branches/soc-2008-python/plug-ins/pygimp/gimpmodule.c
==============================================================================
--- branches/soc-2008-python/plug-ins/pygimp/gimpmodule.c	(original)
+++ branches/soc-2008-python/plug-ins/pygimp/gimpmodule.c	Mon Jun 16 19:41:25 2008
@@ -162,7 +162,7 @@
         return;
     }
 
-    *return_vals = pygimp_param_from_tuple(ret, rv, nrv);
+    *return_vals = pygimp_param_from_tuple(ret, rv, nrv, NULL);
     g_free(rv);
 
     if (*return_vals == NULL) {

Modified: branches/soc-2008-python/plug-ins/pygimp/gimpui.defs
==============================================================================
--- branches/soc-2008-python/plug-ins/pygimp/gimpui.defs	(original)
+++ branches/soc-2008-python/plug-ins/pygimp/gimpui.defs	Mon Jun 16 19:41:25 2008
@@ -91,6 +91,13 @@
   (gtype-id "GIMP_TYPE_COLOR_SCALE")
 )
 
+(define-object ColorScales
+  (in-module "Gimp")
+  (parent "GimpColorSelector")
+  (c-name "GimpColorScales")
+  (gtype-id "GIMP_TYPE_COLOR_SCALES")
+)
+
 (define-object ColorSelection
   (in-module "Gimp")
   (parent "GtkVBox")
@@ -133,6 +140,13 @@
   (gtype-id "GIMP_TYPE_FRAME")
 )
 
+(define-object HintBox
+  (in-module "Gimp")
+  (parent "GtkHBox")
+  (c-name "GimpHintBox")
+  (gtype-id "GIMP_TYPE_HINT_BOX")
+)
+
 (define-object IntComboBox
   (in-module "Gimp")
   (parent "GtkComboBox")
@@ -1341,7 +1355,7 @@
   (return-type "gint")
 )
 
-(define-function gimp_dialogs_show_help_button
+(function gimp_dialogs_show_help_button
   (c-name "gimp_dialogs_show_help_button")
   (return-type "none")
   (parameters
@@ -1349,6 +1363,13 @@
   )
 )
 
+;; from gimpui.h
+
+(define-method set_transient
+  (of-object "GimpDialog")
+  (c-name "gimp_window_set_transient")
+  (return-type "none")
+)
 
 
 ;; From gimpenumcombobox.h

Modified: branches/soc-2008-python/plug-ins/pygimp/pygimp-pdb.c
==============================================================================
--- branches/soc-2008-python/plug-ins/pygimp/pygimp-pdb.c	(original)
+++ branches/soc-2008-python/plug-ins/pygimp/pygimp-pdb.c	Mon Jun 16 19:41:25 2008
@@ -308,8 +308,36 @@
     return args;
 }
 
+/**
+ * Helper function to set a python exception when a wrong type was passed.
+ * n            - The parameter number which is set in the exception string
+ *                starting at 1. Pass 0 to omit.
+ * expected     - A string holding the expected types name.
+ * got          - The python object that was passed instead.
+ * error_prefix - A string that prefixes the exception string. Should be the
+ *                name of the function which was called.
+ */
+static void
+pygimp_set_type_error(int n, gchar *expected, PyObject *got, const gchar *error_prefix)
+{
+    static const gchar *positions[] = {"first", "second"};
+    
+    if(n < 1)
+        PyErr_Format(PyExc_TypeError, "%sExpected %s, got %s "
+                     "instead.", error_prefix ? error_prefix : "", expected,
+                     got->ob_type->tp_name);
+     if(n < 3)
+        PyErr_Format(PyExc_TypeError, "%sExpected %s as %s parameter, got %s "
+                     "instead.", error_prefix ? error_prefix : "", expected,
+                     positions[n-1], got->ob_type->tp_name);
+    else
+        PyErr_Format(PyExc_TypeError, "%sExpected %s as %drd parameter, got %s "
+                     "instead.", error_prefix ? error_prefix : "", expected,
+                     n + 1, got->ob_type->tp_name);
+}
+
 GimpParam *
-pygimp_param_from_tuple(PyObject *args, const GimpParamDef *ptype, int nparams)
+pygimp_param_from_tuple(PyObject *args, const GimpParamDef *ptype, int nparams, const gchar* error_prefix)
 {
     PyObject *tuple, *item, *x, *y, *w, *h;
     GimpParam *ret;
@@ -317,31 +345,31 @@
     gint32 *i32a; gint16 *i16a; guint8 *i8a; gdouble *fa; gchar **sa;
 
     if (nparams == 0)
-	tuple = PyTuple_New(0);
+        tuple = PyTuple_New(0);
     else if (!PyTuple_Check(args) && nparams == 1)
-	tuple = Py_BuildValue("(O)", args);
+        tuple = Py_BuildValue("(O)", args);
     else {
-	Py_INCREF(args);
-	tuple = args;
-    }
-    if (!PyTuple_Check(tuple)) {
-	PyErr_SetString(PyExc_TypeError, "wrong type of parameter");
-        Py_DECREF(tuple);
-	return NULL;
+        if (!PyTuple_Check(args)) {
+            PyErr_SetString(PyExc_TypeError, "wrong type of parameter");
+            return NULL;
+        }
+        Py_INCREF(args);
+        tuple = args;
     }
-
+    
     if (PyTuple_Size(tuple) != nparams) {
-	PyErr_SetString(PyExc_TypeError, "takes exactly %d arguments (%d given)");
+        PyErr_Format(PyExc_TypeError, "%stakes exactly %d arguments (%d given)",
+                     error_prefix ? error_prefix : "", nparams, PyTuple_Size(tuple));
         Py_DECREF(tuple);
-	return NULL;
+        return NULL;
     }
 
     ret = g_new(GimpParam, nparams+1);
     for (i = 0; i <= nparams; i++)
 	ret[i].type = GIMP_PDB_STATUS;
-#define check(expr) if (expr) { \
-	    PyErr_SetString(PyExc_TypeError, "wrong parameter type"); \
-	    Py_DECREF(tuple); \
+#define check(expr, expected) if (expr) { \
+	    pygimp_set_type_error(i, expected, item, error_prefix); \
+        Py_DECREF(tuple); \
 	    gimp_destroy_params(ret, nparams); \
 	    return NULL; \
 	}
@@ -356,22 +384,22 @@
 	item = PyTuple_GetItem(tuple, i-1);
 	switch (ptype[i-1].type) {
 	case GIMP_PDB_INT32:
-	    check((x = PyNumber_Int(item)) == NULL);
+	    check((x = PyNumber_Int(item)) == NULL, "int");
 	    ret[i].data.d_int32 = (gint32)PyInt_AsLong(x);
 	    Py_DECREF(x);
 	    break;
 	case GIMP_PDB_INT16:
-	    check((x = PyNumber_Int(item)) == NULL);
+	    check((x = PyNumber_Int(item)) == NULL, "int");
 	    ret[i].data.d_int16 = (gint16)PyInt_AsLong(x);
 	    Py_DECREF(x);
 	    break;
 	case GIMP_PDB_INT8:
-	    check((x = PyNumber_Int(item)) == NULL);
+	    check((x = PyNumber_Int(item)) == NULL, "int");
 	    ret[i].data.d_int8 = (guint8)PyInt_AsLong(x);
 	    Py_DECREF(x);
 	    break;
 	case GIMP_PDB_FLOAT:
-	    check((x = PyNumber_Float(item)) == NULL);
+	    check((x = PyNumber_Float(item)) == NULL, "float");
 	    ret[i].data.d_float = PyFloat_AsDouble(x);
 	    Py_DECREF(x);
 	    break;
@@ -380,12 +408,12 @@
 		ret[i].data.d_string = NULL;
 		break;
 	    }
-	    check((x = PyObject_Str(item)) == NULL);
+	    check((x = PyObject_Str(item)) == NULL, "str");
 	    ret[i].data.d_string = g_strdup(PyString_AsString(x));
 	    Py_DECREF(x);
 	    break;
 	case GIMP_PDB_INT32ARRAY:
-	    check(!PySequence_Check(item));
+	    check(!PySequence_Check(item), "sequence");
 	    len = PySequence_Length(item);
 	    i32a = g_new(gint32, len);
 	    for (j = 0; j < len; j++) {
@@ -398,7 +426,7 @@
 	    ret[i].data.d_int32array = i32a;
 	    break;
 	case GIMP_PDB_INT16ARRAY:
-	    check(!PySequence_Check(item));
+	    check(!PySequence_Check(item), "sequence");
 	    len = PySequence_Length(item);
 	    i16a = g_new(gint16, len);
 	    for (j = 0; j < len; j++) {
@@ -411,7 +439,7 @@
 	    ret[i].data.d_int16array = i16a;
 	    break;
 	case GIMP_PDB_INT8ARRAY:
-	    check(!PySequence_Check(item));
+	    check(!PySequence_Check(item), "sequence");
 	    len = PySequence_Length(item);
 	    i8a = g_new(guint8, len);
 	    for (j = 0; j < len; j++) {
@@ -424,7 +452,7 @@
 	    ret[i].data.d_int8array = i8a;
 	    break;
 	case GIMP_PDB_FLOATARRAY:
-	    check(!PySequence_Check(item));
+	    check(!PySequence_Check(item), "sequence");
 	    len = PySequence_Length(item);
 	    fa = g_new(gdouble, len);
 	    for (j = 0; j < len; j++) {
@@ -437,7 +465,7 @@
 	    ret[i].data.d_floatarray = fa;
 	    break;
 	case GIMP_PDB_STRINGARRAY:
-	    check(!PySequence_Check(item));
+	    check(!PySequence_Check(item), "sequence");
 	    len = PySequence_Length(item);
 	    sa = g_new(gchar *, len);
 	    for (j = 0; j < len; j++) {
@@ -458,6 +486,7 @@
                 GimpRGB rgb;
 
                 if (!pygimp_rgb_from_pyobject(item, &rgb)) {
+                    pygimp_set_type_error(i, "color", item, error_prefix);
                     Py_DECREF(tuple);
                     gimp_destroy_params(ret, nparams);
                     return NULL;
@@ -468,20 +497,20 @@
 	    break;
 	case GIMP_PDB_REGION:
 	    check(!PySequence_Check(item) ||
-		  PySequence_Length(item) < 4);
+		  PySequence_Length(item) < 4, "sequence");
 	    x = PySequence_GetItem(item, 0);
 	    y = PySequence_GetItem(item, 1);
 	    w = PySequence_GetItem(item, 2);
 	    h = PySequence_GetItem(item, 3);
 	    check(!PyInt_Check(x) || !PyInt_Check(y) ||
-		  !PyInt_Check(w) || !PyInt_Check(h));
+		  !PyInt_Check(w) || !PyInt_Check(h), "int");
 	    ret[i].data.d_region.x = PyInt_AsLong(x);
 	    ret[i].data.d_region.y = PyInt_AsLong(y);
 	    ret[i].data.d_region.width = PyInt_AsLong(w);
 	    ret[i].data.d_region.height = PyInt_AsLong(h);
 	    break;
 	case GIMP_PDB_DISPLAY:
-	    check(!pygimp_display_check(item));
+	    check(!pygimp_display_check(item), "gimp.Display");
 	    ret[i].data.d_display = ((PyGimpDisplay *)item)->ID;
 	    break;
 	case GIMP_PDB_IMAGE:
@@ -489,7 +518,7 @@
 		ret[i].data.d_image = -1;
 		break;
 	    }
-	    check(!pygimp_image_check(item));
+	    check(!pygimp_image_check(item), "gimp.Image");
 	    ret[i].data.d_image = ((PyGimpImage *)item)->ID;
 	    break;
 	case GIMP_PDB_LAYER:
@@ -497,7 +526,7 @@
 		ret[i].data.d_layer = -1;
 		break;
 	    }
-	    check(!pygimp_layer_check(item));
+	    check(!pygimp_layer_check(item), "gimp.Layer");
 	    ret[i].data.d_layer = ((PyGimpLayer *)item)->ID;
 	    break;
 	case GIMP_PDB_CHANNEL:
@@ -505,7 +534,7 @@
 		ret[i].data.d_channel = -1;
 		break;
 	    }
-	    check(!pygimp_channel_check(item));
+	    check(!pygimp_channel_check(item), "gimp.Channel");
 	    ret[i].data.d_channel = ((PyGimpChannel *)item)->ID;
 	    break;
 	case GIMP_PDB_DRAWABLE:
@@ -513,26 +542,26 @@
 		ret[i].data.d_channel = -1;
 		break;
 	    }
-	    check(!pygimp_drawable_check(item));
+	    check(!pygimp_drawable_check(item), "gimp.Drawable");
 	    ret[i].data.d_channel = ((PyGimpDrawable *)item)->ID;
 	    break;
 	case GIMP_PDB_SELECTION:
-	    check(!pygimp_layer_check(item));
+	    check(!pygimp_layer_check(item), "gimp.Layer");
 	    ret[i].data.d_selection = ((PyGimpLayer *)item)->ID;
 	    break;
 	case GIMP_PDB_BOUNDARY:
-	    check(!PyInt_Check(item));
+	    check(!PyInt_Check(item), "int");
 	    ret[i].data.d_boundary = PyInt_AsLong(item);
 	    break;
 	case GIMP_PDB_VECTORS:
-	    check(!pygimp_vectors_check(item));
+	    check(!pygimp_vectors_check(item), "gimp.Vectors");
 	    ret[i].data.d_vectors = ((PyGimpVectors *)item)->ID;
 	    break;
 	case GIMP_PDB_PARASITE:
 	    /* can't do anything, since size of GimpParasite is not known */
 	    break;
 	case GIMP_PDB_STATUS:
-	    check(!PyInt_Check(item));
+	    check(!PyInt_Check(item), "int");
 	    ret[i].data.d_status = PyInt_AsLong(item);
 	    break;
 	case GIMP_PDB_END:
@@ -833,11 +862,13 @@
     int nret;
     PyObject *t = NULL, *r;
     GimpRunMode run_mode = GIMP_RUN_NONINTERACTIVE;
-
+    gchar *error_prefix;
 #if PG_DEBUG > 0
     g_printerr("--- %s --- ", PyString_AsString(self->proc_name));
 #endif
 
+    error_prefix = g_strdup_printf("%s: ", self->name);
+
     if (kwargs) {
         int len, pos;
         PyObject *key, *val;
@@ -870,41 +901,46 @@
     }
 
     if (self->nparams > 0 && !strcmp(self->params[0].name, "run-mode")) {
-	params = pygimp_param_from_tuple(args, self->params + 1,
-					 self->nparams - 1);
+        params = pygimp_param_from_tuple(args, self->params + 1,
+                                         self->nparams - 1, error_prefix);
 
-	if (params == NULL)
-	    return NULL;
+        if (params == NULL) {
+            g_free(error_prefix);
+            return NULL;
+        }
 
-	params[0].type = self->params[0].type;
-	params[0].data.d_int32 = run_mode;
+        params[0].type = self->params[0].type;
+        params[0].data.d_int32 = run_mode;
 
-#if PG_DEBUG > 1
-	pygimp_param_print(self->nparams, params);
-#endif
+    #if PG_DEBUG > 1
+        pygimp_param_print(self->nparams, params);
+    #endif
 
-	ret = gimp_run_procedure2(self->name, &nret, self->nparams, params);
+        ret = gimp_run_procedure2(self->name, &nret, self->nparams, params);
     } else {
-	params = pygimp_param_from_tuple(args, self->params, self->nparams);
+        params = pygimp_param_from_tuple(args, self->params, self->nparams, error_prefix);
 
-	if (params == NULL)
-	    return NULL;
+        if (params == NULL) {
+            g_free(error_prefix);
+            return NULL;
+        }
 
-#if PG_DEBUG > 1
-	pygimp_param_print(self->nparams, params+1);
-#endif
+    #if PG_DEBUG > 1
+        pygimp_param_print(self->nparams, params+1);
+    #endif
 
-	ret = gimp_run_procedure2(self->name, &nret, self->nparams, params + 1);
+        ret = gimp_run_procedure2(self->name, &nret, self->nparams, params + 1);
     }
 
     gimp_destroy_params(params, self->nparams);
 
     if (!ret) {
-	PyErr_SetString(pygimp_error, "no status returned");
-#if PG_DEBUG >= 1
-	g_printerr("ret == NULL\n");
-#endif
-	return NULL;
+        PyErr_Format(pygimp_error, "%sNo status returned", error_prefix);
+        #if PG_DEBUG >= 1
+            g_printerr("ret == NULL\n");
+        #endif
+        g_free(error_prefix);
+        return NULL;
     }
 
     switch(ret[0].data.d_status) {
@@ -913,7 +949,8 @@
 	g_printerr("execution error\n");
 #endif
 	gimp_destroy_params(ret, nret);
-	PyErr_SetString(PyExc_RuntimeError, "execution error");
+	PyErr_Format(PyExc_RuntimeError, "%sExecution error", error_prefix);
+    g_free(error_prefix);
 	return NULL;
 	break;
 
@@ -922,7 +959,8 @@
 	g_printerr("calling error\n");
 #endif
 	gimp_destroy_params(ret, nret);
-	PyErr_SetString(PyExc_TypeError, "invalid arguments");
+	PyErr_Format(PyExc_TypeError, "%sInvalid arguments", error_prefix);
+    g_free(error_prefix);
 	return NULL;
 	break;
 
@@ -934,7 +972,8 @@
 	gimp_destroy_params(ret, nret);
 
 	if (t == NULL) {
-	    PyErr_SetString(pygimp_error, "could not make return value");
+	    PyErr_Format(pygimp_error, "%sCould not make return value", error_prefix);
+        g_free(error_prefix);
 	    return NULL;
 	}
 	break;
@@ -944,11 +983,14 @@
 	g_printerr("unknown - %i (type %i)\n",
                    ret[0].data.d_status, ret[0].type);
 #endif
-	PyErr_SetString(pygimp_error, "unknown return code");
+	PyErr_SetString(pygimp_error, "%sUnknown return code");
+    g_free(error_prefix);
 	return NULL;
 	break;
     }
 
+    g_free(error_prefix);
+
     if (PyTuple_Size(t) == 1) {
 	r = PyTuple_GetItem(t, 0);
 	Py_INCREF(r);

Modified: branches/soc-2008-python/plug-ins/pygimp/pygimp.h
==============================================================================
--- branches/soc-2008-python/plug-ins/pygimp/pygimp.h	(original)
+++ branches/soc-2008-python/plug-ins/pygimp/pygimp.h	Mon Jun 16 19:41:25 2008
@@ -33,7 +33,7 @@
 
 PyObject *pygimp_param_to_tuple(int nparams, const GimpParam *params);
 GimpParam *pygimp_param_from_tuple(PyObject *args, const GimpParamDef *ptype,
-                                   int nparams);
+                                   int nparams, const gchar *error_prefix);
 
 
 extern PyTypeObject PyGimpPDB_Type;

Modified: branches/soc-2008-python/plug-ins/pygimp/testui.py
==============================================================================
--- branches/soc-2008-python/plug-ins/pygimp/testui.py	(original)
+++ branches/soc-2008-python/plug-ins/pygimp/testui.py	Mon Jun 16 19:41:25 2008
@@ -21,9 +21,6 @@
         setter(gimp.color.RGB(1,2,3))
         getter()
 
-    def testButton(self):
-        button = gimp.ui.Button()
-        button.extended_clicked(gtk.gdk.BUTTON1_MASK)
 
     def testAspectPreview(self):
         # FIXME
@@ -45,6 +42,21 @@
         bs.set_brush(str(gimp.context.get_brush()), 1.0, 10, gimp.enums.NORMAL_MODE)
         brush = bs.get_brush()
 
+    def testButton(self):
+        button = gimp.ui.Button()
+        button.extended_clicked(gtk.gdk.BUTTON1_MASK)
+
+    def testCellRendererColor(self):
+        crc = gimp.ui.CellRendererColor()
+        crc.props.color = gimp.color.RGB(255,0,0)
+        crc.props.opaque = True
+        crc.props.icon_size = 10
+
+    def testCellRendererToggle(self):
+        crt = gimp.ui.CellRendererToggle("Some stock id")
+        crt.props.stock_id = "foobar"
+        crt.props.stock_size = 2
+
     def testChainButton(self):
         cb = gimp.ui.ChainButton(gimp.ui.CHAIN_TOP)
         self._testBoolGetterSetter(cb.set_active, cb.get_active)
@@ -120,7 +132,7 @@
                                 ("foo", 1, "bar", 2))
         dialog.add_button("batz", 2)
         # dialog.run()
-
+        dialog.set_transient()
     def testDrawableComboBox(self):
         dcb = gimp.ui.DrawableComboBox(lambda value: True)
         dcb = gimp.ui.DrawableComboBox(lambda value, data: False, "Some data")
@@ -157,6 +169,9 @@
         gsb.set_gradient(str(gimp.context.get_gradient()))
         gradient = gsb.get_gradient()
 
+    def testHintBox(self):
+        hb = gimp.ui.HintBox("Some hint")
+    
     def testImageComboBox(self):
         icb = gimp.ui.ImageComboBox(lambda value: True)
         icb = gimp.ui.ImageComboBox(lambda value, data: False, "Some data")



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]