GUI: hide canvas inside
This commit is contained in:
		| @@ -4,6 +4,16 @@ | |||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <flipper.h> | #include <flipper.h> | ||||||
|  |  | ||||||
|  | typedef struct { | ||||||
|  |     CanvasApi api; | ||||||
|  |  | ||||||
|  |     u8g2_t fb; | ||||||
|  |     uint8_t offset_x; | ||||||
|  |     uint8_t offset_y; | ||||||
|  |     uint8_t width; | ||||||
|  |     uint8_t height; | ||||||
|  | } Canvas; | ||||||
|  |  | ||||||
| uint8_t canvas_width(CanvasApi* api); | uint8_t canvas_width(CanvasApi* api); | ||||||
| uint8_t canvas_height(CanvasApi* api); | uint8_t canvas_height(CanvasApi* api); | ||||||
| void canvas_clear(CanvasApi* api); | void canvas_clear(CanvasApi* api); | ||||||
| @@ -15,30 +25,26 @@ uint8_t u8g2_gpio_and_delay_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, vo | |||||||
| uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr); | uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr); | ||||||
|  |  | ||||||
| CanvasApi* canvas_api_init() { | CanvasApi* canvas_api_init() { | ||||||
|     CanvasApi* api = furi_alloc(sizeof(CanvasApi)); |     Canvas* canvas = furi_alloc(sizeof(Canvas)); | ||||||
|  |  | ||||||
|     u8g2_Setup_st7565_erc12864_alt_f( |     u8g2_Setup_st7565_erc12864_alt_f( | ||||||
|         &api->canvas.fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32); |         &canvas->fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32); | ||||||
|  |  | ||||||
|     // send init sequence to the display, display is in sleep mode after this |     // send init sequence to the display, display is in sleep mode after this | ||||||
|     u8g2_InitDisplay(&api->canvas.fb); |     u8g2_InitDisplay(&canvas->fb); | ||||||
|     u8g2_SetContrast(&api->canvas.fb, 36); |     u8g2_SetContrast(&canvas->fb, 36); | ||||||
|  |  | ||||||
|     u8g2_SetPowerSave(&api->canvas.fb, 0); // wake up display |     u8g2_SetPowerSave(&canvas->fb, 0); // wake up display | ||||||
|     u8g2_SendBuffer(&api->canvas.fb); |     u8g2_SendBuffer(&canvas->fb); | ||||||
|  |  | ||||||
|     api->width = canvas_width; |     canvas->api.width = canvas_width; | ||||||
|     api->height = canvas_height; |     canvas->api.height = canvas_height; | ||||||
|     api->clear = canvas_clear; |     canvas->api.clear = canvas_clear; | ||||||
|     api->set_color = canvas_color_set; |     canvas->api.set_color = canvas_color_set; | ||||||
|     api->set_font = canvas_font_set; |     canvas->api.set_font = canvas_font_set; | ||||||
|     api->draw_str = canvas_str_draw; |     canvas->api.draw_str = canvas_str_draw; | ||||||
|  |  | ||||||
|     api->fonts = furi_alloc(sizeof(Fonts)); |     return (CanvasApi*)canvas; | ||||||
|     api->fonts->primary = u8g2_font_Born2bSportyV2_tr; |  | ||||||
|     api->fonts->secondary = u8g2_font_HelvetiPixel_tr; |  | ||||||
|  |  | ||||||
|     return api; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void canvas_api_free(CanvasApi* api) { | void canvas_api_free(CanvasApi* api) { | ||||||
| @@ -48,9 +54,9 @@ void canvas_api_free(CanvasApi* api) { | |||||||
|  |  | ||||||
| void canvas_commit(CanvasApi* api) { | void canvas_commit(CanvasApi* api) { | ||||||
|     assert(api); |     assert(api); | ||||||
|  |     Canvas* canvas = (Canvas *)api; | ||||||
|     u8g2_SetPowerSave(&api->canvas.fb, 0); // wake up display |     u8g2_SetPowerSave(&canvas->fb, 0); // wake up display | ||||||
|     u8g2_SendBuffer(&api->canvas.fb); |     u8g2_SendBuffer(&canvas->fb); | ||||||
| } | } | ||||||
|  |  | ||||||
| void canvas_frame_set( | void canvas_frame_set( | ||||||
| @@ -60,43 +66,54 @@ void canvas_frame_set( | |||||||
|     uint8_t width, |     uint8_t width, | ||||||
|     uint8_t height) { |     uint8_t height) { | ||||||
|     assert(api); |     assert(api); | ||||||
|     api->canvas.offset_x = offset_x; |     Canvas* canvas = (Canvas*)api; | ||||||
|     api->canvas.offset_y = offset_y; |     canvas->offset_x = offset_x; | ||||||
|     api->canvas.width = width; |     canvas->offset_y = offset_y; | ||||||
|     api->canvas.height = height; |     canvas->width = width; | ||||||
|  |     canvas->height = height; | ||||||
| } | } | ||||||
|  |  | ||||||
| uint8_t canvas_width(CanvasApi* api) { | uint8_t canvas_width(CanvasApi* api) { | ||||||
|     assert(api); |     assert(api); | ||||||
|  |     Canvas* canvas = (Canvas *)api; | ||||||
|     return api->canvas.width; |     return canvas->width; | ||||||
| } | } | ||||||
|  |  | ||||||
| uint8_t canvas_height(CanvasApi* api) { | uint8_t canvas_height(CanvasApi* api) { | ||||||
|     assert(api); |     assert(api); | ||||||
|  |     Canvas* canvas = (Canvas *)api; | ||||||
|     return api->canvas.height; |     return canvas->height; | ||||||
| } | } | ||||||
|  |  | ||||||
| void canvas_clear(CanvasApi* api) { | void canvas_clear(CanvasApi* api) { | ||||||
|     assert(api); |     assert(api); | ||||||
|     u8g2_ClearBuffer(&api->canvas.fb); |     Canvas* canvas = (Canvas *)api; | ||||||
|  |     u8g2_ClearBuffer(&canvas->fb); | ||||||
| } | } | ||||||
|  |  | ||||||
| void canvas_color_set(CanvasApi* api, Color color) { | void canvas_color_set(CanvasApi* api, Color color) { | ||||||
|     assert(api); |     assert(api); | ||||||
|     u8g2_SetDrawColor(&api->canvas.fb, color); |     Canvas* canvas = (Canvas *)api; | ||||||
|  |     u8g2_SetDrawColor(&canvas->fb, color); | ||||||
| } | } | ||||||
|  |  | ||||||
| void canvas_font_set(CanvasApi* api, Font font) { | void canvas_font_set(CanvasApi* api, Font font) { | ||||||
|     assert(api); |     assert(api); | ||||||
|     u8g2_SetFontMode(&api->canvas.fb, 1); |     Canvas* canvas = (Canvas *)api; | ||||||
|     u8g2_SetFont(&api->canvas.fb, font); |     u8g2_SetFontMode(&canvas->fb, 1); | ||||||
|  |     if (font == FontPrimary) { | ||||||
|  |         u8g2_SetFont(&canvas->fb, u8g2_font_Born2bSportyV2_tr); | ||||||
|  |     } else if (font == FontSecondary) { | ||||||
|  |         u8g2_SetFont(&canvas->fb, u8g2_font_HelvetiPixel_tr); | ||||||
|  |     } else { | ||||||
|  |         assert(0); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void canvas_str_draw(CanvasApi* api, uint8_t x, uint8_t y, const char* str) { | void canvas_str_draw(CanvasApi* api, uint8_t x, uint8_t y, const char* str) { | ||||||
|     assert(api); |     assert(api); | ||||||
|     x += api->canvas.offset_x; |     Canvas* canvas = (Canvas *)api; | ||||||
|     y += api->canvas.offset_y; |     x += canvas->offset_x; | ||||||
|     u8g2_DrawStr(&api->canvas.fb, x, y, str); |     y += canvas->offset_y; | ||||||
|  |     u8g2_DrawStr(&canvas->fb, x, y, str); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,30 +8,13 @@ typedef enum { | |||||||
|     ColorBlack = 0x01, |     ColorBlack = 0x01, | ||||||
| } Color; | } Color; | ||||||
|  |  | ||||||
| typedef const uint8_t* Font; | typedef enum { | ||||||
|  |     FontPrimary = 0x00, | ||||||
| typedef struct { |     FontSecondary = 0x01, | ||||||
|     Font primary; | } Font; | ||||||
|     Font secondary; |  | ||||||
| } Fonts; |  | ||||||
|  |  | ||||||
| struct _CanvasApi; |  | ||||||
|  |  | ||||||
| typedef struct _CanvasApi CanvasApi; |  | ||||||
|  |  | ||||||
| // Canvas is private but we need its declaration here |  | ||||||
| typedef struct { |  | ||||||
|     u8g2_t fb; |  | ||||||
|     uint8_t offset_x; |  | ||||||
|     uint8_t offset_y; |  | ||||||
|     uint8_t width; |  | ||||||
|     uint8_t height; |  | ||||||
| } Canvas; |  | ||||||
|  |  | ||||||
| struct _CanvasApi { |  | ||||||
|     Canvas canvas; |  | ||||||
|     Fonts* fonts; |  | ||||||
|  |  | ||||||
|  | typedef struct CanvasApi CanvasApi; | ||||||
|  | struct CanvasApi { | ||||||
|     uint8_t (*width)(CanvasApi* canvas); |     uint8_t (*width)(CanvasApi* canvas); | ||||||
|     uint8_t (*height)(CanvasApi* canvas); |     uint8_t (*height)(CanvasApi* canvas); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -87,13 +87,13 @@ void menu_widget_callback(CanvasApi* canvas, void* context) { | |||||||
|     if(!menu->current) { |     if(!menu->current) { | ||||||
|         canvas->clear(canvas); |         canvas->clear(canvas); | ||||||
|         canvas->set_color(canvas, ColorBlack); |         canvas->set_color(canvas, ColorBlack); | ||||||
|         canvas->set_font(canvas, canvas->fonts->primary); |         canvas->set_font(canvas, FontPrimary); | ||||||
|         canvas->draw_str(canvas, 2, 32, "Idle Screen"); |         canvas->draw_str(canvas, 2, 32, "Idle Screen"); | ||||||
|     } else { |     } else { | ||||||
|         MenuItemArray_t* items = menu_item_get_subitems(menu->current); |         MenuItemArray_t* items = menu_item_get_subitems(menu->current); | ||||||
|         canvas->clear(canvas); |         canvas->clear(canvas); | ||||||
|         canvas->set_color(canvas, ColorBlack); |         canvas->set_color(canvas, ColorBlack); | ||||||
|         canvas->set_font(canvas, canvas->fonts->secondary); |         canvas->set_font(canvas, FontSecondary); | ||||||
|         for(size_t i = 0; i < 5; i++) { |         for(size_t i = 0; i < 5; i++) { | ||||||
|             size_t shift_position = i + menu->position + MenuItemArray_size(*items) - 2; |             size_t shift_position = i + menu->position + MenuItemArray_size(*items) - 2; | ||||||
|             shift_position = shift_position % (MenuItemArray_size(*items)); |             shift_position = shift_position % (MenuItemArray_size(*items)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user