diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gtk/gtk.override | 52 | ||||
-rw-r--r-- | tests/test_actiongroup.py | 22 |
3 files changed, 66 insertions, 18 deletions
@@ -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__': |