Login
1 branch 0 tags
Ben (Desktop/Arch) Added clang-format 2f88780 1 month ago 66 Commits
moon / src / ui.h
#pragma once
#include <stdint.h>
#include "lvgl.h"
#include "playlist.h"
#include "storage.h"

// Screen types enum
typedef enum {
	SCREEN_NONE = 0,
	SCREEN_HOME,
	SCREEN_FILES,
	SCREEN_NOW_PLAYING,
	SCREEN_QUEUE_DIALOG,
	SCREEN_AUDIOBOOKS,
	SCREEN_MUSIC,
	SCREEN_SETTINGS,
	SCREEN_USB,
} 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

	// Queue dialog context
	char pending_path[256];
	playlist_type_t pending_type;
	screen_type_t return_screen;
	char return_cwd[STORAGE_MAX_PATH];
	char return_focus[STORAGE_MAX_NAME];
} app_state_t;

#ifdef ESP_PLATFORM
#include "esp_log.h"
#endif

#ifndef ESP_PLATFORM
#define ESP_LOGI(_TAG_, ...) fprintf(stderr, _TAG_ ": " __VA_ARGS__)
#endif

// Forward declarations for screen state types
typedef struct home_screen_state home_screen_state_t;
typedef struct files_screen_state files_screen_state_t;
typedef struct now_playing_screen_state now_playing_screen_state_t;
typedef struct queue_dialog_screen_state queue_dialog_screen_state_t;
typedef struct audiobooks_screen_state audiobooks_screen_state_t;
typedef struct music_screen_state music_screen_state_t;
typedef struct settings_screen_state settings_screen_state_t;
typedef struct usb_screen_state usb_screen_state_t;

// Tagged union for current screen state
typedef struct {
	screen_type_t type;
	union {
		home_screen_state_t* home;
		files_screen_state_t* files;
		now_playing_screen_state_t* now_playing;
		queue_dialog_screen_state_t* queue_dialog;
		audiobooks_screen_state_t* audiobooks;
		music_screen_state_t* music;
		settings_screen_state_t* settings;
		usb_screen_state_t* usb;
	};
} 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);