Wed, 19 Nov 2025 12:17:59 +0100
implement single row listview update (Win32)
| ui/win32/list.c | file | annotate | diff | comparison | revisions | |
| ui/win32/toolkit.c | file | annotate | diff | comparison | revisions |
--- 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); } }
--- a/ui/win32/toolkit.c Wed Nov 19 11:41:33 2025 +0100 +++ b/ui/win32/toolkit.c Wed Nov 19 12:17:59 2025 +0100 @@ -62,8 +62,6 @@ uic_toolbar_init(); uic_load_app_properties(); - ui_window_init(); - INITCOMMONCONTROLSEX icex = { sizeof(icex), ICC_WIN95_CLASSES | ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES | ICC_BAR_CLASSES | ICC_TAB_CLASSES @@ -75,6 +73,8 @@ NONCLIENTMETRICS ncm = { sizeof(ncm) }; SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, FALSE); ui_font = CreateFontIndirect(&ncm.lfMessageFont); + + ui_window_init(); } HFONT ui_win32_get_font(void) { @@ -129,6 +129,8 @@ } LRESULT CALLBACK ui_default_eventproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + printf("default event proc: %d, %d\n", (int)hwnd, (int)uMsg); + fflush(stdout); W32Widget *widget = (W32Widget*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (widget && widget->wclass->eventproc) { widget->wclass->eventproc(widget, hwnd, uMsg, wParam, lParam);