--- a/ui/win32/list.c Wed Nov 19 11:41:33 2025 +0100 +++ b/ui/win32/list.c Wed Nov 19 12:17:59 2025 +0100 @@ -54,7 +54,7 @@ static UiListView* create_listview_widget(UiObject *obj, HWND hwnd, UiListArgs *args, UiBool table) { - UiListView *listview = w32_widget_create(&listview_widget_class, hwnd, sizeof(UiWidget)); + UiListView *listview = w32_widget_create(&listview_widget_class, hwnd, sizeof(UiListView)); listview->widget.hwnd = hwnd; listview->preferred_width = args->width ? args->width : 300; listview->preferred_height = args->height ? args->height : 300; @@ -94,7 +94,6 @@ HWND parent = ui_container_get_parent(container); UiLayout layout = UI_ARGS2LAYOUT(args); - int type = table ? LVS_REPORT : LVS_LIST; HWND hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, WC_LISTVIEW, @@ -102,7 +101,7 @@ WS_CHILD | WS_VISIBLE | LVS_REPORT, 0, 0, 100, 100, parent, - (HMENU)1, + (HMENU)1337, hInstance, NULL); ui_win32_set_ui_font(hwnd); @@ -131,7 +130,6 @@ numcolumns = 1; } - ///* UiModel *model = listview->model; for (int i=0;i<numcolumns;i++) { LVCOLUMN col; @@ -178,6 +176,32 @@ return size; } +static void insert_item(UiList *list, int row, void *elm) { + UiListView *listview = (UiListView*)list->obj; + HWND hwnd = listview->widget.hwnd; + UiModel *model = listview->model; + + LVITEM item; + item.mask = LVIF_TEXT; + item.iItem = row; + item.iSubItem = 0; + int idx = -1; + for (int col=0;col<model->columns;col++) { + UiBool freeResult = FALSE; + char *str = listview->getvalue(list, elm, row, col, listview->getvaluedata, &freeResult); + if (col == 0) { + item.pszText = str; + idx = ListView_InsertItem(hwnd, &item); + } else { + ListView_SetItemText(hwnd, idx, col, str); + } + + if (freeResult) { + free(str); + } + } +} + void ui_listview_update(UiList *list, int row) { UiListView *listview = (UiListView*)list->obj; HWND hwnd = listview->widget.hwnd; @@ -187,35 +211,18 @@ void *elm = list->first(list); int row = 0; while (elm) { - LVITEM item; - item.mask = LVIF_TEXT; - item.iItem = row; - item.iSubItem = 0; - int idx = -1; - for (int col=0;col<model->columns;col++) { - UiBool freeResult = FALSE; - char *str = listview->getvalue(list, elm, row, col, listview->getvaluedata, &freeResult); - if (col == 0) { - item.pszText = str; - idx = ListView_InsertItem(hwnd, &item); - } else { - ListView_SetItemText(hwnd, idx, col, str); - } - - if (freeResult) { - free(str); - } - } - + insert_item(list, row, elm); elm = list->next(list); row++; } + } else { + ListView_DeleteItem(hwnd, row); + void *elm = list->get(list, row); + insert_item(list, row, elm); + } - for (int i=0;i<model->columns;i++) { - ListView_SetColumnWidth(hwnd, i, LVSCW_AUTOSIZE); - } - } else { - // TODO + for (int i=0;i<model->columns;i++) { + ListView_SetColumnWidth(hwnd, i, LVSCW_AUTOSIZE); } }