diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | docs/reference/pygobject.xml | 83 | ||||
-rw-r--r-- | gobject/pygobject.c | 107 |
3 files changed, 198 insertions, 0 deletions
@@ -1,3 +1,11 @@ +2007-04-23 Gian Mario Tagliaretti <gianmt@gnome.org> + + * gobject/pygobject.c: Implemented pygobject_set_properties and + pygobject_get_properties in order to set multiple properties using + keyword arguments. Fixes 403212 + + * docs/reference/pygobject.xml: Docs for the above new methods. + 2007-04-14 Gustavo J. A. M. Carneiro <gjc@gnome.org> * gobject/gobjectmodule.c, gobject/pygobject.h: Add a new diff --git a/docs/reference/pygobject.xml b/docs/reference/pygobject.xml index fd75829..ff02664 100644 --- a/docs/reference/pygobject.xml +++ b/docs/reference/pygobject.xml @@ -25,12 +25,25 @@ linkend="method-gobject--get-property">get_property</link></methodname> </methodsynopsis> <methodsynopsis language="python"> <methodname><link +linkend="method-gobject--get-properties">get_properties</link></methodname> + <methodparam><parameter>first_property_name</parameter></methodparam> + <methodparam><parameter>...</parameter></methodparam> + </methodsynopsis> + <methodsynopsis language="python"> + <methodname><link linkend="method-gobject--set-property">set_property</link></methodname> <methodparam><parameter>property_name</parameter></methodparam> <methodparam><parameter>value</parameter></methodparam> </methodsynopsis> <methodsynopsis language="python"> <methodname><link +linkend="method-gobject--set-properties">set_properties</link></methodname> + <methodparam><parameter>property_name</parameter> + <initializer>value</initializer></methodparam> + <methodparam><parameter>...</parameter></methodparam> + </methodsynopsis> + <methodsynopsis language="python"> + <methodname><link linkend="method-gobject--freeze-notify">freeze_notify</link></methodname> <methodparam></methodparam> </methodsynopsis> <methodsynopsis language="python"> @@ -242,6 +255,40 @@ if the property name is not registered with the object class.</para> </refsect2> + <refsect2 id="method-gobject--get-properties"> + <title>gobject.GObject.get_properties</title> + + <programlisting><methodsynopsis language="python"> + <methodname>get_properties</methodname> + <methodparam><parameter>first_property_name</parameter></methodparam> + <methodparam><parameter>...</parameter></methodparam> + </methodsynopsis></programlisting> + <variablelist> + <varlistentry> + <term><parameter>first_property_name</parameter> :</term> + <listitem><simpara>a string containing the first property name for the +GObject</simpara></listitem> + </varlistentry> + <varlistentry> + <term><parameter>...</parameter> :</term> + <listitem><simpara>additional property names +</simpara></listitem> + </varlistentry> + <varlistentry> + <term><emphasis>Returns</emphasis> :</term> + <listitem><simpara>a tuple containing the property values +requested</simpara></listitem> + </varlistentry> + </variablelist> + + <para>The <methodname>get_properties</methodname>() method returns a tuple containing +the values of the properties requested, or +None if there is no value associated with the property.</para> + <para>The <exceptionname>TypeError</exceptionname> exception is raised +if the property name is not registered with the object class.</para> + + </refsect2> + <refsect2 id="method-gobject--set-property"> <title>gobject.GObject.set_property</title> @@ -271,6 +318,42 @@ if the property name is not registered with the object class or if the value specified could not be converted to the property type.</para> </refsect2> + + <refsect2 id="method-gobject--set-properties"> + <title>gobject.GObject.set_properties</title> + + <programlisting><methodsynopsis language="python"> + <methodname>set_properties</methodname> + <methodparam><parameter>property_name</parameter> + <initializer>value</initializer></methodparam> + <methodparam><parameter>...</parameter></methodparam> + </methodsynopsis></programlisting> + <variablelist> + <varlistentry> + <term><parameter>property_name</parameter> :</term> + <listitem><simpara>the property name</simpara></listitem> + </varlistentry> + <varlistentry> + <term><parameter>value</parameter> :</term> + <listitem><simpara>a Python object containing the property value +to be set</simpara></listitem> + </varlistentry> + <varlistentry> + <term><parameter>...</parameter> :</term> + <listitem><simpara>additional property name and value +kwargs</simpara></listitem> + </varlistentry> + </variablelist> + + <para>The <methodname>set_properties</methodname>() method sets the +property specified by <parameter>property_name</parameter> to the specified +<parameter>value</parameter>, followed by pairs of property name +and value as keyword arguments.</para> + <para>The <exceptionname>TypeError</exceptionname> exception is raised +if the property name is not registered with the object class or if the value +specified could not be converted to the property type.</para> + + </refsect2> <refsect2 id="method-gobject--freeze-notify"> <title>gobject.GObject.freeze_notify</title> diff --git a/gobject/pygobject.c b/gobject/pygobject.c index dd4cc36..a17762d 100644 --- a/gobject/pygobject.c +++ b/gobject/pygobject.c @@ -1183,6 +1183,61 @@ pygobject_get_property(PyGObject *self, PyObject *args) } static PyObject * +pygobject_get_properties(PyGObject *self, PyObject *args) +{ + GObjectClass *class; + int len, i; + PyObject *tuple; + + if ((len = PyTuple_Size(args)) < 1) { + PyErr_SetString(PyExc_TypeError, "requires at least one argument"); + return NULL; + } + + tuple = PyTuple_New(len); + class = G_OBJECT_GET_CLASS(self->obj); + for (i = 0; i < len; i++) { + PyObject *py_property = PyTuple_GetItem(args, i); + gchar *property_name; + GParamSpec *pspec; + GValue value = { 0 }; + PyObject *item; + + if (!PyString_Check(py_property)) { + PyErr_SetString(PyExc_TypeError, + "Expected string argument for property."); + return NULL; + } + + property_name = PyString_AsString(py_property); + + pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(self->obj), + property_name); + if (!pspec) { + PyErr_Format(PyExc_TypeError, + "object of type `%s' does not have property `%s'", + g_type_name(G_OBJECT_TYPE(self->obj)), property_name); + return NULL; + } + if (!(pspec->flags & G_PARAM_READABLE)) { + PyErr_Format(PyExc_TypeError, "property %s is not readable", + property_name); + return NULL; + } + g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE(pspec)); + + g_object_get_property(self->obj, property_name, &value); + + item = pyg_value_as_pyobject(&value, TRUE); + PyTuple_SetItem(tuple, i, item); + + g_value_unset(&value); + } + + return tuple; +} + +static PyObject * pygobject_set_property(PyGObject *self, PyObject *args) { gchar *param_name; @@ -1212,6 +1267,56 @@ pygobject_set_property(PyGObject *self, PyObject *args) } static PyObject * +pygobject_set_properties(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + GObjectClass *class; + Py_ssize_t pos; + PyObject *value; + PyObject *key; + + CHECK_GOBJECT(self); + + class = G_OBJECT_GET_CLASS(self->obj); + + g_object_freeze_notify (G_OBJECT(self->obj)); + pos = 0; + + while (kwargs && PyDict_Next (kwargs, &pos, &key, &value)) { + gchar *key_str = PyString_AsString (key); + GParamSpec *pspec; + GValue gvalue ={ 0, }; + + pspec = g_object_class_find_property (class, key_str); + if (!pspec) { + gchar buf[512]; + + g_snprintf(buf, sizeof(buf), + "object `%s' doesn't support property `%s'", + g_type_name(G_OBJECT_TYPE(self->obj)), key_str); + PyErr_SetString(PyExc_TypeError, buf); + return NULL; + } + + g_value_init(&gvalue, G_PARAM_SPEC_VALUE_TYPE(pspec)); + if (pyg_value_from_pyobject(&gvalue, value)) { + gchar buf[512]; + + g_snprintf(buf, sizeof(buf), + "could not convert value for property `%s'", key_str); + PyErr_SetString(PyExc_TypeError, buf); + return NULL; + } + g_object_set_property(G_OBJECT(self->obj), key_str, &gvalue); + g_value_unset(&gvalue); + } + + g_object_thaw_notify (G_OBJECT(self->obj)); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * pygobject_freeze_notify(PyGObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":GObject.freeze_notify")) @@ -1854,7 +1959,9 @@ static PyMethodDef pygobject_methods[] = { { "__gobject_init__", (PyCFunction)pygobject__gobject_init__, METH_VARARGS|METH_KEYWORDS }, { "get_property", (PyCFunction)pygobject_get_property, METH_VARARGS }, + { "get_properties", (PyCFunction)pygobject_get_properties, METH_VARARGS }, { "set_property", (PyCFunction)pygobject_set_property, METH_VARARGS }, + { "set_properties", (PyCFunction)pygobject_set_properties, METH_KEYWORDS }, { "freeze_notify", (PyCFunction)pygobject_freeze_notify, METH_VARARGS }, { "notify", (PyCFunction)pygobject_notify, METH_VARARGS }, { "thaw_notify", (PyCFunction)pygobject_thaw_notify, METH_VARARGS }, |