From dac924c707110e59c0e6d972ec69e1e11f7c55b9 Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Thu, 25 Sep 2025 08:24:27 -0400 Subject: [PATCH] System/Libraries/Widget: Initial support for ListViewWidget --- System/Core/Compositor.HC | 10 +++++++ System/Libraries/Widget.HC | 56 ++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/System/Core/Compositor.HC b/System/Core/Compositor.HC index b3d1ec0..981884f 100644 --- a/System/Core/Compositor.HC +++ b/System/Core/Compositor.HC @@ -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) { diff --git a/System/Libraries/Widget.HC b/System/Libraries/Widget.HC index f63f009..931aa4d 100644 --- a/System/Libraries/Widget.HC +++ b/System/Libraries/Widget.HC @@ -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; }