From 7983c2ea381265576a01efa1aaa75406eab46247 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 3 Apr 2016 23:47:24 -0400 Subject: [PATCH] system file list 100 up and running --- 4ed_file_view.cpp | 275 +++++++++++++++++++++------------------------- 4ed_gui.cpp | 23 ++-- 2 files changed, 139 insertions(+), 159 deletions(-) diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index 0e4a5bef..f7026a96 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -3547,6 +3547,70 @@ do_widget(View *view, GUI_Target *target){ gui_end_serial_section(target); } +struct Exhaustive_File_Loop{ + char front_name_[256]; + char full_path_[256]; + String front_name, full_path; + + Absolutes absolutes; + + File_Info *infos; + i32 count, r; +}; + +struct Exhaustive_File_Info{ + File_Info *info; + String message; + b8 is_folder; + b8 name_match; + b8 is_loaded; +}; + +internal void +begin_exhaustive_loop(Exhaustive_File_Loop *loop, Hot_Directory *hdir){ + loop->front_name = make_fixed_width_string(loop->front_name_); + loop->full_path = make_fixed_width_string(loop->full_path_); + + loop->infos = hdir->file_list.infos; + loop->count = hdir->file_list.count; + + get_front_of_directory(&loop->front_name, hdir->string); + get_absolutes(loop->front_name, &loop->absolutes, 1, 1); + get_path_of_directory(&loop->full_path, hdir->string); + loop->r = loop->full_path.size; +} + +internal Exhaustive_File_Info +get_exhaustive_info(System_Functions *system, Working_Set *working_set, Exhaustive_File_Loop *loop, i32 i){ + persist String message_loaded = make_lit_string(" LOADED"); + persist String message_unsaved = make_lit_string(" LOADED *"); + persist String message_unsynced = make_lit_string(" LOADED !"); + + Exhaustive_File_Info result = {0}; + Editing_File *file = 0; + + result.info = loop->infos + i; + loop->full_path.size = loop->r; + append(&loop->full_path, result.info->filename); + terminate_with_null(&loop->full_path); + file = working_set_contains(system, working_set, loop->full_path); + + result.is_folder = (result.info->folder != 0); + result.name_match = (filename_match(loop->front_name, &loop->absolutes, result.info->filename, 0) != 0); + result.is_loaded = (file != 0 && file_is_ready(file)); + + result.message = {0}; + if (result.is_loaded){ + switch (buffer_get_sync(file)){ + case SYNC_GOOD: result.message = message_loaded; break; + case SYNC_BEHIND_OS: result.message = message_unsynced; break; + case SYNC_UNSAVED: result.message = message_unsaved; break; + } + } + + return(result); +} + internal i32 step_file_view(System_Functions *system, View *view, b32 is_active){ GUI_Target *target = &view->gui_target; @@ -3613,72 +3677,58 @@ step_file_view(System_Functions *system, View *view, b32 is_active){ switch (view->interaction){ case IInt_Sys_File_List: { - persist String p4c_extension = make_lit_string("p4c"); - persist String message_loaded = make_lit_string(" LOADED"); - persist String message_unsaved = make_lit_string(" LOADED *"); - persist String message_unsynced = make_lit_string(" LOADED !"); - persist String message_nothing = {}; - - char front_name_space[256]; - String front_name = make_fixed_width_string(front_name_space); - - char full_path_[256]; - String full_path = make_fixed_width_string(full_path_); - - Absolutes absolutes; - - i32 i, r; - Hot_Directory *hdir = &models->hot_directory; - File_List *files = &hdir->file_list; - File_Info *info = files->infos; - Editing_File *file = 0; - GUI_id file_option_id; - - get_front_of_directory(&front_name, hdir->string); - get_absolutes(front_name, &absolutes, 1, 1); - - get_path_of_directory(&full_path, hdir->string); - r = full_path.size; - String message = {0}; switch (view->action){ case IAct_Open: message = make_lit_string("Open: "); break; case IAct_Save_As: message = make_lit_string("Save As: "); break; case IAct_New: message = make_lit_string("New: "); break; } + + + Exhaustive_File_Loop loop; + Exhaustive_File_Info file_info; + + GUI_id file_option_id, str_edit_id; + i32 i; + b32 do_new_directory = 0; + Hot_Directory *hdir = &models->hot_directory; + gui_do_text_field(target, message, hdir->string); - gui_do_file_input(target, hdir); - + + str_edit_id.id[0] = (u64)(hdir); + if (gui_do_file_input(target, str_edit_id, hdir)){ + interactive_view_complete(view, hdir->string, 0); + } + gui_get_scroll_vars(target, view->showing_ui, &view->gui_scroll); gui_begin_scrollable(target, view->showing_ui, view->gui_scroll, 9.f * view->font_height); - for (i = 0; i < files->count; ++i, ++info){ - append(&full_path, info->filename); - terminate_with_null(&full_path); - file = working_set_contains(system, &models->working_set, full_path); + begin_exhaustive_loop(&loop, hdir); + for (i = 0; i < loop.count; ++i){ + file_info = get_exhaustive_info(system, &models->working_set, &loop, i); - b8 is_folder = (info->folder != 0); - b8 name_match = (filename_match(front_name, &absolutes, info->filename, 0) != 0); - b8 is_loaded = (file != 0 && file_is_ready(file)); - - String message = message_nothing; - if (is_loaded){ - switch (buffer_get_sync(file)){ - case SYNC_GOOD: message = message_loaded; break; - case SYNC_BEHIND_OS: message = message_unsynced; break; - case SYNC_UNSAVED: message = message_unsaved; break; + /////////////////////////// + if (file_info.name_match){ + file_option_id.id[0] = (u64)(file_info.info); + if (gui_do_file_option(target, file_option_id, + file_info.info->filename, file_info.is_folder, file_info.message)){ + if (file_info.is_folder){ + append(&hdir->string, file_info.info->filename); + append(&hdir->string, "/"); + do_new_directory = 1; + } + else{ + interactive_view_complete(view, loop.full_path, 0); + } } } - - if (name_match){ - file_option_id.id[0] = (u64)(info); - if (gui_do_file_option(target, file_option_id, info->filename, is_folder, message)){ - interactive_view_complete(view, full_path, 0); - } - } - full_path.size = r; + /////////////////////////// } + if (do_new_directory){ + hot_directory_reload(system, hdir, &models->working_set); + } + gui_end_scrollable(target); }break; }break; @@ -3873,7 +3923,7 @@ do_input_file_view(System_Functions *system, Exchange *exchange, GUI_Session gui_session; GUI_Header *h; GUI_Target *target = &view->gui_target; - + gui_session_init(&gui_session, rect, view->font_height); target->active = {0}; @@ -3918,7 +3968,10 @@ do_input_file_view(System_Functions *system, Exchange *exchange, for (i = 0; i < count; ++i){ key = get_single_key(keys, i); step = app_single_file_input_step(system, working_set, key, &hdir->string, hdir, 1, 1, 0); - if ((step.hit_newline || step.hit_ctrl_newline) && !step.no_file_match) result = 1; + if ((step.hit_newline || step.hit_ctrl_newline) && !step.no_file_match){ + result = 1; + view->gui_target.active = e->id; + } } }break; @@ -4074,109 +4127,27 @@ do_input_file_view(System_Functions *system, Exchange *exchange, view->gui_target.scroll_updated = scroll_vars; } - return(result); - -#if 0 - Models *models = view->models; - i32 result = 0; - i32 widget_height = 0; - AllowLocal(models); - -#if 0 { - UI_State state = - ui_state_init(&view->widget.state, 0, user_input, - &models->style, models->global_font.font_id, models->font_set, 0, 1); - - UI_Layout layout; - begin_layout(&layout, rect); - - switch (view->widget.type){ - case FWIDG_NONE: - { - if (file && view->showing_ui == VUI_None){ - do_file_bar(view, file, &layout, 0); - } - draw_file_view_queries(view, &state, &layout); - }break; - - case FWIDG_TIMELINES: - { - i32 scrub_max = view->scrub_max; - i32 undo_count = file->state.undo.undo.edit_count; - i32 redo_count = file->state.undo.redo.edit_count; - i32 total_count = undo_count + redo_count; - undo_shit(system, view, &state, &layout, total_count, undo_count, scrub_max); - }break; + Key_Summary *keys = &user_input->keys; + b32 did_esc = 0; + Key_Event_Data key; + i32 i, count; + + count = keys->count; + for (i = 0; i < count; ++i){ + key = get_single_key(keys, i); + if (key.keycode == key_esc){ + did_esc = 1; + break; + } } - - widget_height = layout.y - rect.y0; - if (ui_finish_frame(&view->widget.state, &state, &layout, rect, 0, 0)){ - result = 1; - } - } -#endif - - - view->scroll_min_limit = (f32)-widget_height; - if (view->reinit_scrolling){ - view_reinit_scrolling(view); - } - - if (view->showing_ui == VUI_None){ - if (file_step(view, rect, user_input, is_active)){ - result = 1; + + if (did_esc && view->showing_ui != VUI_None){ + view_show_file(view, 0); } - } - -#if 0 - { - UI_State state = - ui_state_init(&view->ui_state, 0, user_input, - &models->style, models->global_font.font_id, models->font_set, &models->working_set, 1); - - UI_Layout layout; - begin_layout(&layout, rect); - - Super_Color color = {}; - - switch (view->showing_ui){ - case VUI_None: break; - case VUI_Theme: - { - theme_shit(system, exchange, view, 0, &state, &layout, &color); - }break; - case VUI_Interactive: - { - if (interactive_shit(system, view, &state, &layout)){ - result = 1; - } - }break; - case VUI_Menu: - { - menu_shit(view, &state, &layout); - }break; - case VUI_Config: - { - config_shit(view, &state, &layout); - }break; - } - - i32 did_activation = 0; - if (ui_finish_frame(&view->ui_state, &state, &layout, rect, 0, &did_activation)){ - result = 1; - } - if (did_activation){ - if (view->showing_ui == VUI_Theme){ - view->color = color; - result = 1; - } - } - } -#endif - + } + return(result); -#endif } internal i32 diff --git a/4ed_gui.cpp b/4ed_gui.cpp index 4a46b0b3..13d607bd 100644 --- a/4ed_gui.cpp +++ b/4ed_gui.cpp @@ -111,6 +111,7 @@ struct GUI_Interactive{ struct GUI_Edit{ GUI_Header h; + GUI_id id; void *out; }; @@ -224,11 +225,12 @@ gui_push_simple_command(GUI_Target *target, i32 type){ } internal GUI_Edit* -gui_push_string_edit_command(GUI_Target *target, i32 type, void *out){ +gui_push_string_edit_command(GUI_Target *target, i32 type, GUI_id id, void *out){ GUI_Edit *result = 0; GUI_Edit item; item.h.type = type; item.h.size = sizeof(item); + item.id = id; item.out = out; result = (GUI_Edit*)gui_push_item(target, &item, sizeof(item)); return(result); @@ -313,22 +315,29 @@ gui_do_text_field(GUI_Target *target, String prompt, String text){ gui_push_string(target, h, text); } -internal void -gui_do_file_input(GUI_Target *target, void *out){ - gui_push_string_edit_command(target, guicom_file_input, out); +internal b32 +gui_do_file_input(GUI_Target *target, GUI_id id, void *out){ + b32 result = 0; + gui_push_string_edit_command(target, guicom_file_input, id, out); + + if (gui_id_eq(id, target->active)){ + result = 1; + } + + return(result); } internal b32 -gui_do_file_option(GUI_Target *target, GUI_id file_id, String filename, b32 is_folder, String message){ +gui_do_file_option(GUI_Target *target, GUI_id id, String filename, b32 is_folder, String message){ b32 result = 0; - GUI_Interactive *b = gui_push_button_command(target, guicom_file_option, file_id); + GUI_Interactive *b = gui_push_button_command(target, guicom_file_option, id); GUI_Header *h = (GUI_Header*)b; gui_push_item(target, h, &is_folder, sizeof(is_folder)); gui_push_string(target, h, filename, 1); gui_push_string(target, h, message); - if (gui_id_eq(file_id, target->active)){ + if (gui_id_eq(id, target->active)){ result = 1; }