summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--docs/reference/pygobject.xml83
-rw-r--r--gobject/pygobject.c107
3 files changed, 198 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 906a112..eeedb60 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>&nbsp;:</term>
+ <listitem><simpara>a string containing the first property name for the
+GObject</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>...</parameter>&nbsp;:</term>
+ <listitem><simpara>additional property names
+</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>Returns</emphasis>&nbsp;:</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>&nbsp;:</term>
+ <listitem><simpara>the property name</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>value</parameter>&nbsp;:</term>
+ <listitem><simpara>a Python object containing the property value
+to be set</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>...</parameter>&nbsp;:</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 },