text/plain
•
2.84 KB
•
112 lines
#include "ui.h"
#include <stdlib.h>
#include <string.h>
#include "lvgl.h"
#include "moon.h"
#include "storage.h"
#include "topbar.h"
char string_buffer[256];
static void button_focus_cb(lv_event_t* e) {
lv_obj_t* btn = lv_event_get_target(e);
if (!btn) {
return;
}
lv_obj_t* label = lv_obj_get_child(btn, 0);
if (!label) {
return;
}
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_FOCUSED) {
lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);
} else {
lv_label_set_long_mode(label, LV_LABEL_LONG_CLIP);
}
}
lv_obj_t* bvs_list_add_button(lv_obj_t* list,
const void* icon,
const char* txt) {
lv_obj_t* ret = lv_list_add_button(list, icon, txt);
lv_obj_set_style_pad_hor(ret, 2, 0);
lv_obj_set_style_pad_ver(ret, 1, 0);
lv_obj_set_height(ret, 20);
lv_obj_t* label = lv_obj_get_child(ret, 0);
lv_label_set_long_mode(label, LV_LABEL_LONG_DOT);
lv_obj_set_style_anim_duration(label, 12000, 0);
lv_obj_add_event_cb(ret, button_focus_cb, LV_EVENT_FOCUSED, NULL);
lv_obj_add_event_cb(ret, button_focus_cb, LV_EVENT_DEFOCUSED, NULL);
return ret;
}
lv_obj_t* bvs_list_create(void) {
lv_obj_t* list = lv_list_create(lv_screen_active());
lv_obj_set_style_pad_hor(list, 2, 0);
lv_obj_set_style_radius(list, 0, 0);
lv_obj_set_style_border_side(list, 0, 0);
lv_obj_set_pos(list, 0, TOPBAR_H);
lv_obj_set_size(list, SCREEN_WIDTH, SCREEN_HEIGHT - TOPBAR_H);
return list;
}
void bvs_list_clear(lv_obj_t* list) {
if (!list) {
return;
}
uint32_t count = lv_obj_get_child_count(list);
for (uint32_t i = 0; i < count; i++) {
lv_group_remove_obj(lv_obj_get_child(list, i));
}
lv_obj_delete(list);
}
void path_parent(const char* path,
char* parent,
size_t parent_size,
char* basename,
size_t basename_size) {
strncpy(parent, path, parent_size);
parent[parent_size - 1] = '\0';
char* last_slash = strrchr(parent, '/');
if (!last_slash || last_slash == parent) {
strncpy(basename, parent + 1, basename_size);
basename[basename_size - 1] = '\0';
strcpy(parent, "/");
} else {
strncpy(basename, last_slash + 1, basename_size);
basename[basename_size - 1] = '\0';
*last_slash = '\0';
}
}
int entry_name_cmp(const void* a, const void* b) {
const storage_entry_t* ea = a;
const storage_entry_t* eb = b;
return strcmp(ea->name, eb->name);
}
int get_sorted_entries(const char* dir,
storage_entry_t* entries,
int max_entries) {
int count = storage_list_dir(dir, entries, max_entries);
if (count <= 0) {
return 0;
}
qsort(entries, (size_t)count, sizeof(storage_entry_t), entry_name_cmp);
int visible = 0;
for (int i = 0; i < count; i++) {
if (entries[i].name[0] == '.') {
continue;
}
entries[visible++] = entries[i];
}
return visible;
}