Login
1 branch 0 tags
Ben (Desktop/Arch) Software controlled display brightness c2671dd 1 month ago 67 Commits
moon / src / ui.c
#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;
}