Update browser

This commit is contained in:
VerstreuteSeele
2023-02-11 15:49:00 +01:00
parent 11f3464e1b
commit 6b99999566
7 changed files with 129 additions and 59 deletions

View File

@@ -11,6 +11,8 @@
#include <core/check.h>
#include <core/common_defines.h>
#include <core/log.h>
#include "m-string.h"
#include "m-algo.h"
#include <m-array.h>
#define LIST_ITEMS 5u
@@ -77,13 +79,38 @@ static void BrowserItem_t_clear(BrowserItem_t* obj) {
}
}
ARRAY_DEF(
items_array,
BrowserItem_t,
(INIT(API_2(BrowserItem_t_init)),
SET(API_6(BrowserItem_t_set)),
INIT_SET(API_6(BrowserItem_t_init_set)),
CLEAR(API_2(BrowserItem_t_clear))))
static int BrowserItem_t_cmp(const BrowserItem_t* a, const BrowserItem_t* b) {
// Back indicator comes before everything, then folders, then all other files.
if(a->type == BrowserItemTypeBack) {
return -1;
}
if(b->type == BrowserItemTypeBack) {
return 1;
}
if(!XTREME_SETTINGS()->sort_ignore_dirs) {
if(a->type == BrowserItemTypeFolder && b->type != BrowserItemTypeFolder) {
return -1;
}
if(a->type != BrowserItemTypeFolder && b->type == BrowserItemTypeFolder) {
return 1;
}
}
return furi_string_cmpi(a->path, b->path);
}
#define M_OPL_BrowserItem_t() \
(INIT(API_2(BrowserItem_t_init)), \
SET(API_6(BrowserItem_t_set)), \
INIT_SET(API_6(BrowserItem_t_init_set)), \
CLEAR(API_2(BrowserItem_t_clear)), \
CMP(API_6(BrowserItem_t_cmp)), \
SWAP(M_SWAP_DEFAULT), \
EQUAL(API_6(M_EQUAL_DEFAULT)))
ARRAY_DEF(items_array, BrowserItem_t)
ALGO_DEF(items_array, ARRAY_OPLIST(items_array, M_OPL_BrowserItem_t()))
struct FileBrowser {
View* view;
@@ -438,7 +465,13 @@ static void
}
} else {
with_view_model(
browser->view, FileBrowserModel * model, { model->list_loading = false; }, true);
browser->view,
FileBrowserModel * model,
{
items_array_sort(model->items);
model->list_loading = false;
},
true);
}
}

View File

@@ -15,6 +15,8 @@
#define TAG "BrowserWorker"
#define ASSETS_DIR "assets"
#define BADUSB_LAYOUTS_DIR "layouts"
#define SUBGHZ_TEMP_DIR "tmp_history"
#define BROWSER_ROOT STORAGE_ANY_PATH_PREFIX
#define FILE_NAME_LEN_MAX 256
#define LONG_LOAD_THRESHOLD 100
@@ -90,7 +92,9 @@ static bool browser_filter_by_name(BrowserWorker* browser, FuriString* name, boo
if(is_folder) {
// Skip assets folders (if enabled)
if(browser->skip_assets) {
return ((furi_string_cmp_str(name, ASSETS_DIR) == 0) ? (false) : (true));
return ((furi_string_cmp_str(name, ASSETS_DIR) == 0) ? (false) : (true)) &&
((furi_string_cmp_str(name, BADUSB_LAYOUTS_DIR) == 0) ? (false) : (true)) &&
((furi_string_cmp_str(name, SUBGHZ_TEMP_DIR) == 0) ? (false) : (true));
} else {
return true;
}
@@ -202,55 +206,58 @@ static bool
uint32_t items_cnt = 0;
bool ret = false;
do {
if(!storage_dir_open(directory, furi_string_get_cstr(path))) {
break;
}
items_cnt = 0;
while(items_cnt < offset) {
if(!storage_dir_read(directory, &file_info, name_temp, FILE_NAME_LEN_MAX)) {
break;
}
if(storage_file_get_error(directory) == FSE_OK) {
furi_string_set(name_str, name_temp);
if(browser_filter_by_name(browser, name_str, (file_info.flags & FSF_DIRECTORY))) {
items_cnt++;
}
} else {
break;
}
}
if(items_cnt != offset) {
break;
}
// items_cnt = 0;
// while(items_cnt < offset) {
// if(!storage_dir_read(directory, &file_info, name_temp, FILE_NAME_LEN_MAX)) {
// break;
// }
// if(storage_file_get_error(directory) == FSE_OK) {
// furi_string_set(name_str, name_temp);
// if(browser_filter_by_name(browser, name_str, (file_info.flags & FSF_DIRECTORY))) {
// items_cnt++;
// }
// } else {
// break;
// }
// }
// if(items_cnt != offset) {
// break;
// }
// FLIPPER DEVS MOMENT
// this used to load the file list in chunks, and then sort it...
// so while scrolling, it loads more files and sorts them...
// chances are, the new files are higher in the sorted list...
// so the files keep shifting around while scrolling...
// now this does something intelligent and loads all in one go.
// might take a few milliseconds longer, but atleast it works :kekw:
UNUSED(offset);
UNUSED(count);
if(browser->list_load_cb) {
browser->list_load_cb(browser->cb_ctx, offset);
browser->list_load_cb(browser->cb_ctx, 0);
}
items_cnt = 0;
while(items_cnt < count) {
if(!storage_dir_read(directory, &file_info, name_temp, FILE_NAME_LEN_MAX)) {
break;
}
if(storage_file_get_error(directory) == FSE_OK) {
furi_string_set(name_str, name_temp);
if(browser_filter_by_name(browser, name_str, (file_info.flags & FSF_DIRECTORY))) {
furi_string_printf(name_str, "%s/%s", furi_string_get_cstr(path), name_temp);
if(browser->list_item_cb) {
browser->list_item_cb(
browser->cb_ctx, name_str, (file_info.flags & FSF_DIRECTORY), false);
}
items_cnt++;
while(storage_dir_read(directory, &file_info, name_temp, FILE_NAME_LEN_MAX) &&
storage_file_get_error(directory) == FSE_OK) {
furi_string_set(name_str, name_temp);
if(browser_filter_by_name(browser, name_str, (file_info.flags & FSF_DIRECTORY))) {
furi_string_printf(name_str, "%s/%s", furi_string_get_cstr(path), name_temp);
if(browser->list_item_cb) {
browser->list_item_cb(
browser->cb_ctx, name_str, (file_info.flags & FSF_DIRECTORY), false);
}
} else {
break;
items_cnt++;
}
}
if(browser->list_item_cb) {
browser->list_item_cb(browser->cb_ctx, NULL, false, true);
}
ret = true;
} while(0);
furi_string_free(name_str);
@@ -260,7 +267,7 @@ static bool
furi_record_close(RECORD_STORAGE);
return (items_cnt == count);
return ret;
}
static int32_t browser_worker(void* context) {