@@ 0,0 1,177 @@
+#include "window_initial.h"
+#include "display_utils.h"
+#include "font.h"
+#include "gui.h"
+
+#include "gui_window_info.h"
+#include "gui_container_info.h"
+#include "gui_list_commands.h"
+#include "input.h"
+#include "logger.h"
+#include "renderer.h"
+
+#include <stdbool.h>
+
+#define INITIAL_WINDOW_LOCAL_INDEX 0
+#define INITIAL_WINDOW_MOUNT_INDEX 1
+#define INITIAL_WINDOW_OPTIONS_INDEX 2
+#define INITIAL_WINDOW_EXIT_INDEX 3
+
+typedef struct {
+ bool running;
+ gui_t *gui;
+
+ container_t *list_container;
+ window_t *initial_window;
+
+ font_t font;
+
+ gui_list_command_state_t click_state;
+} initial_window_state_t;
+
+static bool initial_window_list_render_item(void *state, uint32_t index,
+ renderer_t *renderer, int16_t beg_x,
+ int16_t beg_y, display_pixel_t color);
+
+static void initial_window_item_clicked(container_t *container, void *state, uint32_t selected_index);
+
+static void *initial_window_construct(window_t *window, void *state);
+static bool initial_window_running(void *state);
+static void initial_window_job(void *state);
+
+gui_container_info_t initial_window_container_info = {
+ .type = CONT_TABLE,
+ .payload.list = {.item_height = 16,
+ .render_item_fn = initial_window_list_render_item,
+ .render_header_fn = NULL}};
+
+window_info_t initial_window_info = {
+ .containers_count = 1,
+ .containers = &initial_window_container_info,
+ .construct = initial_window_construct
+};
+
+bool window_initial_open(gui_t *gui, font_t font) {
+ logger_t *logger = gui->logger;
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Opening initial window");
+
+ initial_window_state_t state = {
+ .running = true,
+ .gui = gui,
+ .font = font,
+ };
+
+ uint16_t commands_state = commands_save_state(gui->commands);
+ bool success = gui_window_init_and_loop(gui, &state, initial_window_info, initial_window_running, initial_window_job);
+ commands_restore_state(gui->commands, commands_state);
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Initial window closed");
+
+ return success;
+}
+
+static bool initial_window_list_render_item(void *state, uint32_t index,
+ renderer_t *renderer, int16_t beg_x,
+ int16_t beg_y, display_pixel_t color) {
+ initial_window_state_t *istate = (initial_window_state_t *)state;
+ char *data;
+ switch (index) {
+ case INITIAL_WINDOW_LOCAL_INDEX:
+ data = "ROOT FILESYSTEM";
+ break;
+ case INITIAL_WINDOW_MOUNT_INDEX:
+ data = "MOUNTABLE DEVICES";
+ break;
+ case INITIAL_WINDOW_OPTIONS_INDEX:
+ data = "OPTIONS";
+ break;
+ case INITIAL_WINDOW_EXIT_INDEX:
+ data = "EXIT";
+ break;
+ default:
+ return false;
+ }
+
+ renderer_write_string(renderer, beg_x, beg_y, 0, &istate->font, data, color);
+
+ return true;
+}
+
+static void command_handler_exit(void *state, int amount) {
+ initial_window_state_t *istate = (initial_window_state_t *)state;
+ istate->running = false;
+}
+
+static void *initial_window_construct(window_t *window, void *state) {
+ initial_window_state_t *istate = (initial_window_state_t*)state;
+ logger_t *logger = istate->gui->logger;
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Constructing initial window");
+ istate->list_container = &window->containers[0];
+ istate->initial_window = window;
+
+ istate->click_state.container = istate->list_container;
+ istate->click_state.state = state;
+ istate->click_state.clicked = initial_window_item_clicked;
+ istate->click_state.gui = istate->gui;
+ istate->click_state.window = window;
+
+ // containers init
+ gui_container_info_init(istate->list_container, istate, 4, 5, 5);
+ istate->list_container->width = istate->gui->size.x - 20;
+ istate->list_container->height = istate->gui->size.y - 20;
+
+ // commands register
+ gui_list_commands_register(istate->gui->commands, &istate->click_state);
+ commands_register(istate->gui->commands, IN_KEYBOARD, 'e', command_handler_exit, state);
+
+ return state;
+}
+
+static bool initial_window_running(void *state) {
+ initial_window_state_t *initial_window_state = (initial_window_state_t*)state;
+ return initial_window_state->running;
+}
+
+static void initial_window_job(void *state) {
+ initial_window_state_t *initial_window_state =
+ (initial_window_state_t *)state;
+
+ initial_window_state->list_container->inner.list.scroll_x = 0;
+ // do nothing?
+}
+
+static void initial_window_item_clicked(container_t *container, void *state,
+ uint32_t selected_index) {
+ initial_window_state_t *istate = (initial_window_state_t *)state;
+ logger_t *logger = istate->gui->logger;
+
+ if (istate->gui->active_window != istate->initial_window) {
+ return;
+ }
+
+ switch (selected_index) {
+ case INITIAL_WINDOW_LOCAL_INDEX:
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Clicked local root filesystem");
+ break;
+ case INITIAL_WINDOW_MOUNT_INDEX:
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Clicked mount");
+ break;
+ case INITIAL_WINDOW_OPTIONS_INDEX:
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Clicked options");
+ break;
+ case INITIAL_WINDOW_EXIT_INDEX:
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Clicked exit");
+ istate->running = false;
+ break;
+ default:
+ logger_info(logger, __FILE__, __FUNCTION__, __LINE__,
+ "Clicked unknown item in initial window");
+ break;
+ }
+}