diff --git a/buildconfig/stubs/pygame/rect.pyi b/buildconfig/stubs/pygame/rect.pyi index a0ad71d87b..b401f9a930 100644 --- a/buildconfig/stubs/pygame/rect.pyi +++ b/buildconfig/stubs/pygame/rect.pyi @@ -128,6 +128,8 @@ class _GenericRect(Collection[_N]): def __init__(self, left_top: Coordinate, width_height: Coordinate) -> None: ... @overload def __init__(self, single_arg: RectValue) -> None: ... + @overload + def __init__(self) -> None: ... def __len__(self) -> Literal[4]: ... def __iter__(self) -> Iterator[_N]: ... @overload diff --git a/docs/reST/ref/rect.rst b/docs/reST/ref/rect.rst index 984c1aeee4..9066d045b1 100644 --- a/docs/reST/ref/rect.rst +++ b/docs/reST/ref/rect.rst @@ -11,9 +11,11 @@ | :sg:`Rect(left, top, width, height) -> Rect` | :sg:`Rect((left, top), (width, height)) -> Rect` | :sg:`Rect(object) -> Rect` + | :sg:`Rect() -> Rect` | :sg:`FRect(left, top, width, height) -> FRect` | :sg:`FRect((left, top), (width, height)) -> FRect` | :sg:`FRect(object) -> FRect` + | :sg:`FRect() -> FRect` .. versionchanged:: 2.2 Since version 2.2 there is another class called FRect that serves the same purpose as as `Rect` but it can hold floats instead of integers. @@ -26,6 +28,10 @@ values to construct a Rect. This makes it easier to create Rects on the fly as arguments to functions. + If no arguments are given, a zero Rect will be created (x=0, y=0, w=0, h=0). + This will only work when using the Rect/FRect class and not with functions + that require a Rect argument. + The Rect functions that change the position or size of a Rect return a new copy of the Rect with the affected changes. The original Rect is not modified. Some methods have an alternate "in-place" version that returns diff --git a/src_c/doc/rect_doc.h b/src_c/doc/rect_doc.h index cfe1e2f1bd..e83a50431c 100644 --- a/src_c/doc/rect_doc.h +++ b/src_c/doc/rect_doc.h @@ -1,5 +1,5 @@ /* Auto generated file: with makeref.py . Docs go in docs/reST/ref/ . */ -#define DOC_RECT "Rect(left, top, width, height) -> Rect\nRect((left, top), (width, height)) -> Rect\nRect(object) -> Rect\nFRect(left, top, width, height) -> FRect\nFRect((left, top), (width, height)) -> FRect\nFRect(object) -> FRect\npygame object for storing rectangular coordinates" +#define DOC_RECT "Rect(left, top, width, height) -> Rect\nRect((left, top), (width, height)) -> Rect\nRect(object) -> Rect\nRect() -> Rect\nFRect(left, top, width, height) -> FRect\nFRect((left, top), (width, height)) -> FRect\nFRect(object) -> FRect\nFRect() -> FRect\npygame object for storing rectangular coordinates" #define DOC_RECT_COPY "copy() -> Rect\ncopy the rectangle" #define DOC_RECT_MOVE "move(x, y, /) -> Rect\nmoves the rectangle" #define DOC_RECT_MOVEIP "move_ip(x, y, /) -> None\nmoves the rectangle, in place" diff --git a/src_c/rect_impl.h b/src_c/rect_impl.h index b66ee4c3f4..0f6cb53fb0 100644 --- a/src_c/rect_impl.h +++ b/src_c/rect_impl.h @@ -850,6 +850,10 @@ RectExport_dealloc(RectObject *self) static int RectExport_init(RectObject *self, PyObject *args, PyObject *kwds) { + if (PyTuple_GET_SIZE(args) == 0) { + return 0; + } + InnerRect *argrect, temp; if (!(argrect = RectFromObject(args, &temp))) { diff --git a/test/rect_test.py b/test/rect_test.py index 22291fae15..307feb8b29 100644 --- a/test/rect_test.py +++ b/test/rect_test.py @@ -2847,6 +2847,13 @@ def test_collection_abc(self): self.assertTrue(isinstance(r, Collection)) self.assertFalse(isinstance(r, Sequence)) + def test_construction_no_args(self): + r = Rect() + self.assertEqual(r.x, 0) + self.assertEqual(r.y, 0) + self.assertEqual(r.w, 0) + self.assertEqual(r.h, 0) + class FRectTypeTest(RectTypeTest): def setUp(self): @@ -3291,6 +3298,13 @@ def test_frect_subscript(self): self.assertSeqAlmostEqual5(r[3::-1], [4.8, 3.6, 2.4, 1.2]) self.assertRaises(TypeError, r.__getitem__, None) + def test_construction_no_args(self): + r = FRect() + self.assertEqual(r.x, 0.0) + self.assertEqual(r.y, 0.0) + self.assertEqual(r.w, 0.0) + self.assertEqual(r.h, 0.0) + class SubclassTest(unittest.TestCase): class MyRect(Rect): @@ -3366,6 +3380,13 @@ def test_collection_abc(self): self.assertTrue(isinstance(mr1, Collection)) self.assertFalse(isinstance(mr1, Sequence)) + def test_construction_no_args(self): + mr = self.MyRect() + self.assertEqual(mr.x, 0) + self.assertEqual(mr.y, 0) + self.assertEqual(mr.w, 0) + self.assertEqual(mr.h, 0) + if __name__ == "__main__": unittest.main()