ui/win32/list.c

changeset 918
7d3dd5aacfda
parent 917
ca3918f9c96b
child 919
d9018dcd4e2d
--- 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);
     }
 }
 

mercurial