fix sourcelist dynamic update (Cocoa)

Mon, 01 Jun 2026 20:07:13 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 01 Jun 2026 20:07:13 +0200
changeset 1156
cc488843c92b
parent 1155
066fc6df92d1
child 1157
0a9f4d689c12

fix sourcelist dynamic update (Cocoa)

make/xcode/toolkit/toolkit/main.m file | annotate | diff | comparison | revisions
ui/cocoa/list.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sun May 31 14:09:31 2026 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Mon Jun 01 20:07:13 2026 +0200
@@ -45,6 +45,8 @@
     UiList *sidebar_list2;
     UiString *link;
     UiGeneric *webview;
+    
+    UiList *srclist;
 } MyDocument;
 
 MyDocument* create_doc(void) {
@@ -83,6 +85,8 @@
     doc->link = ui_string_new(ctx, "link");
     doc->webview = ui_generic_new(ctx, "webview");
     
+    doc->srclist = ui_list_new(ctx, "srclist");
+    
     return doc;
 }
 
@@ -145,6 +149,19 @@
     printf("textfield changed\n");
 }
 
+static void init_sourcelist(MyDocument *doc) {
+    UiContext *ctx = ui_document_context(doc);
+    
+    UiSubList *sublist0 = calloc(1, sizeof(UiSubList));
+    sublist0->header = "iCloud";
+    sublist0->value = ui_list_new(ctx, NULL);
+    ui_list_append(sublist0->value, "Hello");
+    
+    ui_list_append(doc->srclist, sublist0);
+    
+    ui_list_update(doc->srclist);
+}
+
 void application_startup(UiEvent *event, void *data) {
     UiObject *obj = ui_splitview_window("My Window", TRUE);
     //WindowData *wdata = ui_malloc(obj->ctx, sizeof(WindowData));
@@ -167,9 +184,11 @@
     sublist[1].varname = NULL;
     sublist[1].userdata = NULL;
     ui_sidebar(obj) {
-        ui_sourcelist(obj, .fill = TRUE, .sublists = sublist, .numsublists = 2);
+        ui_sourcelist(obj, .fill = TRUE, .dynamic_sublist = doc->srclist);
     }
     
+    init_sourcelist(doc);
+    
     
     ui_left_panel0(obj) {
         ui_grid(obj, .margin_left = 10, .margin_right = 10, .columnspacing = 10, .rowspacing = 10, .fill = TRUE) {
--- a/ui/cocoa/list.m	Sun May 31 14:09:31 2026 +0200
+++ b/ui/cocoa/list.m	Mon Jun 01 20:07:13 2026 +0200
@@ -508,18 +508,37 @@
     
     [_sections removeAllObjects];
     
-    CxIterator i = cxListIterator(_sublists);
-    int index = 0;
-    int rownum = 0;
-    cx_foreach(UiSubList *, sl, i) {
-        UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl];
-        section.sublistIndex = index;
-        section.rownum = rownum;
-        section.sublistStartRow = rownum;
-        [section update:-1];
-        [_sections addObject:section];
-        index++;
-        rownum += 1 + section.items.count;
+    if(_sublists) {
+        CxIterator i = cxListIterator(_sublists);
+        int index = 0;
+        int rownum = 0;
+        cx_foreach(UiSubList *, sl, i) {
+            UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl];
+            section.sublistIndex = index;
+            section.rownum = rownum;
+            section.sublistStartRow = rownum;
+            [section update:-1];
+            [_sections addObject:section];
+            index++;
+            rownum += 1 + section.items.count;
+        }
+    } else if (_dynamic_sublists) {
+        UiList *sublists = _dynamic_sublists->value;
+        UiSubList *sl = sublists->first(sublists);
+        int index = 0;
+        int rownum = 0;
+        while(sl) {
+            UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl];
+            section.sublistIndex = index;
+            section.rownum = rownum;
+            section.sublistStartRow = rownum;
+            [section update:-1];
+            [_sections addObject:section];
+            index++;
+            rownum += 1 + section.items.count;
+            
+            sl = sublists->next(sublists);
+        }
     }
     
     [_outlineView reloadData];

mercurial