Login
1 branch 0 tags
Ben (Desktop/Arch) Minor optimizations/cleanup 6c7b6a9 1 month ago 38 Commits
moon / firmware / src / screens / games / breakout_screen.c
#include "breakout_screen.h"
#include "../../topbar.h"
#include <stdlib.h>

static void back_btn_event_cb(lv_event_t *e) {
    lv_event_code_t code = lv_event_get_code(e);
    if (code == LV_EVENT_CLICKED) {
        navigate_to(SCREEN_GAMES);
    }
}

static void cancel_event_cb(lv_event_t *e) {
    (void)e;
    navigate_to(SCREEN_GAMES);
}

ui_state_t setup_breakout_screen(void) {
    breakout_screen_state_t *state = calloc(1, sizeof(breakout_screen_state_t));

    topbar_set_title("Breakout");

    // Create subtitle label centered (offset for topbar)
    state->subtitle_label = lv_label_create(lv_screen_active());
    lv_label_set_text(state->subtitle_label, "Coming Soon");
    lv_obj_align(state->subtitle_label, LV_ALIGN_CENTER, 0, TOPBAR_H / 2);

    // Create back button at bottom
    state->back_btn = lv_button_create(lv_screen_active());
    lv_obj_align(state->back_btn, LV_ALIGN_BOTTOM_MID, 0, -8);
    lv_obj_add_event_cb(state->back_btn, back_btn_event_cb, LV_EVENT_CLICKED, NULL);
    lv_obj_add_event_cb(state->back_btn, cancel_event_cb, LV_EVENT_CANCEL, NULL);
    lv_obj_set_size(state->back_btn, 80, 26);
    lv_obj_set_style_bg_color(state->back_btn, lv_color_hex(0x0288D1), 0);

    lv_obj_t *back_label = lv_label_create(state->back_btn);
    lv_label_set_text(back_label, "Back");
    lv_obj_center(back_label);

    // Add button to group for keyboard navigation
    lv_group_add_obj(lv_group_get_default(), state->back_btn);
    lv_group_focus_obj(state->back_btn);

    return (ui_state_t){.type = SCREEN_BREAKOUT, .breakout = state};
}

void free_breakout_screen(breakout_screen_state_t *state) {
    if (!state) return;

    // Remove from group before deleting
    lv_group_remove_obj(state->back_btn);

    // Delete all widgets
    lv_obj_delete(state->subtitle_label);
    lv_obj_delete(state->back_btn);

    free(state);
}

void update_breakout_screen(breakout_screen_state_t *state) {
    (void)state;  // LVGL handles updates via timer
}