summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--gtk/gtk.override52
-rw-r--r--tests/test_actiongroup.py22
3 files changed, 66 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 1d1a8417..b86010ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-06-22 Paul Pogonyshev <pogonyshev@gmx.net>
+
+ * gtk/gtk.override (_wrap_gtk_action_set_menu_item_type)
+ (_wrap_gtk_action_set_tool_item_type): Check that argument is a
+ subclass of gtk.MenuItem or gtk.ToolItem correspondingly (bug
+ #533644).
+
+ * tests/test_actiongroup.py (ActionTest.testSetItemClasses): New
+ test for the added type check.
+
2008-06-22 Gian Mario Tagliaretti <gianmt@gnome.org>
Bug 530145 – Missing method gtk.TreeView.get_tooltip_context
diff --git a/gtk/gtk.override b/gtk/gtk.override
index 857c9d13..aec37e6e 100644
--- a/gtk/gtk.override
+++ b/gtk/gtk.override
@@ -8283,15 +8283,23 @@ _wrap_gtk_action_set_menu_item_type(PyObject *cls,
&py_menu_item_type))
return NULL;
- if ((gtype = pyg_type_from_object(cls)) == 0)
- return NULL;
- if ((menu_item_type = pyg_type_from_object(py_menu_item_type)) == 0)
- return NULL;
- klass = (GtkActionClass *) g_type_class_ref(gtype);
- klass->menu_item_type = menu_item_type;
- g_type_class_unref(klass);
- Py_INCREF(Py_None);
- return Py_None;
+ if ((gtype = pyg_type_from_object(cls)) == 0)
+ return NULL;
+
+ if (!PyType_Check(py_menu_item_type)
+ || !PyType_IsSubtype((PyTypeObject *) py_menu_item_type, &PyGtkMenuItem_Type)) {
+ PyErr_SetString(PyExc_TypeError, "argument must be a subtype of gtk.MenuItem");
+ return NULL;
+ }
+
+ if ((menu_item_type = pyg_type_from_object(py_menu_item_type)) == 0)
+ return NULL;
+
+ klass = (GtkActionClass *) g_type_class_ref(gtype);
+ klass->menu_item_type = menu_item_type;
+ g_type_class_unref(klass);
+ Py_INCREF(Py_None);
+ return Py_None;
}
%%
@@ -8311,15 +8319,23 @@ _wrap_gtk_action_set_tool_item_type(PyObject *cls,
&py_tool_item_type))
return NULL;
- if ((gtype = pyg_type_from_object(cls)) == 0)
- return NULL;
- if ((tool_item_type = pyg_type_from_object(py_tool_item_type)) == 0)
- return NULL;
- klass = (GtkActionClass *) g_type_class_ref(gtype);
- klass->toolbar_item_type = tool_item_type;
- g_type_class_unref(klass);
- Py_INCREF(Py_None);
- return Py_None;
+ if ((gtype = pyg_type_from_object(cls)) == 0)
+ return NULL;
+
+ if (!PyType_Check(py_tool_item_type)
+ || !PyType_IsSubtype((PyTypeObject *) py_tool_item_type, &PyGtkToolItem_Type)) {
+ PyErr_SetString(PyExc_TypeError, "argument must be a subtype of gtk.ToolItem");
+ return NULL;
+ }
+
+ if ((tool_item_type = pyg_type_from_object(py_tool_item_type)) == 0)
+ return NULL;
+
+ klass = (GtkActionClass *) g_type_class_ref(gtype);
+ klass->toolbar_item_type = tool_item_type;
+ g_type_class_unref(klass);
+ Py_INCREF(Py_None);
+ return Py_None;
}
%%
override gtk_accel_map_foreach kwargs
diff --git a/tests/test_actiongroup.py b/tests/test_actiongroup.py
index f19de1b4..28228912 100644
--- a/tests/test_actiongroup.py
+++ b/tests/test_actiongroup.py
@@ -145,6 +145,28 @@ class ActionTest(unittest.TestCase):
myaction = MyAction()
myaction.activate()
self.assertEqual(myaction._activated, True)
+
+ def testSetItemClasses(self):
+
+ class MyAction(gtk.Action):
+ def __init__(self):
+ gtk.Action.__init__(self, 'name', 'label', None, None)
+
+ def set_menu_item_type(type):
+ MyAction.set_menu_item_type(type)
+
+ def set_tool_item_type(type):
+ MyAction.set_tool_item_type(type)
+
+ self.assertRaises(TypeError, lambda: set_menu_item_type(None))
+ self.assertRaises(TypeError, lambda: set_menu_item_type(gtk.Button))
+ set_menu_item_type(gtk.ImageMenuItem)
+ self.assert_(isinstance(MyAction().create_menu_item(), gtk.ImageMenuItem))
+
+ self.assertRaises(TypeError, lambda: set_tool_item_type(None))
+ self.assertRaises(TypeError, lambda: set_tool_item_type(gtk.Button))
+ set_tool_item_type(gtk.SeparatorToolItem)
+ self.assert_(isinstance(MyAction().create_tool_item(), gtk.SeparatorToolItem))
if __name__ == '__main__':