Login
1 branch 0 tags
Ben (Desktop/Arch) Removed list border radius 1690c43 1 month ago 39 Commits
moon / firmware / src / ui.h
#pragma once
#include "lvgl.h"
#include "storage.h"
#include <stdint.h>

// Screen types enum
typedef enum {
  SCREEN_NONE = 0,
  SCREEN_HOME,
  SCREEN_DEMO,
  SCREEN_GAMES,
  SCREEN_BREAKOUT,
  SCREEN_FILES,
  SCREEN_PLAYER,
  SCREEN_AUDIOBOOKS,
  SCREEN_AUDIOBOOK_PLAYER,
  SCREEN_MUSIC,
  SCREEN_SETTINGS,
} screen_type_t;

// Global app config (available to all screens)
typedef struct {
  uint8_t volume;             // 0-100
  uint8_t brightness;         // 0-100
  char last_played_path[256]; // Path of last played file for navigation
  char audiobook_dir[256];    // Non-empty = directory playback mode
} app_state_t;

// Forward declarations for screen state types
typedef struct home_screen_state home_screen_state_t;
typedef struct demo_screen_state demo_screen_state_t;
typedef struct games_screen_state games_screen_state_t;
typedef struct breakout_screen_state breakout_screen_state_t;
typedef struct files_screen_state files_screen_state_t;
typedef struct player_screen_state player_screen_state_t;
typedef struct audiobooks_screen_state audiobooks_screen_state_t;
typedef struct audiobook_player_screen_state audiobook_player_screen_state_t;
typedef struct music_screen_state music_screen_state_t;
typedef struct settings_screen_state settings_screen_state_t;

// Tagged union for current screen state
typedef struct {
  screen_type_t type;
  union {
    home_screen_state_t *home;
    demo_screen_state_t *demo;
    games_screen_state_t *games;
    breakout_screen_state_t *breakout;
    files_screen_state_t *files;
    player_screen_state_t *player;
    audiobooks_screen_state_t *audiobooks;
    audiobook_player_screen_state_t *audiobook_player;
    music_screen_state_t *music;
    settings_screen_state_t *settings;
  };
} ui_state_t;

// Globals
extern app_state_t app_state;
extern ui_state_t ui_state;
extern char string_buffer[256];

// Dispatch functions
ui_state_t setup_screen(screen_type_t type);
void free_screen(void);
void update_screen(void);

// Navigation helper
#define navigate_to(screen_type)                                               \
  do {                                                                         \
    free_screen();                                                             \
    ui_state = setup_screen(screen_type);                                      \
  } while (0)

lv_obj_t *bvs_list_add_button(lv_obj_t *list, const void *icon,
                              const char *txt);
lv_obj_t *bvs_list_create(void);
void bvs_list_clear(lv_obj_t *list);

// File browser utilities shared by files/music/audiobooks screens
void path_parent(const char *path, char *parent, size_t parent_size,
                 char *basename, size_t basename_size);
int entry_name_cmp(const void *a, const void *b);
int get_sorted_entries(const char *dir, storage_entry_t *entries,
                       int max_entries);