drive iteration in win32 file system api; fix some root-level behaviors of file browser

This commit is contained in:
Ryan Fleury
2024-05-31 12:20:14 -07:00
parent d3adfdeced
commit 59e71eb5cc
6 changed files with 101 additions and 60 deletions
+3 -3
View File
@@ -946,11 +946,11 @@ str8_array_from_list(Arena *arena, String8List *list)
{ {
String8Array array; String8Array array;
array.count = list->node_count; array.count = list->node_count;
array.strings = push_array_no_zero(arena, String8, array.count); array.v = push_array_no_zero(arena, String8, array.count);
U64 idx = 0; U64 idx = 0;
for(String8Node *n = list->first; n != 0; n = n->next, idx += 1) for(String8Node *n = list->first; n != 0; n = n->next, idx += 1)
{ {
array.strings[idx] = n->string; array.v[idx] = n->string;
} }
return array; return array;
} }
@@ -960,7 +960,7 @@ str8_array_reserve(Arena *arena, U64 count)
{ {
String8Array arr; String8Array arr;
arr.count = 0; arr.count = 0;
arr.strings = push_array(arena, String8, count); arr.v = push_array(arena, String8, count);
return arr; return arr;
} }
+1 -1
View File
@@ -63,7 +63,7 @@ struct String8List
typedef struct String8Array String8Array; typedef struct String8Array String8Array;
struct String8Array struct String8Array
{ {
String8 *strings; String8 *v;
U64 count; U64 count;
}; };
+3 -6
View File
@@ -2811,14 +2811,11 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem)
if(ui_clicked(sig)) if(ui_clicked(sig))
{ {
String8 new_path = str8_chop_last_slash(str8_chop_last_slash(path_query.path)); String8 new_path = str8_chop_last_slash(str8_chop_last_slash(path_query.path));
if(new_path.size != 0)
{
new_path = path_normalized_from_string(scratch.arena, new_path); new_path = path_normalized_from_string(scratch.arena, new_path);
String8 new_cmd = push_str8f(scratch.arena, "%S/", new_path); String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : "");
df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_cmd, &df_g_nil_cfg_node); df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_cmd, &df_g_nil_cfg_node);
} }
} }
}
// rjf: file buttons // rjf: file buttons
for(U64 row_idx = Max(visible_row_range.min, 1); for(U64 row_idx = Max(visible_row_range.min, 1);
@@ -2893,11 +2890,11 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem)
if(ui_clicked(file_sig)) if(ui_clicked(file_sig))
{ {
String8 existing_path = str8_chop_last_slash(path_query.path); String8 existing_path = str8_chop_last_slash(path_query.path);
String8 new_path = push_str8f(scratch.arena, "%S/%S/", existing_path, file->filename); String8 new_path = push_str8f(scratch.arena, "%S%s%S/", existing_path, existing_path.size != 0 ? "/" : "", file->filename);
new_path = path_normalized_from_string(scratch.arena, new_path); new_path = path_normalized_from_string(scratch.arena, new_path);
if(file->props.flags & FilePropertyFlag_IsFolder) if(file->props.flags & FilePropertyFlag_IsFolder)
{ {
String8 new_cmd = push_str8f(scratch.arena, "%S/", new_path); String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : "");
df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_cmd, &df_g_nil_cfg_node); df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_cmd, &df_g_nil_cfg_node);
} }
else else
+1 -1
View File
@@ -34,7 +34,7 @@ typedef struct OS_FileIter OS_FileIter;
struct OS_FileIter struct OS_FileIter
{ {
OS_FileIterFlags flags; OS_FileIterFlags flags;
U8 memory[600]; U8 memory[800];
}; };
typedef struct OS_FileInfo OS_FileInfo; typedef struct OS_FileInfo OS_FileInfo;
+44 -3
View File
@@ -964,7 +964,27 @@ os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags)
OS_FileIter *iter = push_array(arena, OS_FileIter, 1); OS_FileIter *iter = push_array(arena, OS_FileIter, 1);
iter->flags = flags; iter->flags = flags;
W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; W32_FileIter *w32_iter = (W32_FileIter*)iter->memory;
if(path.size == 0)
{
w32_iter->is_volume_iter = 1;
WCHAR buffer[512] = {0};
DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer);
String8List drive_strings = {0};
for(U64 off = 0; off < (U64)length;)
{
String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off);
off += next_drive_string_16.size+1;
String8 next_drive_string = str8_from_16(arena, next_drive_string_16);
next_drive_string = str8_chop_last_slash(next_drive_string);
str8_list_push(scratch.arena, &drive_strings, next_drive_string);
}
w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings);
w32_iter->drive_strings_iter_idx = 0;
}
else
{
w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data); w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data);
}
scratch_end(scratch); scratch_end(scratch);
return iter; return iter;
} }
@@ -975,6 +995,12 @@ os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out)
B32 result = 0; B32 result = 0;
OS_FileIterFlags flags = iter->flags; OS_FileIterFlags flags = iter->flags;
W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; W32_FileIter *w32_iter = (W32_FileIter*)iter->memory;
switch(w32_iter->is_volume_iter)
{
//- rjf: file iteration
default:
case 0:
{
if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE)
{ {
do do
@@ -1020,10 +1046,25 @@ os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out)
break; break;
} }
}while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data));
if (!result){
iter->flags |= OS_FileIterFlag_Done;
} }
}break;
//- rjf: volume iteration
case 1:
{
result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count;
if(result != 0)
{
MemoryZeroStruct(info_out);
info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx];
info_out->props.flags |= FilePropertyFlag_IsFolder;
w32_iter->drive_strings_iter_idx += 1;
}
}break;
}
if(!result)
{
iter->flags |= OS_FileIterFlag_Done;
} }
return result; return result;
} }
+3
View File
@@ -23,6 +23,9 @@ struct W32_FileIter
{ {
HANDLE handle; HANDLE handle;
WIN32_FIND_DATAW find_data; WIN32_FIND_DATAW find_data;
B32 is_volume_iter;
String8Array drive_strings;
U64 drive_strings_iter_idx;
}; };
StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(W32_FileIter), file_iter_memory_size); StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(W32_FileIter), file_iter_memory_size);