3030#include "shared-bindings/displayio/TileGrid.h"
3131
3232void common_hal_displayio_group_construct (displayio_group_t * self , uint32_t max_size , uint32_t scale ) {
33- mp_obj_t * children = m_new (mp_obj_t , max_size );
33+ displayio_group_child_t * children = m_new (displayio_group_child_t , max_size );
3434 displayio_group_construct (self , children , max_size , scale );
3535}
3636
@@ -76,19 +76,21 @@ void common_hal_displayio_group_insert(displayio_group_t* self, size_t index, mp
7676 for (size_t i = index ; i < self -> size ; i ++ ) {
7777 self -> children [i + 1 ] = self -> children [i ];
7878 }
79- self -> children [index ] = native_layer ;
79+ self -> children [index ].native = native_layer ;
80+ self -> children [index ].original = layer ;
8081 self -> size ++ ;
8182 self -> needs_refresh = true;
8283}
8384
8485mp_obj_t common_hal_displayio_group_pop (displayio_group_t * self , size_t index ) {
8586 self -> size -- ;
86- mp_obj_t item = self -> children [index ];
87+ mp_obj_t item = self -> children [index ]. original ;
8788 // Shift everything left.
8889 for (size_t i = index ; i < self -> size ; i ++ ) {
8990 self -> children [i ] = self -> children [i + 1 ];
9091 }
91- self -> children [self -> size ] = NULL ;
92+ self -> children [self -> size ].native = NULL ;
93+ self -> children [self -> size ].original = NULL ;
9294 self -> needs_refresh = true;
9395 return item ;
9496}
@@ -98,15 +100,23 @@ size_t common_hal_displayio_group_get_len(displayio_group_t* self) {
98100}
99101
100102mp_obj_t common_hal_displayio_group_get (displayio_group_t * self , size_t index ) {
101- return MP_OBJ_FROM_PTR ( self -> children [index ]) ;
103+ return self -> children [index ]. original ;
102104}
103105
104106void common_hal_displayio_group_set (displayio_group_t * self , size_t index , mp_obj_t layer ) {
105- self -> children [index ] = layer ;
107+ mp_obj_t native_layer = mp_instance_cast_to_native_base (layer , & displayio_group_type );
108+ if (native_layer == MP_OBJ_NULL ) {
109+ native_layer = mp_instance_cast_to_native_base (layer , & displayio_tilegrid_type );
110+ }
111+ if (native_layer == MP_OBJ_NULL ) {
112+ mp_raise_ValueError (translate ("Layer must be a Group or TileGrid subclass." ));
113+ }
114+ self -> children [index ].native = native_layer ;
115+ self -> children [index ].original = layer ;
106116 self -> needs_refresh = true;
107117}
108118
109- void displayio_group_construct (displayio_group_t * self , mp_obj_t * child_array , uint32_t max_size , uint32_t scale ) {
119+ void displayio_group_construct (displayio_group_t * self , displayio_group_child_t * child_array , uint32_t max_size , uint32_t scale ) {
110120 self -> x = 0 ;
111121 self -> y = 0 ;
112122 self -> children = child_array ;
@@ -121,7 +131,7 @@ bool displayio_group_get_pixel(displayio_group_t *self, int16_t x, int16_t y, ui
121131 x /= self -> scale ;
122132 y /= self -> scale ;
123133 for (int32_t i = self -> size - 1 ; i >= 0 ; i -- ) {
124- mp_obj_t layer = self -> children [i ];
134+ mp_obj_t layer = self -> children [i ]. native ;
125135 if (MP_OBJ_IS_TYPE (layer , & displayio_tilegrid_type )) {
126136 if (displayio_tilegrid_get_pixel (layer , x , y , pixel )) {
127137 return true;
@@ -140,7 +150,7 @@ bool displayio_group_needs_refresh(displayio_group_t *self) {
140150 return true;
141151 }
142152 for (int32_t i = self -> size - 1 ; i >= 0 ; i -- ) {
143- mp_obj_t layer = self -> children [i ];
153+ mp_obj_t layer = self -> children [i ]. native ;
144154 if (MP_OBJ_IS_TYPE (layer , & displayio_tilegrid_type )) {
145155 if (displayio_tilegrid_needs_refresh (layer )) {
146156 return true;
@@ -157,7 +167,7 @@ bool displayio_group_needs_refresh(displayio_group_t *self) {
157167void displayio_group_finish_refresh (displayio_group_t * self ) {
158168 self -> needs_refresh = false;
159169 for (int32_t i = self -> size - 1 ; i >= 0 ; i -- ) {
160- mp_obj_t layer = self -> children [i ];
170+ mp_obj_t layer = self -> children [i ]. native ;
161171 if (MP_OBJ_IS_TYPE (layer , & displayio_tilegrid_type )) {
162172 displayio_tilegrid_finish_refresh (layer );
163173 } else if (MP_OBJ_IS_TYPE (layer , & displayio_group_type )) {
0 commit comments