#include "vg/vg_ui/filebrowser.h"
+#ifdef _WIN32
+#include <windows.h>
+#include <shlobj.h>
+#endif
+
+#include "vg/submodules/rax/rax.h"
+#include "vg/submodules/rax/rax.c"
void vg_filebrowser_init( struct vg_filebrowser *browser )
{
void vg_filebrowser_set_path_to_home( struct vg_filebrowser *browser )
{
- // TODO
- strcpy( browser->current_path, "/home/harry" );
+#ifdef _WIN32
+ u16 *path = NULL;
+ if( SHGetKnownFolderPath( &FOLDERID_Documents, 0, NULL, &path ) == S_OK )
+ {
+ if( !WideCharToMultiByte( CP_UTF8, 0, path, -1, browser->current_path, sizeof(browser->current_path), NULL, NULL ) )
+ {
+ vg_error( "WideCharToMultiByte failed... defaulting to C:/\n" );
+ vg_strncpy( "C:/", browser->current_path, sizeof(browser->current_path), k_strncpy_always_add_null );
+ }
+ }
+ else
+ {
+ vg_error( "SHGetKnownFolderPath failed... defaulting to C:/\n" );
+ vg_strncpy( "C:/", browser->current_path, sizeof(browser->current_path), k_strncpy_always_add_null );
+ }
+ CoTaskMemFree( path );
+#else
+ vg_strncpy( getenv("HOME"), browser->current_path, sizeof(browser->current_path), k_strncpy_always_add_null );
+#endif
}
static bool vg_filebrowser_up( struct vg_filebrowser *browser )
browser->view_top_index = 0;
browser->slider_value = 0.0f;
- struct vg_filebrowser_entry *folder_list_head = NULL,
- *folder_list_tail = NULL,
- *file_list_head = NULL;
-
if( browser->open_result == k_dir_open_is_file )
{
if( vg_filebrowser_up( browser ) )
return;
}
+ rax *rt_files = raxNew(),
+ *rt_dirs = raxNew();
+
while( vg_dir_next_entry( &dir ) )
{
enum vg_entry_type type = vg_dir_entry_type( &dir );
u32 len = strlen( entry_name );
struct vg_filebrowser_entry *entry = malloc( sizeof(struct vg_filebrowser_entry) + len + 1 );
entry->next = NULL;
+ entry->prev = NULL;
entry->type = type;
entry->media_type = media_type;
strcpy( entry->name, entry_name );
if( type == k_vg_entry_type_dir )
{
- entry->prev = folder_list_head;
- if( folder_list_head )
- folder_list_head->next = entry;
- else
- folder_list_tail = entry;
- folder_list_head = entry;
+ raxInsert( rt_dirs, (u8 *)entry->name, strlen(entry->name), entry, NULL );
}
else if( type == k_vg_entry_type_file )
{
- entry->prev = file_list_head;
- if( file_list_head )
- file_list_head->next = entry;
- file_list_head = entry;
+ raxInsert( rt_files, (u8 *)entry->name, strlen(entry->name), entry, NULL );
}
+ else
+ continue;
browser->entry_count ++;
}
vg_dir_close( &dir );
+ /* compile lists */
+ struct vg_filebrowser_entry *folder_list_head = NULL,
+ *folder_list_tail = NULL,
+ *file_list_head = NULL;
+ raxIterator rt_iter;
+ raxStart( &rt_iter, rt_files );
+ raxSeek( &rt_iter, "$", NULL, 0 );
+ while( raxPrev( &rt_iter ) )
+ {
+ struct vg_filebrowser_entry *entry = rt_iter.data;
+ entry->prev = file_list_head;
+ if( file_list_head )
+ file_list_head->next = entry;
+ file_list_head = entry;
+ }
+
+ raxStart( &rt_iter, rt_dirs );
+ raxSeek( &rt_iter, "$", NULL, 0 );
+ while( raxPrev( &rt_iter ) )
+ {
+ struct vg_filebrowser_entry *entry = rt_iter.data;
+ entry->prev = folder_list_head;
+ if( folder_list_head )
+ folder_list_head->next = entry;
+ else
+ folder_list_tail = entry;
+ folder_list_head = entry;
+ }
+
+ /* attatch the two lists */
if( folder_list_head )
{
browser->whole_list = folder_list_head;
}
browser->view_top_entry = browser->whole_list;
+
+ raxFree( rt_files );
+ raxFree( rt_dirs );
}