This commit is contained in:
Willy-JL
2023-02-07 00:50:53 +00:00
5 changed files with 89 additions and 46 deletions
@@ -6,6 +6,7 @@
#include <m-string.h>
#include <storage/storage.h>
#include "toolbox/path.h"
#include "../../../settings/xtreme_settings/xtreme_settings.h"
#define FAP_MANIFEST_MAX_ICON_SIZE 32
@@ -84,11 +85,16 @@ 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(!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_cmp(a->path, b->path);
return furi_string_cmpi(a->path, b->path);
}
#define M_OPL_ArchiveFile_t() \
@@ -11,6 +11,7 @@
#include <gui/elements.h>
#include <furi.h>
#include "toolbox/path.h"
#include "../../../settings/xtreme_settings/xtreme_settings.h"
#define LIST_ITEMS 5u
#define MAX_LEN_PX 110
@@ -78,13 +79,22 @@ 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(!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_cmp(a->path, b->path);
return furi_string_cmpi(a->path, b->path);
}
#define M_OPL_BrowserItem_t() \
@@ -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) {
@@ -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;
@@ -145,9 +153,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);
@@ -208,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(
@@ -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();