Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
750da71d1This file is pinned to the selected release. Download the original to open it in your design tool.
// window_list.c
#include "window_list.h"
#include "gui.h"
const char items[11][6] = {
"item0",
"item1",
"item2",
"item3",
"item4",
"item5",
"item6",
"item7",
"item8",
"item9",
"item10",
};
void window_list_item(window_list_t* pwindow_list, uint16_t index,
const char** pptext, uint16_t* pid_icon)
{
*pptext = (char*)items[index];
*pid_icon = 0;
}
void window_list_inc(window_list_t* window, int dif);
void window_list_dec(window_list_t* window, int dif);
void window_list_init(window_list_t* window)
{
window->color_back = gui_defaults.color_back;
window->color_text = gui_defaults.color_text;
window->font = gui_defaults.font;
window->padding = gui_defaults.padding;
window->icon_rect = rect_ui16(0, 0, 16, 16);
window->alignment = gui_defaults.alignment;
window->count = 0;
window->index = 0;
window->top_index = 0;
window->list_item = window_list_item;
window->win.flg |= WINDOW_FLG_ENABLED;
}
void window_list_done(window_list_t* window)
{
}
void window_list_draw(window_list_t* window)
{
if (!((window->win.flg & (WINDOW_FLG_INVALID | WINDOW_FLG_VISIBLE))
== (WINDOW_FLG_INVALID | WINDOW_FLG_VISIBLE))) {
return;
}
int item_height = window->font->h + window->padding.top + window->padding.bottom;
rect_ui16_t rc_win = window->win.rect;
int visible_count = rc_win.h / item_height;
int i;
for (i = 0; i < visible_count && i < window->count; i++) {
int idx = i + window->top_index;
const char* label;
uint16_t id_icon;
window->list_item(window, idx, &label, &id_icon);
color_t color_text = window->color_text;
color_t color_back = window->color_back;
uint8_t swap = 0;
rect_ui16_t rc = { rc_win.x, rc_win.y + i * item_height,
rc_win.w, item_height };
padding_ui8_t padding = window->padding;
if (rect_in_rect_ui16(rc, rc_win)) {
if (window->index == idx) {
color_t swp = color_text;
color_text = color_back;
color_back = swp;
swap = ROPFN_SWAPBW;
}
if (id_icon) {
rect_ui16_t irc = { rc.x, rc.y,
window->icon_rect.w, window->icon_rect.h };
rc.x += irc.w;
rc.w -= irc.w;
render_icon_align(irc, id_icon,
window->color_back, RENDER_FLG(ALIGN_CENTER, swap));
} else {
padding.left += window->icon_rect.w;
}
// render
render_text_align(rc, label, window->font,
color_back, color_text,
padding, window->alignment);
}
}
rc_win.h = rc_win.h - (i * item_height);
if (rc_win.h) {
rc_win.y += i * item_height;
display->fill_rect(rc_win, window->color_back);
}
}
void window_list_event(window_list_t* window, uint8_t event, void* param)
{
switch (event) {
case WINDOW_EVENT_BTN_DN:
window_set_capture(window->win.id_parent);
break;
case WINDOW_EVENT_ENC_DN:
window_list_dec(window, (int)param);
break;
case WINDOW_EVENT_ENC_UP:
window_list_inc(window, (int)param);
break;
case WINDOW_EVENT_CAPT_1:
//TODO: change flag to checked
break;
}
}
void window_list_inc(window_list_t* window, int dif)
{
int item_height = window->font->h + window->padding.top + window->padding.bottom;
int visible_count = window->win.rect.h / item_height;
int old = window->index;
window->index += dif;
if (window->index < 0) {
window->index = 0;
}
if (window->index >= window->count) {
window->index = window->count - 1;
}
if (window->index < window->top_index) {
window->top_index = window->index;
}
if (window->index >= (window->top_index + visible_count)) {
window->top_index = window->index - visible_count + 1;
}
if (window->index != old) {
// optimalization do not redraw when no change - still on end
_window_invalidate((window_t*)window);
}
}
void window_list_dec(window_list_t* window, int dif)
{
window_list_inc(window, -dif);
}
const window_class_list_t window_class_list = {
{
WINDOW_CLS_LIST,
sizeof(window_list_t),
(window_init_t*)window_list_init,
(window_done_t*)window_list_done,
(window_draw_t*)window_list_draw,
(window_event_t*)window_list_event,
},
};