Skip to content

Commit fca440f

Browse files
authored
Merge pull request #2113 from tannewt/displayio_hidden
Add .hidden to TileGrid and Group
2 parents 321b57a + 7951646 commit fca440f

File tree

14 files changed

+179
-36
lines changed

14 files changed

+179
-36
lines changed

ports/atmel-samd/boards/ugame10/mpconfigboard.mk

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,16 @@ CIRCUITPY_ANALOGIO = 1
1919
CIRCUITPY_GAMEPAD = 1
2020
CIRCUITPY_DISPLAYIO = 1
2121

22-
CIRCUITPY_TOUCHIO = 0
22+
CIRCUITPY_AUDIOBUSIO = 0
23+
CIRCUITPY_BITBANGIO = 0
24+
CIRCUITPY_FREQUENCYIO = 0
25+
CIRCUITPY_I2CSLAVE = 0
2326
CIRCUITPY_NEOPIXEL_WRITE = 0
27+
CIRCUITPY_PIXELBUF = 0
2428
CIRCUITPY_RTC = 0
25-
CIRCUITPY_USB_MIDI = 0
29+
CIRCUITPY_TOUCHIO = 0
2630
CIRCUITPY_USB_HID = 0
27-
CIRCUITPY_I2CSLAVE = 0
28-
CIRCUITPY_FREQUENCYIO = 0
29-
CIRCUITPY_AUDIOBUSIO = 0
30-
CIRCUITPY_PIXELBUF = 0
31+
CIRCUITPY_USB_MIDI = 0
3132

3233
FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-stage/ugame10
3334

shared-bindings/displayio/Group.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,32 @@ displayio_group_t* native_group(mp_obj_t group_obj) {
9090
return MP_OBJ_TO_PTR(native_group);
9191
}
9292

93+
//| .. attribute:: hidden
94+
//|
95+
//| True when the Group and all of it's layers are not visible. When False, the Group's layers
96+
//| are visible if they haven't been hidden.
97+
//|
98+
STATIC mp_obj_t displayio_group_obj_get_hidden(mp_obj_t self_in) {
99+
displayio_group_t *self = native_group(self_in);
100+
return mp_obj_new_bool(common_hal_displayio_group_get_hidden(self));
101+
}
102+
MP_DEFINE_CONST_FUN_OBJ_1(displayio_group_get_hidden_obj, displayio_group_obj_get_hidden);
103+
104+
STATIC mp_obj_t displayio_group_obj_set_hidden(mp_obj_t self_in, mp_obj_t hidden_obj) {
105+
displayio_group_t *self = native_group(self_in);
106+
107+
common_hal_displayio_group_set_hidden(self, mp_obj_is_true(hidden_obj));
108+
return mp_const_none;
109+
}
110+
MP_DEFINE_CONST_FUN_OBJ_2(displayio_group_set_hidden_obj, displayio_group_obj_set_hidden);
111+
112+
const mp_obj_property_t displayio_group_hidden_obj = {
113+
.base.type = &mp_type_property,
114+
.proxy = {(mp_obj_t)&displayio_group_get_hidden_obj,
115+
(mp_obj_t)&displayio_group_set_hidden_obj,
116+
(mp_obj_t)&mp_const_none_obj},
117+
};
118+
93119
//| .. attribute:: scale
94120
//|
95121
//| Scales each pixel within the Group in both directions. For example, when scale=2 each pixel
@@ -305,6 +331,7 @@ STATIC mp_obj_t group_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t valu
305331
}
306332

307333
STATIC const mp_rom_map_elem_t displayio_group_locals_dict_table[] = {
334+
{ MP_ROM_QSTR(MP_QSTR_hidden), MP_ROM_PTR(&displayio_group_hidden_obj) },
308335
{ MP_ROM_QSTR(MP_QSTR_scale), MP_ROM_PTR(&displayio_group_scale_obj) },
309336
{ MP_ROM_QSTR(MP_QSTR_x), MP_ROM_PTR(&displayio_group_x_obj) },
310337
{ MP_ROM_QSTR(MP_QSTR_y), MP_ROM_PTR(&displayio_group_y_obj) },

shared-bindings/displayio/Group.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ displayio_group_t* native_group(mp_obj_t group_obj);
3636
void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y);
3737
uint32_t common_hal_displayio_group_get_scale(displayio_group_t* self);
3838
void common_hal_displayio_group_set_scale(displayio_group_t* self, uint32_t scale);
39+
bool common_hal_displayio_group_get_hidden(displayio_group_t* self);
40+
void common_hal_displayio_group_set_hidden(displayio_group_t* self, bool hidden);
3941
mp_int_t common_hal_displayio_group_get_x(displayio_group_t* self);
4042
void common_hal_displayio_group_set_x(displayio_group_t* self, mp_int_t x);
4143
mp_int_t common_hal_displayio_group_get_y(displayio_group_t* self);

shared-bindings/displayio/TileGrid.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,30 @@ static displayio_tilegrid_t* native_tilegrid(mp_obj_t tilegrid_obj) {
144144
mp_obj_assert_native_inited(native_tilegrid);
145145
return MP_OBJ_TO_PTR(native_tilegrid);
146146
}
147+
//| .. attribute:: hidden
148+
//|
149+
//| True when the TileGrid is hidden. This may be False even when a part of a hidden Group.
150+
//|
151+
STATIC mp_obj_t displayio_tilegrid_obj_get_hidden(mp_obj_t self_in) {
152+
displayio_tilegrid_t *self = native_tilegrid(self_in);
153+
return mp_obj_new_bool(common_hal_displayio_tilegrid_get_hidden(self));
154+
}
155+
MP_DEFINE_CONST_FUN_OBJ_1(displayio_tilegrid_get_hidden_obj, displayio_tilegrid_obj_get_hidden);
156+
157+
STATIC mp_obj_t displayio_tilegrid_obj_set_hidden(mp_obj_t self_in, mp_obj_t hidden_obj) {
158+
displayio_tilegrid_t *self = native_tilegrid(self_in);
159+
160+
common_hal_displayio_tilegrid_set_hidden(self, mp_obj_is_true(hidden_obj));
161+
return mp_const_none;
162+
}
163+
MP_DEFINE_CONST_FUN_OBJ_2(displayio_tilegrid_set_hidden_obj, displayio_tilegrid_obj_set_hidden);
164+
165+
const mp_obj_property_t displayio_tilegrid_hidden_obj = {
166+
.base.type = &mp_type_property,
167+
.proxy = {(mp_obj_t)&displayio_tilegrid_get_hidden_obj,
168+
(mp_obj_t)&displayio_tilegrid_set_hidden_obj,
169+
(mp_obj_t)&mp_const_none_obj},
170+
};
147171

148172
//| .. attribute:: x
149173
//|
@@ -368,6 +392,7 @@ STATIC mp_obj_t tilegrid_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t v
368392

369393
STATIC const mp_rom_map_elem_t displayio_tilegrid_locals_dict_table[] = {
370394
// Properties
395+
{ MP_ROM_QSTR(MP_QSTR_hidden), MP_ROM_PTR(&displayio_tilegrid_hidden_obj) },
371396
{ MP_ROM_QSTR(MP_QSTR_x), MP_ROM_PTR(&displayio_tilegrid_x_obj) },
372397
{ MP_ROM_QSTR(MP_QSTR_y), MP_ROM_PTR(&displayio_tilegrid_y_obj) },
373398
{ MP_ROM_QSTR(MP_QSTR_flip_x), MP_ROM_PTR(&displayio_tilegrid_flip_x_obj) },

shared-bindings/displayio/TileGrid.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_
3636
mp_obj_t pixel_shader, uint16_t width, uint16_t height,
3737
uint16_t tile_width, uint16_t tile_height, uint16_t x, uint16_t y, uint8_t default_tile);
3838

39+
bool common_hal_displayio_tilegrid_get_hidden(displayio_tilegrid_t* self);
40+
void common_hal_displayio_tilegrid_set_hidden(displayio_tilegrid_t* self, bool hidden);
3941
mp_int_t common_hal_displayio_tilegrid_get_x(displayio_tilegrid_t *self);
4042
void common_hal_displayio_tilegrid_set_x(displayio_tilegrid_t *self, mp_int_t x);
4143
mp_int_t common_hal_displayio_tilegrid_get_y(displayio_tilegrid_t *self);

shared-bindings/displayio/__init__.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ typedef enum {
3434
DISPLAY_DATA
3535
} display_byte_type_t;
3636

37-
3837
typedef enum {
3938
CHIP_SELECT_UNTOUCHED,
4039
CHIP_SELECT_TOGGLE_EVERY_BYTE

shared-module/displayio/Display.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
5050
uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin,
5151
uint16_t brightness_command, mp_float_t brightness, bool auto_brightness,
5252
bool single_byte_bounds, bool data_as_commands, bool auto_refresh, uint16_t native_frames_per_second) {
53+
// Turn off auto-refresh as we init.
54+
self->auto_refresh = false;
5355
uint16_t ram_width = 0x100;
5456
uint16_t ram_height = 0x100;
5557
if (single_byte_bounds) {
@@ -64,7 +66,6 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
6466
self->write_ram_command = write_ram_command;
6567
self->brightness_command = brightness_command;
6668
self->auto_brightness = auto_brightness;
67-
self->auto_refresh = auto_refresh;
6869
self->first_manual_refresh = !auto_refresh;
6970
self->data_as_commands = data_as_commands;
7071

@@ -128,6 +129,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
128129
// Set the group after initialization otherwise we may send pixels while we delay in
129130
// initialization.
130131
common_hal_displayio_display_show(self, &circuitpython_splash);
132+
self->auto_refresh = auto_refresh;
131133
}
132134

133135
bool common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group) {

shared-module/displayio/Group.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,47 @@ void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_
3434
displayio_group_construct(self, children, max_size, scale, x, y);
3535
}
3636

37+
bool common_hal_displayio_group_get_hidden(displayio_group_t* self) {
38+
return self->hidden;
39+
}
40+
41+
void common_hal_displayio_group_set_hidden(displayio_group_t* self, bool hidden) {
42+
if (self->hidden == hidden) {
43+
return;
44+
}
45+
self->hidden = hidden;
46+
if (self->hidden_by_parent) {
47+
return;
48+
}
49+
for (size_t i = 0; i < self->size; i++) {
50+
mp_obj_t layer = self->children[i].native;
51+
if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
52+
displayio_tilegrid_set_hidden_by_parent(layer, hidden);
53+
} else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
54+
displayio_group_set_hidden_by_parent(layer, hidden);
55+
}
56+
}
57+
}
58+
59+
void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden) {
60+
if (self->hidden_by_parent == hidden) {
61+
return;
62+
}
63+
self->hidden_by_parent = hidden;
64+
// If we're already hidden, then we're done.
65+
if (self->hidden) {
66+
return;
67+
}
68+
for (size_t i = 0; i < self->size; i++) {
69+
mp_obj_t layer = self->children[i].native;
70+
if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
71+
displayio_tilegrid_set_hidden_by_parent(layer, hidden);
72+
} else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
73+
displayio_group_set_hidden_by_parent(layer, hidden);
74+
}
75+
}
76+
}
77+
3778
uint32_t common_hal_displayio_group_get_scale(displayio_group_t* self) {
3879
return self->scale;
3980
}

shared-module/displayio/Group.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,22 @@ typedef struct {
4242
typedef struct {
4343
mp_obj_base_t base;
4444
displayio_group_child_t* children;
45+
displayio_buffer_transform_t absolute_transform;
46+
displayio_area_t dirty_area; // Catch all for changed area
4547
int16_t x;
4648
int16_t y;
4749
uint16_t scale;
4850
uint16_t size;
4951
uint16_t max_size;
50-
bool item_removed;
51-
bool in_group;
52-
displayio_buffer_transform_t absolute_transform;
53-
displayio_area_t dirty_area; // Catch all for changed area
52+
bool item_removed :1;
53+
bool in_group :1;
54+
bool hidden :1;
55+
bool hidden_by_parent :1;
56+
uint8_t padding :4;
5457
} displayio_group_t;
5558

5659
void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y);
60+
void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden);
5761
bool displayio_group_get_previous_area(displayio_group_t *group, displayio_area_t* area);
5862
bool displayio_group_fill_area(displayio_group_t *group, const _displayio_colorspace_t* colorspace, const displayio_area_t* area, uint32_t* mask, uint32_t *buffer);
5963
void displayio_group_update_transform(displayio_group_t *group, const displayio_buffer_transform_t* parent_transform);

shared-module/displayio/I2CDisplay.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ bool common_hal_displayio_i2cdisplay_bus_free(mp_obj_t obj) {
9797

9898
bool common_hal_displayio_i2cdisplay_begin_transaction(mp_obj_t obj) {
9999
displayio_i2cdisplay_obj_t* self = MP_OBJ_TO_PTR(obj);
100-
return !common_hal_busio_i2c_try_lock(self->bus);
100+
return common_hal_busio_i2c_try_lock(self->bus);
101101
}
102102

103103
void common_hal_displayio_i2cdisplay_send(mp_obj_t obj, display_byte_type_t data_type, display_chip_select_behavior_t chip_select, uint8_t *data, uint32_t data_length) {

shared-module/displayio/TileGrid.c

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,30 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_
6767
self->bitmap = bitmap;
6868
self->pixel_shader = pixel_shader;
6969
self->in_group = false;
70-
self->first_draw = true;
70+
self->hidden = false;
71+
self->hidden_by_parent = false;
72+
self->previous_area.x1 = 0xffff;
73+
self->previous_area.x2 = self->previous_area.x1;
7174
self->flip_x = false;
7275
self->flip_y = false;
7376
self->transpose_xy = false;
7477
}
7578

79+
80+
bool common_hal_displayio_tilegrid_get_hidden(displayio_tilegrid_t* self) {
81+
return self->hidden;
82+
}
83+
84+
void common_hal_displayio_tilegrid_set_hidden(displayio_tilegrid_t* self, bool hidden) {
85+
self->hidden = hidden;
86+
}
87+
88+
void displayio_tilegrid_set_hidden_by_parent(displayio_tilegrid_t *self, bool hidden) {
89+
self->hidden_by_parent = hidden;
90+
}
91+
7692
bool displayio_tilegrid_get_previous_area(displayio_tilegrid_t *self, displayio_area_t* area) {
77-
if (self->first_draw) {
93+
if (self->previous_area.x1 == self->previous_area.x2) {
7894
return false;
7995
}
8096
displayio_area_copy(&self->previous_area, area);
@@ -138,12 +154,10 @@ void displayio_tilegrid_update_transform(displayio_tilegrid_t *self,
138154
self->in_group = absolute_transform != NULL;
139155
self->absolute_transform = absolute_transform;
140156
if (absolute_transform != NULL) {
141-
self->moved = !self->first_draw;
157+
self->moved = true;
142158

143159
_update_current_x(self);
144160
_update_current_y(self);
145-
} else {
146-
self->first_draw = true;
147161
}
148162
}
149163

@@ -155,7 +169,7 @@ void common_hal_displayio_tilegrid_set_x(displayio_tilegrid_t *self, mp_int_t x)
155169
return;
156170
}
157171

158-
self->moved = !self->first_draw;
172+
self->moved = true;
159173

160174
self->x = x;
161175
if (self->absolute_transform != NULL) {
@@ -170,7 +184,7 @@ void common_hal_displayio_tilegrid_set_y(displayio_tilegrid_t *self, mp_int_t y)
170184
if (self->y == y) {
171185
return;
172186
}
173-
self->moved = !self->first_draw;
187+
self->moved = true;
174188
self->y = y;
175189
if (self->absolute_transform != NULL) {
176190
_update_current_y(self);
@@ -306,6 +320,11 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_c
306320
return false;
307321
}
308322

323+
bool hidden = self->hidden || self->hidden_by_parent;
324+
if (hidden) {
325+
return false;
326+
}
327+
309328
displayio_area_t overlap;
310329
if (!displayio_area_compute_overlap(area, &self->current_area, &overlap)) {
311330
return false;
@@ -455,14 +474,17 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_c
455474
}
456475

457476
void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) {
458-
if (self->moved || self->first_draw) {
477+
bool first_draw = self->previous_area.x1 == self->previous_area.x2;
478+
bool hidden = self->hidden || self->hidden_by_parent;
479+
if (!first_draw && hidden) {
480+
self->previous_area.x2 = self->previous_area.x1;
481+
} else if (self->moved || first_draw) {
459482
displayio_area_copy(&self->current_area, &self->previous_area);
460483
}
461484

462485
self->moved = false;
463486
self->full_change = false;
464487
self->partial_change = false;
465-
self->first_draw = false;
466488
if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_palette_type)) {
467489
displayio_palette_finish_refresh(self->pixel_shader);
468490
} else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type)) {
@@ -481,7 +503,17 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) {
481503
}
482504

483505
displayio_area_t* displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *self, displayio_area_t* tail) {
484-
if (self->moved && !self->first_draw) {
506+
bool first_draw = self->previous_area.x1 == self->previous_area.x2;
507+
bool hidden = self->hidden || self->hidden_by_parent;
508+
// Check hidden first because it trumps all other changes.
509+
if (hidden) {
510+
if (!first_draw) {
511+
self->previous_area.next = tail;
512+
return &self->previous_area;
513+
} else {
514+
return tail;
515+
}
516+
} else if (self->moved && !first_draw) {
485517
displayio_area_union(&self->previous_area, &self->current_area, &self->dirty_area);
486518
if (displayio_area_size(&self->dirty_area) <= 2U * self->pixel_width * self->pixel_height) {
487519
self->dirty_area.next = tail;
@@ -512,7 +544,7 @@ displayio_area_t* displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *sel
512544
displayio_palette_needs_refresh(self->pixel_shader)) ||
513545
(MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type) &&
514546
displayio_colorconverter_needs_refresh(self->pixel_shader));
515-
if (self->full_change || self->first_draw) {
547+
if (self->full_change || first_draw) {
516548
self->current_area.next = tail;
517549
return &self->current_area;
518550
}

shared-module/displayio/TileGrid.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,21 @@ typedef struct {
5555
displayio_area_t dirty_area; // Stored as a relative area until the refresh area is fetched.
5656
displayio_area_t previous_area; // Stored as an absolute area.
5757
displayio_area_t current_area; // Stored as an absolute area so it applies across frames.
58-
bool partial_change;
59-
bool full_change;
60-
bool first_draw;
61-
bool moved;
62-
bool inline_tiles;
63-
bool in_group;
64-
bool flip_x;
65-
bool flip_y;
66-
bool transpose_xy;
58+
bool partial_change :1;
59+
bool full_change :1;
60+
bool moved :1;
61+
bool inline_tiles :1;
62+
bool in_group :1;
63+
bool flip_x :1;
64+
bool flip_y :1;
65+
bool transpose_xy :1;
66+
bool hidden :1;
67+
bool hidden_by_parent :1;
68+
uint8_t padding :6;
6769
} displayio_tilegrid_t;
6870

71+
void displayio_tilegrid_set_hidden_by_parent(displayio_tilegrid_t *self, bool hidden);
72+
6973
// Updating the screen is a three stage process.
7074

7175
// The first stage is used to determine i

0 commit comments

Comments
 (0)