System/Libraries/Widget: Initial support for ListViewWidget

This commit is contained in:
Alec Murphy
2025-09-25 08:24:27 -04:00
parent ea44c28461
commit dac924c707
2 changed files with 55 additions and 11 deletions

View File

@@ -232,18 +232,12 @@ class VerticalScrollBarWidget : Widget {
I64 value;
};
class @list_view_item
{
@list_view_item* prev;
@list_view_item* next;
Context2D* icon;
U8 text[1024];
};
class ListViewWidget : Widget {
BitmapFont* font;
U32 color;
@list_view_item* items;
I64 index;
JsonArray* columns;
JsonArray* items;
};
class TabPanelTab {
@@ -650,6 +644,42 @@ Bool @widget_input_handle_key(BitmapFontTextInputWidget* widget)
return FALSE;
}
U0 @widget_listview_select_row(ListViewWidget* widget)
{
if (widget->index > -1 && widget->items && widget->items->length && widget->index < widget->items->length) {
widget->items->o(widget->index)->set("selected", 1);
}
}
Bool @widget_listview_handle_key(ListViewWidget* widget)
{
I64 key = Keyboard.active_key;
I64 tS = Keyboard.active_key_tS;
I64 i;
if (key && tS != Keyboard.last_key_tS) {
if (!KeyDown(SC_SHIFT)) {
// Clear selection
for (i = 0; i < widget->items->length; i++) {
widget->items->o(i)->set("selected", 0);
}
}
switch (key) {
case SC_CURSOR_UP:
widget->index = Max(0, widget->index - 1);
@widget_listview_select_row(widget);
break;
case SC_CURSOR_DOWN:
widget->index = Min(widget->items->length - 1, widget->index + 1);
@widget_listview_select_row(widget);
break;
default:
break;
}
return TRUE;
}
return FALSE;
}
Widget* @widget_create_widget(Window* win, I64 type, I64 x, I64 y, I64 width,
I64 height)
{
@@ -750,7 +780,9 @@ Widget* @widget_create_widget(Window* win, I64 type, I64 x, I64 y, I64 width,
break;
case WIDGET_TYPE_LISTVIEW:
widget(ListViewWidget*)->color = Color(0, 0, 0);
widget(ListViewWidget*)->items = CAlloc(sizeof(@list_view_item));
widget(ListViewWidget*)->columns = Json.CreateArray(Fs);
widget(ListViewWidget*)->items = Json.CreateArray(Fs);
widget(ListViewWidget*)->index = -1;
break;
}
@@ -874,7 +906,9 @@ U0 @widget_init_widget(Widget* widget, Window* win, I64 type, I64 x, I64 y,
break;
case WIDGET_TYPE_LISTVIEW:
widget(ListViewWidget*)->color = Color(0, 0, 0);
widget(ListViewWidget*)->items = CAlloc(sizeof(@list_view_item));
widget(ListViewWidget*)->columns = Json.CreateArray(Fs);
widget(ListViewWidget*)->items = Json.CreateArray(Fs);
widget(ListViewWidget*)->index = -1;
break;
}