add sub-documents to bindings demo

Tue, 18 Nov 2025 18:54:53 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 18 Nov 2025 18:54:53 +0100
changeset 915
ddbbceb8c3a5
parent 914
4d5aa85bc5ed
child 916
6fdcf1cbbec9

add sub-documents to bindings demo

application/demo_bindings.c file | annotate | diff | comparison | revisions
application/demo_bindings.h file | annotate | diff | comparison | revisions
--- a/application/demo_bindings.c	Tue Nov 18 17:26:15 2025 +0100
+++ b/application/demo_bindings.c	Tue Nov 18 18:54:53 2025 +0100
@@ -43,11 +43,25 @@
     
     doc->id = ui_string_new(ctx, "id");
     doc->name = ui_string_new(ctx, "name");
-    
     doc->input_name = ui_string_new(ctx, "input_name");
+    doc->subdocuments = ui_list_new(ctx, "subdocuments");
     
     ui_set(doc->id, buf);
     
+    // create some sub documents
+    for(int i=0;i<3;i++) {
+        SubDocument *sub = ui_document_new(sizeof(SubDocument));
+        UiContext *subctx = ui_document_context(sub);
+        sub->id = ui_string_new(subctx, "sub_id");
+        sub->name = ui_string_new(subctx, "sub_name");
+        sub->input_name = ui_string_new(subctx, "sub_input_name");
+        
+        snprintf(buf, 32, "%d.%d", id, i);
+        ui_set(sub->id, buf);
+        
+        ui_list_append(doc->subdocuments, sub);
+    }
+    
     return doc;
 }
 
@@ -76,11 +90,36 @@
     }
 }
 
+void switch_subdocument(UiEvent *event, void *userdata) {
+    MainWindow *wdata = event->window;
+    Document *doc = event->document;
+    UiContext *ctx = ui_document_context(doc);
+    if(doc->current_sub) {
+        ui_detach_document(ctx, doc->current_sub);
+        doc->current_sub = NULL;
+    }
+    
+    SubDocument *sub = ui_list_get(doc->subdocuments, event->intval);
+    if(sub) {
+        char *s1 = ui_get(sub->id);
+        char *s2 = ui_get(sub->name);
+        printf("sub %s - %s\n", s1, s2);
+        ui_attach_document(ctx, sub);
+        doc->current_sub = sub;
+        
+    }
+}
+
 void* doclist_get_value(void *elm, int col) {
     Document *doc = elm;
     return ui_get(doc->id);
 }
 
+void* sublist_get_value(void *elm, int col) {
+    SubDocument *doc = elm;
+    return ui_get(doc->id);
+}
+
 void application_startup(UiEvent *event, void *data) {
     UiObject *obj = ui_simple_window("Bindings Demo", NULL);
     MainWindow *wdata = ui_malloc(obj->ctx, sizeof(MainWindow));
@@ -97,12 +136,24 @@
         ui_llabel(obj, .varname = "name", .hfill = TRUE, .hexpand = TRUE, .vfill = TRUE);
         ui_newline(obj);
         
+        ui_rlabel(obj, .label = "Sub Document:");
+        ui_llabel(obj, .varname = "sub_id", .hfill = TRUE, .hexpand = TRUE, .vfill = TRUE);
+        ui_newline(obj);
+        
+        ui_rlabel(obj, .label = "Name:");
+        ui_llabel(obj, .varname = "sub_name", .hfill = TRUE, .hexpand = TRUE, .vfill = TRUE);
+        ui_newline(obj);
+        
         ui_combobox(obj, .varname = "doclist", .colspan = 2, .onactivate = switch_document, .getvalue = doclist_get_value, .colspan = 2, .hfill = TRUE);
         ui_newline(obj);
         
         ui_frame(obj, .label = "Document", .colspan = 2, .fill = TRUE, .subcontainer = UI_CONTAINER_GRID, .columnspacing = 10, .rowspacing = 10, .padding = 10) {
             ui_rlabel(obj, .label = "Name:", .vfill = TRUE);
             ui_textfield(obj, .varname = "input_name", .onchange = update_name);
+            ui_newline(obj);
+            ui_separator(obj, .colspan = 2, .hfill = TRUE);
+            ui_newline(obj);
+            ui_combobox(obj, .varname = "subdocuments", .getvalue = sublist_get_value, .onactivate = switch_subdocument, .colspan = 2, .hfill = TRUE);
         }
     }
     
--- a/application/demo_bindings.h	Tue Nov 18 17:26:15 2025 +0100
+++ b/application/demo_bindings.h	Tue Nov 18 18:54:53 2025 +0100
@@ -32,9 +32,22 @@
     UiList *doclist;
 } MainWindow;
 
+typedef struct SubDocument SubDocument;
+
 typedef struct Document {
     UiString *id;
     UiString *name;
     
     UiString *input_name;
+    
+    UiList *subdocuments;
+    SubDocument *current_sub;
 } Document;
+
+struct SubDocument {
+    UiString *id;
+    UiString *name;
+    
+    UiString *input_name;
+};
+

mercurial