Skip to content

Commit c12d293

Browse files
committed
rel_center
1 parent b0d45d1 commit c12d293

File tree

5 files changed

+188
-1
lines changed

5 files changed

+188
-1
lines changed

buildconfig/stubs/pygame/rect.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ class _GenericRect(Collection[_N]):
9393
@center.setter
9494
def center(self, value: Coordinate) -> None: ...
9595
@property
96+
def rel_center(self) -> Tuple[_N, _N]: ...
97+
@rel_center.setter
98+
def rel_center(self, value: Coordinate) -> None: ...
99+
@property
96100
def centerx(self) -> _N: ...
97101
@centerx.setter
98102
def centerx(self, value: float) -> None: ...

docs/reST/ref/rect.rst

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
top, left, bottom, right
4848
topleft, bottomleft, topright, bottomright
4949
midtop, midleft, midbottom, midright
50-
center, centerx, centery
50+
center, rel_center, centerx, centery
5151
size, width, height
5252
w,h
5353

@@ -92,6 +92,25 @@
9292
However, the subclass's ``__init__()`` method is not called,
9393
and ``__new__()`` is assumed to take no arguments. So these methods should be
9494
overridden if any extra attributes need to be copied.
95+
96+
.. versionadded:: 2.5.2
97+
``rel_center`` added to Rect / FRect. This will return you ``Coordinate`` of
98+
the center relative to the topleft of the Rect. Setting a ``Coordinate`` to it will
99+
modify the size of the rect to 2 times the ``Coordinate`` used. Below you can find a
100+
code example of how it should work :
101+
102+
.. code-block:: python
103+
104+
> my_rect = pygame.Rect(0, 0, 2, 2)
105+
> my_rect.rel_center
106+
> (1, 1)
107+
> my_rect.rel_center = (128, 128)
108+
> my_rect.rel_center, my_rect.size
109+
> ((128, 128), (256, 256))
110+
111+
Beware of non integer relative centers ! Using a Rect instead of FRect will round down
112+
the values of the returned ``Coordinate``.
113+
95114

96115
.. method:: copy
97116

src_c/rect.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ four_floats_from_obj(PyObject *obj, float *val1, float *val2, float *val3,
133133
#define RectExport_setmidright pg_rect_setmidright
134134
#define RectExport_getcenter pg_rect_getcenter
135135
#define RectExport_setcenter pg_rect_setcenter
136+
#define RectExport_getrelcenter pg_rect_getrelcenter
137+
#define RectExport_setrelcenter pg_rect_setrelcenter
136138
#define RectExport_getsize pg_rect_getsize
137139
#define RectExport_setsize pg_rect_setsize
138140
#define RectImport_primitiveType int
@@ -250,6 +252,8 @@ four_floats_from_obj(PyObject *obj, float *val1, float *val2, float *val3,
250252
#define RectExport_setmidright pg_frect_setmidright
251253
#define RectExport_getcenter pg_frect_getcenter
252254
#define RectExport_setcenter pg_frect_setcenter
255+
#define RectExport_getrelcenter pg_frect_getrelcenter
256+
#define RectExport_setrelcenter pg_frect_setrelcenter
253257
#define RectExport_getsize pg_frect_getsize
254258
#define RectExport_setsize pg_frect_setsize
255259
#define RectImport_primitiveType float
@@ -684,6 +688,8 @@ static PyGetSetDef pg_frect_getsets[] = {
684688
{"size", (getter)pg_frect_getsize, (setter)pg_frect_setsize, NULL, NULL},
685689
{"center", (getter)pg_frect_getcenter, (setter)pg_frect_setcenter, NULL,
686690
NULL},
691+
{"rel_center", (getter)pg_frect_getrelcenter,
692+
(setter)pg_frect_setrelcenter, NULL, NULL},
687693

688694
{"__safe_for_unpickling__", (getter)pg_rect_getsafepickle, NULL, NULL,
689695
NULL},
@@ -726,6 +732,8 @@ static PyGetSetDef pg_rect_getsets[] = {
726732
{"size", (getter)pg_rect_getsize, (setter)pg_rect_setsize, NULL, NULL},
727733
{"center", (getter)pg_rect_getcenter, (setter)pg_rect_setcenter, NULL,
728734
NULL},
735+
{"rel_center", (getter)pg_rect_getrelcenter, (setter)pg_rect_setrelcenter,
736+
NULL, NULL},
729737

730738
{"__safe_for_unpickling__", (getter)pg_rect_getsafepickle, NULL, NULL,
731739
NULL},

src_c/rect_impl.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,12 @@
284284
#ifndef RectExport_setcenter
285285
#error RectExport_setcenter needs to be defined
286286
#endif
287+
#ifndef RectExport_getrelcenter
288+
#error RectExport_getrelcenter needs to be defined
289+
#endif
290+
#ifndef RectExport_setrelcenter
291+
#error RectExport_setrelcenter needs to be defined
292+
#endif
287293
#ifndef RectExport_getsize
288294
#error RectExport_getsize needs to be defined
289295
#endif
@@ -604,6 +610,10 @@ RectExport_getcenter(RectObject *self, void *closure);
604610
static int
605611
RectExport_setcenter(RectObject *self, PyObject *value, void *closure);
606612
static PyObject *
613+
RectExport_getrelcenter(RectObject *self, void *closure);
614+
static int
615+
RectExport_setrelcenter(RectObject *self, PyObject *value, void *closure);
616+
static PyObject *
607617
RectExport_getsize(RectObject *self, void *closure);
608618
static int
609619
RectExport_setsize(RectObject *self, PyObject *value, void *closure);
@@ -2804,6 +2814,33 @@ RectExport_getcenter(RectObject *self, void *closure)
28042814
self->r.y + (self->r.h / 2));
28052815
}
28062816

2817+
/*center*/
2818+
static PyObject *
2819+
RectExport_getrelcenter(RectObject *self, void *closure)
2820+
{
2821+
return TupleFromTwoPrimitives(self->r.w / 2, self->r.h / 2);
2822+
}
2823+
2824+
static int
2825+
RectExport_setrelcenter(RectObject *self, PyObject *value, void *closure)
2826+
{
2827+
PrimitiveType val1, val2;
2828+
2829+
if (NULL == value) {
2830+
/* Attribute deletion not supported. */
2831+
PyErr_SetString(PyExc_AttributeError, "can't delete attribute");
2832+
return -1;
2833+
}
2834+
2835+
if (!twoPrimitivesFromObj(value, &val1, &val2)) {
2836+
PyErr_SetString(PyExc_TypeError, "invalid rect assignment");
2837+
return -1;
2838+
}
2839+
self->r.w = val1 * 2;
2840+
self->r.h = val2 * 2;
2841+
return 0;
2842+
}
2843+
28072844
static int
28082845
RectExport_setcenter(RectObject *self, PyObject *value, void *closure)
28092846
{
@@ -2958,6 +2995,8 @@ RectExport_iterator(RectObject *self)
29582995
#undef RectExport_setmidright
29592996
#undef RectExport_getcenter
29602997
#undef RectExport_setcenter
2998+
#undef RectExport_getrelcenter
2999+
#undef RectExport_setrelcenter
29613000
#undef RectExport_getsize
29623001
#undef RectExport_setsize
29633002
#undef RectExport_iterator

0 commit comments

Comments
 (0)