mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-02-18 19:03:16 +00:00
107 lines
3.0 KiB
C
107 lines
3.0 KiB
C
#include "check.h"
|
|
#include "esp_lvgl_port.h"
|
|
#include "gui_i.h"
|
|
#include "log.h"
|
|
#include "services/gui/widgets/widgets.h"
|
|
#include "services/loader/loader.h"
|
|
|
|
#define TAG "gui"
|
|
|
|
static lv_obj_t* screen_with_top_bar(lv_obj_t* parent) {
|
|
lv_obj_set_style_bg_blacken(parent);
|
|
|
|
lv_obj_t* vertical_container = lv_obj_create(parent);
|
|
lv_obj_set_size(vertical_container, LV_PCT(100), LV_PCT(100));
|
|
lv_obj_set_flex_flow(vertical_container, LV_FLEX_FLOW_COLUMN);
|
|
lv_obj_set_style_no_padding(vertical_container);
|
|
lv_obj_set_style_bg_blacken(vertical_container);
|
|
|
|
top_bar(vertical_container);
|
|
|
|
lv_obj_t* child_container = lv_obj_create(vertical_container);
|
|
lv_obj_set_width(child_container, LV_PCT(100));
|
|
lv_obj_set_flex_grow(child_container, 1);
|
|
lv_obj_set_style_no_padding(vertical_container);
|
|
lv_obj_set_style_bg_blacken(vertical_container);
|
|
|
|
return child_container;
|
|
}
|
|
|
|
static lv_obj_t* screen_with_top_bar_and_toolbar(lv_obj_t* parent) {
|
|
lv_obj_set_style_bg_blacken(parent);
|
|
|
|
lv_obj_t* vertical_container = lv_obj_create(parent);
|
|
lv_obj_set_size(vertical_container, LV_PCT(100), LV_PCT(100));
|
|
lv_obj_set_flex_flow(vertical_container, LV_FLEX_FLOW_COLUMN);
|
|
lv_obj_set_style_no_padding(vertical_container);
|
|
lv_obj_set_style_bg_blacken(vertical_container);
|
|
|
|
top_bar(vertical_container);
|
|
|
|
const AppManifest* manifest = loader_get_current_app();
|
|
if (manifest != NULL) {
|
|
toolbar(vertical_container, TOP_BAR_HEIGHT, manifest);
|
|
}
|
|
|
|
lv_obj_t* spacer = lv_obj_create(vertical_container);
|
|
lv_obj_set_size(spacer, 2, 2);
|
|
lv_obj_set_style_bg_blacken(spacer);
|
|
|
|
lv_obj_t* child_container = lv_obj_create(vertical_container);
|
|
lv_obj_set_width(child_container, LV_PCT(100));
|
|
lv_obj_set_flex_grow(child_container, 1);
|
|
lv_obj_set_style_no_padding(vertical_container);
|
|
lv_obj_set_style_bg_blacken(vertical_container);
|
|
|
|
return child_container;
|
|
}
|
|
|
|
static bool gui_redraw_window(Gui* gui) {
|
|
ViewPort* view_port = gui->layers[GuiLayerWindow];
|
|
if (view_port) {
|
|
lv_obj_t* container = screen_with_top_bar_and_toolbar(gui->lvgl_parent);
|
|
view_port_draw(view_port, container);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static bool gui_redraw_desktop(Gui* gui) {
|
|
ViewPort* view_port = gui->layers[GuiLayerDesktop];
|
|
if (view_port) {
|
|
lv_obj_t* container = screen_with_top_bar(gui->lvgl_parent);
|
|
view_port_draw(view_port, container);
|
|
return true;
|
|
} else {
|
|
FURI_LOG_E(TAG, "no desktop layer found");
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool gui_redraw_fs(Gui* gui) {
|
|
ViewPort* view_port = gui->layers[GuiLayerFullscreen];
|
|
if (view_port) {
|
|
view_port_draw(view_port, gui->lvgl_parent);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void gui_redraw(Gui* gui) {
|
|
furi_assert(gui);
|
|
|
|
furi_check(lvgl_port_lock(100));
|
|
lv_obj_clean(gui->lvgl_parent);
|
|
|
|
if (!gui_redraw_fs(gui)) {
|
|
if (!gui_redraw_window(gui)) {
|
|
gui_redraw_desktop(gui);
|
|
}
|
|
}
|
|
|
|
lvgl_port_unlock();
|
|
}
|