From 74c0cffb8d74ef8aa5bd0c6ab7489e986e4c210f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Mon, 28 Jun 2021 17:18:54 +0200 Subject: [PATCH] feat: add file executing and folder browsing --- file-browser/src/window_browser.c | 39 +++++++++++++++++++++++++++++-- lib-gui/src/gui_list_container.c | 1 + 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/file-browser/src/window_browser.c b/file-browser/src/window_browser.c index 004758e..cb252e2 100644 --- a/file-browser/src/window_browser.c +++ b/file-browser/src/window_browser.c @@ -1,6 +1,7 @@ #include "window_browser.h" #include "display_utils.h" #include "file_access.h" +#include "file_open.h" #include "gui.h" #include "gui_component_text.h" #include "gui_container_info.h" @@ -9,6 +10,7 @@ #include "gui_window_info.h" #include "input.h" #include "logger.h" +#include "path.h" #include "renderer.h" typedef struct { @@ -143,7 +145,36 @@ static void browser_window_item_clicked(container_t *container, void *state, browser_window_state_t *bstate = (browser_window_state_t *)state; logger_t *logger = bstate->gui->logger; - logger_info(logger, __FILE__, __FUNCTION__, __LINE__, "Item was clicked."); + file_t current_file = bstate->current_directory->files[selected_index]; + + if (current_file.type == FT_FILE) { + // open + logger_info(logger, __FILE__, __FUNCTION__, __LINE__, "Opening file %s", + current_file.name); + file_operation_error_t error = file_open(¤t_file, browser_exec_options, bstate->state); + if (error != FILOPER_SUCCESS) { + fileaccess_log_error(logger, error); + } else { + logger_info(logger, __FILE__, __FUNCTION__, __LINE__, "Successfully returned from executing file."); + } + } else if (current_file.type == FT_FOLDER || current_file.type == FT_OTHER) { + char new_dir_path[path_join_memory_size(bstate->current_directory->path, current_file.name)]; + path_join(bstate->current_directory->path, current_file.name, new_dir_path); + + directory_or_error_t data = fileaccess_directory_list(bstate->state, new_dir_path); + if (data.error) { + // show error + fileaccess_log_error(logger, data.payload.error); + } else { + fileaccess_directory_close(bstate->state, bstate->current_directory); + bstate->current_directory = data.payload.directory; + bstate->text_state.line = bstate->current_directory->path; + + gui_list_container_set_state(bstate->list_container, bstate, bstate->current_directory->files_count); + + logger_info(logger, __FILE__, __FUNCTION__, __LINE__, "Opening directory %s", bstate->current_directory->path); + } + } } static bool browser_window_list_render_item(void *state, uint32_t index, @@ -151,6 +182,11 @@ static bool browser_window_list_render_item(void *state, uint32_t index, int16_t beg_y, display_pixel_t color) { browser_window_state_t *bstate = (browser_window_state_t *)state; + logger_t *logger = bstate->gui->logger; + if (index >= bstate->current_directory->files_count) { + logger_error(logger, __FILE__, __FUNCTION__, __LINE__, "Tried to reach item out of index"); + return false; + } file_t file = bstate->current_directory->files[index]; renderer_write_string(renderer, beg_x, beg_y, 0, bstate->font, file.name, color); @@ -161,7 +197,6 @@ static bool browser_window_list_render_header(void *state, uint32_t index, renderer_t *renderer, int16_t beg_x, int16_t beg_y, display_pixel_t color) { - browser_window_state_t *bstate = (browser_window_state_t *)state; renderer_write_string(renderer, beg_x, beg_y, 0, bstate->font, "This is header", color); return true; diff --git a/lib-gui/src/gui_list_container.c b/lib-gui/src/gui_list_container.c index e784d23..7821d4f 100644 --- a/lib-gui/src/gui_list_container.c +++ b/lib-gui/src/gui_list_container.c @@ -46,6 +46,7 @@ bool gui_list_container_set_state(container_t *container, void *state, uint32_t items_count) { container->inner.list.state = state; container->inner.list.items_count = items_count; + container->inner.list.selected_index = 0; return true; } -- 2.48.1