(Wii) remember position in file browser when going back up the folder hierarchy

This commit is contained in:
Toad King 2012-06-30 04:49:50 -04:00
parent 89d2be66da
commit c6fdbaa86d
5 changed files with 40 additions and 24 deletions

View File

@ -22,6 +22,7 @@ struct rgui_file
{
char *path;
rgui_file_type_t type;
size_t directory_ptr;
};
struct rgui_list
@ -42,7 +43,8 @@ bool rgui_list_empty(const rgui_list_t *list)
return list->ptr == 0;
}
void rgui_list_push(rgui_list_t *list, const char *path, rgui_file_type_t type)
void rgui_list_push(rgui_list_t *list,
const char *path, rgui_file_type_t type, size_t directory_ptr)
{
if (list->ptr >= list->capacity)
{
@ -53,6 +55,7 @@ void rgui_list_push(rgui_list_t *list, const char *path, rgui_file_type_t type)
list->list[list->ptr].path = strdup(path);
list->list[list->ptr].type = type;
list->list[list->ptr].directory_ptr = directory_ptr;
list->ptr++;
}
@ -78,10 +81,10 @@ void rgui_list_clear(rgui_list_t *list)
}
void rgui_list_back(const rgui_list_t *list,
const char **path, rgui_file_type_t *file_type)
const char **path, rgui_file_type_t *file_type, size_t *directory_ptr)
{
if (rgui_list_size(list) > 0)
rgui_list_at(list, rgui_list_size(list) - 1, path, file_type);
rgui_list_at(list, rgui_list_size(list) - 1, path, file_type, directory_ptr);
}
size_t rgui_list_size(const rgui_list_t *list)
@ -90,12 +93,14 @@ size_t rgui_list_size(const rgui_list_t *list)
}
void rgui_list_at(const rgui_list_t *list, size_t index,
const char **path, rgui_file_type_t *file_type)
const char **path, rgui_file_type_t *file_type, size_t *directory_ptr)
{
if (path)
*path = list->list[index].path;
if (file_type)
*file_type = list->list[index].type;
if (directory_ptr)
*directory_ptr = list->list[index].directory_ptr;
}
static int list_comp(const void *a_, const void *b_)

View File

@ -28,17 +28,18 @@ typedef struct rgui_list rgui_list_t;
rgui_list_t *rgui_list_new(void);
void rgui_list_free(rgui_list_t *list);
void rgui_list_push(rgui_list_t *list, const char *path, rgui_file_type_t type);
void rgui_list_push(rgui_list_t *list,
const char *path, rgui_file_type_t type, size_t directory_ptr);
void rgui_list_pop(rgui_list_t *list);
void rgui_list_clear(rgui_list_t *list);
bool rgui_list_empty(const rgui_list_t *list);
void rgui_list_back(const rgui_list_t *list,
const char **path, rgui_file_type_t *type);
const char **path, rgui_file_type_t *type, size_t *directory_ptr);
size_t rgui_list_size(const rgui_list_t *list);
void rgui_list_at(const rgui_list_t *list, size_t index,
const char **path, rgui_file_type_t *type);
const char **path, rgui_file_type_t *type, size_t *directory_ptr);
void rgui_list_sort(rgui_list_t *list);

View File

@ -48,11 +48,11 @@ static bool folder_cb(const char *directory, rgui_file_enum_cb_t file_cb,
if (!*directory)
{
#ifdef HW_RVL
file_cb(ctx, "sd:", RGUI_FILE_DEVICE);
file_cb(ctx, "usb:", RGUI_FILE_DEVICE);
file_cb(ctx, "sd:", RGUI_FILE_DEVICE, 0);
file_cb(ctx, "usb:", RGUI_FILE_DEVICE, 0);
#endif
file_cb(ctx, "carda:", RGUI_FILE_DEVICE);
file_cb(ctx, "cardb:", RGUI_FILE_DEVICE);
file_cb(ctx, "carda:", RGUI_FILE_DEVICE, 0);
file_cb(ctx, "cardb:", RGUI_FILE_DEVICE, 0);
return true;
}
@ -76,7 +76,7 @@ static bool folder_cb(const char *directory, rgui_file_enum_cb_t file_cb,
file_cb(ctx,
entry->d_name, S_ISDIR(st.st_mode) ?
RGUI_FILE_DIRECTORY : RGUI_FILE_PLAIN);
RGUI_FILE_DIRECTORY : RGUI_FILE_PLAIN, 0);
}
closedir(dir);

View File

@ -98,7 +98,7 @@ rgui_handle_t *rgui_init(const char *base_path,
rgui->path_stack = rgui_list_new();
rgui->folder_buf = rgui_list_new();
rgui_list_push(rgui->path_stack, base_path, RGUI_FILE_DIRECTORY);
rgui_list_push(rgui->path_stack, base_path, RGUI_FILE_DIRECTORY, 0);
init_font(rgui, "font.bmp");
@ -182,7 +182,7 @@ static void render_text(rgui_handle_t *rgui, size_t begin, size_t end)
char title[TERM_WIDTH - 1];
const char *dir;
rgui_list_back(rgui->path_stack, &dir, NULL);
rgui_list_back(rgui->path_stack, &dir, NULL, NULL);
snprintf(title, sizeof(title), "FILE BROWSER: %s", dir);
blit_line(rgui, TERM_START_X + 15, 15, title, true);
@ -193,7 +193,7 @@ static void render_text(rgui_handle_t *rgui, size_t begin, size_t end)
{
const char *path;
rgui_file_type_t type;
rgui_list_at(rgui->folder_buf, i, &path, &type);
rgui_list_at(rgui->folder_buf, i, &path, &type, NULL);
char message[TERM_WIDTH + 1];
char *type_str;
@ -280,7 +280,10 @@ const char *rgui_iterate(rgui_handle_t *rgui, rgui_action_t action)
case RGUI_ACTION_CANCEL:
if (rgui_list_size(rgui->path_stack) > 1)
{
size_t directory_ptr;
rgui_list_back(rgui->path_stack, NULL, NULL, &directory_ptr);
rgui_list_pop(rgui->path_stack);
rgui->directory_ptr = directory_ptr;
rgui->need_refresh = true;
}
break;
@ -293,11 +296,11 @@ const char *rgui_iterate(rgui_handle_t *rgui, rgui_action_t action)
const char *path;
rgui_file_type_t type;
rgui_list_at(rgui->folder_buf, rgui->directory_ptr,
&path, &type);
rgui_list_at(rgui->folder_buf, rgui->directory_ptr, &path, &type, NULL);
const char *dir;
rgui_list_back(rgui->path_stack, &dir, NULL);
size_t directory_ptr;
rgui_list_back(rgui->path_stack, &dir, NULL, &directory_ptr);
if (type == RGUI_FILE_DIRECTORY)
{
@ -305,14 +308,21 @@ const char *rgui_iterate(rgui_handle_t *rgui, rgui_action_t action)
snprintf(cat_path, sizeof(cat_path), "%s/%s", dir, path);
if (strcmp(path, "..") == 0)
{
rgui->directory_ptr = directory_ptr;
rgui_list_pop(rgui->path_stack);
}
else if (strcmp(path, ".") != 0)
rgui_list_push(rgui->path_stack, cat_path, RGUI_FILE_DIRECTORY);
{
rgui_list_push(rgui->path_stack, cat_path, RGUI_FILE_DIRECTORY, rgui->directory_ptr);
rgui->directory_ptr = 0;
}
rgui->need_refresh = true;
}
else if (type == RGUI_FILE_DEVICE)
{
rgui_list_push(rgui->path_stack, path, RGUI_FILE_DEVICE);
rgui_list_push(rgui->path_stack, path, RGUI_FILE_DEVICE, rgui->directory_ptr);
rgui->directory_ptr = 0;
rgui->need_refresh = true;
}
else
@ -326,6 +336,7 @@ const char *rgui_iterate(rgui_handle_t *rgui, rgui_action_t action)
}
case RGUI_ACTION_REFRESH:
rgui->directory_ptr = 0;
rgui->need_refresh = true;
break;
@ -336,11 +347,10 @@ const char *rgui_iterate(rgui_handle_t *rgui, rgui_action_t action)
if (rgui->need_refresh)
{
rgui->need_refresh = false;
rgui->directory_ptr = 0;
rgui_list_clear(rgui->folder_buf);
const char *path = NULL;
rgui_list_back(rgui->path_stack, &path, NULL);
rgui_list_back(rgui->path_stack, &path, NULL, NULL);
rgui->folder_cb(path, (rgui_file_enum_cb_t)rgui_list_push,
rgui->userdata, rgui->folder_buf);

View File

@ -46,8 +46,8 @@ typedef enum
typedef struct rgui_handle rgui_handle_t;
typedef void (*rgui_file_enum_cb_t)(void *ctx, const char *path,
rgui_file_type_t file_type);
typedef void (*rgui_file_enum_cb_t)(void *ctx,
const char *path, rgui_file_type_t file_type, size_t directory_ptr);
typedef bool (*rgui_folder_enum_cb_t)(const char *directory,
rgui_file_enum_cb_t file_cb, void *userdata, void *ctx);