From 05ddeb3066190f2397ee0806a46ab40d035e060b Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 6 Feb 2023 19:28:26 +0000 Subject: [PATCH 1/5] Alpha sort asset packs setting --- .../scenes/xtreme_settings_scene_start.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c index 53d679efb..f3e41ba70 100644 --- a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c +++ b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c @@ -145,9 +145,20 @@ void xtreme_settings_scene_start_on_enter(void* context) { if(info.flags & FSF_DIRECTORY) { char* copy = malloc(MAX_PACK_NAME_LEN); strlcpy(copy, name, MAX_PACK_NAME_LEN); - asset_packs_push_back(app->asset_packs, copy); - if(strcmp(name, xtreme_settings->asset_pack) == 0) - current_pack = asset_packs_size(app->asset_packs); + uint idx; + for(idx = 0; idx < asset_packs_size(app->asset_packs); idx++) { + if(strcasecmp(copy, *asset_packs_get(app->asset_packs, idx)) < 0) { + break; + } + } + asset_packs_push_at(app->asset_packs, idx, copy); + if(current_pack != 0) { + if(idx <= current_pack) + current_pack++; + } else { + if(strcmp(copy, xtreme_settings->asset_pack) == 0) + current_pack = idx + 1; + } } } } while(false); From d6dcf0efa26f77f99d9aac9cba00ad6636e1ebc4 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 6 Feb 2023 20:51:07 +0000 Subject: [PATCH 2/5] Case insensitive file browser list --- applications/main/archive/helpers/archive_files.h | 2 +- applications/services/gui/modules/file_browser.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index db624f5b5..881d1f134 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -88,7 +88,7 @@ static int ArchiveFile_t_cmp(const ArchiveFile_t* a, const ArchiveFile_t* b) { return -1; } - return furi_string_cmp(a->path, b->path); + return furi_string_cmpi(a->path, b->path); } #define M_OPL_ArchiveFile_t() \ diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index 9d65df46b..5d87fcb45 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -84,7 +84,7 @@ static int BrowserItem_t_cmp(const BrowserItem_t* a, const BrowserItem_t* b) { return -1; } - return furi_string_cmp(a->path, b->path); + return furi_string_cmpi(a->path, b->path); } #define M_OPL_BrowserItem_t() \ From e393285064aaa6d2264e25e29f6c1db1f9f76080 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 6 Feb 2023 23:05:34 +0000 Subject: [PATCH 3/5] Fix file browser long list jump bug --- .../gui/modules/file_browser_worker.c | 74 ++++++++++--------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/applications/services/gui/modules/file_browser_worker.c b/applications/services/gui/modules/file_browser_worker.c index 4386fdfd0..d4e83aefb 100644 --- a/applications/services/gui/modules/file_browser_worker.c +++ b/applications/services/gui/modules/file_browser_worker.c @@ -203,55 +203,57 @@ 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 higner 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); @@ -261,7 +263,7 @@ static bool furi_record_close(RECORD_STORAGE); - return (items_cnt == count); + return ret; } static int32_t browser_worker(void* context) { From e98ad6fc2c2bcce58b3b5e726286fb56b2abeef0 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Tue, 7 Feb 2023 00:24:19 +0000 Subject: [PATCH 4/5] Fix file browser sorting for good --- applications/main/archive/helpers/archive_files.h | 3 +++ applications/services/gui/modules/file_browser.c | 13 ++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 881d1f134..27f6353a7 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -87,6 +87,9 @@ static int ArchiveFile_t_cmp(const ArchiveFile_t* a, const ArchiveFile_t* b) { if(a->type == ArchiveFileTypeFolder && b->type != ArchiveFileTypeFolder) { return -1; } + if(a->type != ArchiveFileTypeFolder && b->type == ArchiveFileTypeFolder) { + return 1; + } return furi_string_cmpi(a->path, b->path); } diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index 5d87fcb45..eecea0dbd 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -78,11 +78,18 @@ static void BrowserItem_t_clear(BrowserItem_t* obj) { 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) || - (a->type == BrowserItemTypeFolder && b->type != BrowserItemTypeFolder && - b->type != BrowserItemTypeBack)) { + if(a->type == BrowserItemTypeBack) { return -1; } + if(b->type == BrowserItemTypeBack) { + return 1; + } + 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); } From edd3171d6c2a8895a7f1f8ac4375891bf3d45d56 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Tue, 7 Feb 2023 00:50:38 +0000 Subject: [PATCH 5/5] Add xfw setting for sort dirs before files --- applications/main/archive/helpers/archive_files.h | 13 ++++++++----- applications/services/gui/modules/file_browser.c | 13 ++++++++----- .../scenes/xtreme_settings_scene_start.c | 13 +++++++++++++ .../settings/xtreme_settings/xtreme_settings.h | 1 + 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 27f6353a7..a9c33c9f6 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -6,6 +6,7 @@ #include #include #include "toolbox/path.h" +#include "../../../settings/xtreme_settings/xtreme_settings.h" #define FAP_MANIFEST_MAX_ICON_SIZE 32 @@ -84,11 +85,13 @@ static void ArchiveFile_t_clear(ArchiveFile_t* obj) { } static int ArchiveFile_t_cmp(const ArchiveFile_t* a, const ArchiveFile_t* b) { - if(a->type == ArchiveFileTypeFolder && b->type != ArchiveFileTypeFolder) { - return -1; - } - if(a->type != ArchiveFileTypeFolder && b->type == ArchiveFileTypeFolder) { - return 1; + if(!XTREME_SETTINGS()->sort_ignore_dirs) { + if(a->type == ArchiveFileTypeFolder && b->type != ArchiveFileTypeFolder) { + return -1; + } + if(a->type != ArchiveFileTypeFolder && b->type == ArchiveFileTypeFolder) { + return 1; + } } return furi_string_cmpi(a->path, b->path); diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index eecea0dbd..c6971c82a 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -11,6 +11,7 @@ #include #include #include "toolbox/path.h" +#include "../../../settings/xtreme_settings/xtreme_settings.h" #define LIST_ITEMS 5u #define MAX_LEN_PX 110 @@ -84,11 +85,13 @@ static int BrowserItem_t_cmp(const BrowserItem_t* a, const BrowserItem_t* b) { if(b->type == BrowserItemTypeBack) { return 1; } - if(a->type == BrowserItemTypeFolder && b->type != BrowserItemTypeFolder) { - return -1; - } - if(a->type != BrowserItemTypeFolder && b->type == BrowserItemTypeFolder) { - 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); diff --git a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c index f3e41ba70..d6532af2c 100644 --- a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c +++ b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c @@ -87,6 +87,14 @@ static void xtreme_settings_scene_start_battery_style_changed(VariableItem* item app->settings_changed = true; } +static void xtreme_settings_scene_start_sort_folders_before_changed(VariableItem* item) { + XtremeSettingsApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->sort_ignore_dirs = !value; + app->settings_changed = true; +} + static void xtreme_settings_scene_start_xp_level_changed(VariableItem* item) { XtremeSettingsApp* app = variable_item_get_context(item); app->dolphin_level = variable_item_get_current_value_index(item) + 1; @@ -219,6 +227,11 @@ void xtreme_settings_scene_start_on_enter(void* context) { variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, battery_style_names[value_index]); + item = variable_item_list_add( + var_item_list, "Sort folders before", 2, xtreme_settings_scene_start_sort_folders_before_changed, app); + variable_item_set_current_value_index(item, !xtreme_settings->sort_ignore_dirs); + variable_item_set_current_value_text(item, !xtreme_settings->sort_ignore_dirs ? "ON" : "OFF"); + char level_str[4]; snprintf(level_str, 4, "%i", app->dolphin_level); item = variable_item_list_add( diff --git a/applications/settings/xtreme_settings/xtreme_settings.h b/applications/settings/xtreme_settings/xtreme_settings.h index 0a19ca643..ee0ec5583 100644 --- a/applications/settings/xtreme_settings/xtreme_settings.h +++ b/applications/settings/xtreme_settings/xtreme_settings.h @@ -22,6 +22,7 @@ typedef struct { char asset_pack[MAX_PACK_NAME_LEN]; BatteryStyle battery_style; uint16_t anim_speed; + bool sort_ignore_dirs; } XtremeSettings; XtremeSettings* XTREME_SETTINGS();