From 961a234628badb64f90926e84702cf195fc2622b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sun, 27 Jun 2021 14:20:47 +0200 Subject: [PATCH] feat: add gui container info to store window create data --- lib-gui/include/gui_window_info.h | 26 ++++++++++++++++ lib-gui/src/gui_window_info.c | 51 +++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 lib-gui/include/gui_window_info.h create mode 100644 lib-gui/src/gui_window_info.c diff --git a/lib-gui/include/gui_window_info.h b/lib-gui/include/gui_window_info.h new file mode 100644 index 0000000..9fc21a0 --- /dev/null +++ b/lib-gui/include/gui_window_info.h @@ -0,0 +1,26 @@ +#ifndef __GUI_WINDOW_H__ +#define __GUI_WINDOW_H__ + +#include +#include "gui.h" +#include "gui_container_info.h" + +typedef void *(*construct_window_structure_fn)(window_t *window, void *state); +typedef bool (*gui_loop_running_fn)(void *state); +typedef void (*gui_loop_job_fn)(void *state); + +typedef struct { + uint32_t containers_count; + construct_window_structure_fn construct; + + gui_container_info_t *containers; +} window_info_t; + +bool gui_window_init_and_loop(gui_t *gui, void *state, window_info_t info, + gui_loop_running_fn loop_running, + gui_loop_job_fn job); + +void gui_window_start_loop(gui_t * gui, gui_loop_running_fn loop_running, + gui_loop_job_fn job, void *loop_state); + +#endif // __GUI_WINDOW_H__ diff --git a/lib-gui/src/gui_window_info.c b/lib-gui/src/gui_window_info.c new file mode 100644 index 0000000..82c7e82 --- /dev/null +++ b/lib-gui/src/gui_window_info.c @@ -0,0 +1,51 @@ +#include "gui_window_info.h" +#include "gui.h" +#include "gui_container_info.h" + +bool gui_window_init_and_loop(gui_t *gui, void *state, window_info_t info, + gui_loop_running_fn loop_running, + gui_loop_job_fn job) { + container_t containers[info.containers_count]; + window_t window = gui_window_create(containers, info.containers_count); + + uint32_t components_count = 0; + for (int i = 0; i < info.containers_count; i++) { + gui_container_info_t cinfo = info.containers[i]; + components_count += gui_container_info_get_components_count(cinfo); + } + + component_t components[components_count]; + component_t *component_ptr = components; + + for (int i = 0; i < info.containers_count; i++) { + gui_container_info_t cinfo = info.containers[i]; + + uint16_t components_count = gui_container_info_get_components_count(cinfo); + container_t container = gui_container_info_create(cinfo, component_ptr, components_count); + gui_window_add_container(&window, container); + + component_ptr += components_count; + } + + void *loop_state = info.construct(&window, state); + + window_t *prev_active_window = gui->active_window; + + gui->active_window = &window; + gui_window_start_loop(gui, loop_running, job, loop_state); + gui->active_window = prev_active_window; + + return true; +} + +void gui_window_start_loop(gui_t *gui, gui_loop_running_fn loop_running, + gui_loop_job_fn job, void *loop_state) { + while (loop_running(loop_state)) { + commands_check_input(gui->commands); + gui_update(gui); + gui_render(gui); + rgb_led_update(gui->pheripherals->rgb_leds); + + job(loop_state); + } +} -- 2.48.1