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

@@ -786,6 +786,16 @@ U0 @compositor_handle_window_input_events(Window* win)
}
}
}
if (win->focused_widget->type == WIDGET_TYPE_LISTVIEW) {
if (@widget_listview_handle_key(win->focused_widget)) {
msg = CAlloc(sizeof(IpcMessage));
System.Log(Fs, "Sent message → WinKeyPress");
msg->client = win->client;
msg->type = CPZ_MSG_WIN_KEY_PRESS;
msg->payload = win;
Ipc.MsgSend(msg->client, msg);
}
}
}
if (Mouse.z != Compositor.mouse.delta_z) {

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;
}