ui/common/context.c

changeset 553
90e38db0c755
parent 507
7f380a3ac9a1
child 557
e6415fd4af4b
--- a/ui/common/context.c	Sun Apr 06 08:50:27 2025 +0200
+++ b/ui/common/context.c	Sun Apr 06 13:28:35 2025 +0200
@@ -120,11 +120,12 @@
     CxMapIterator mi = cxMapIterator(ctx->vars);
     cx_foreach(CxMapEntry*, entry, mi) {
         UiVar *var = entry->value;
-        if(var->from && var->from_ctx && var->from_ctx != ctx) {
+        // var->from && var->from_ctx && var->from_ctx != ctx
+        if(var->from) {
             uic_save_var2(var);
             uic_copy_binding(var, var->from, FALSE);
-            cxMapPut(var->from_ctx->vars_unbound, *entry->key, var->from);
-            var->from_ctx = ctx;
+            cxMapPut(var->from->from_ctx->vars_unbound, *entry->key, var->from);
+            var->from = NULL;
         }
     }
     
@@ -209,6 +210,7 @@
     var = ui_malloc(ctx, sizeof(UiVar));
     var->type = type;
     var->value = uic_create_value(ctx, type);
+    var->original_value = NULL;
     var->from = NULL;
     var->from_ctx = ctx;
 
@@ -227,6 +229,7 @@
     var->from = NULL;
     var->from_ctx = ctx;
     var->value = value;
+    var->original_value = NULL;
     var->type = UI_VAR_SPECIAL;
     return var;
 }
@@ -286,10 +289,19 @@
     }
     
     void *fromvalue = from->value;
+    void *tovalue = to->value;
     // update var
     if(copytodoc) {
-        to->from = from;
-        to->from_ctx = from->from_ctx;
+        to->from = from; // from which UiVar are the bindings copied
+        from->original_value = fromvalue; // save original value otherwise it would be lost
+        // widgets store a reference to the UiVar with their value
+        // the UiVar object must be updated to contain the current value object
+        from->value = tovalue;
+    } else {
+        if(to->original_value) {
+            to->value = to->original_value;
+            tovalue = to->value;
+        }
     }
     
     ui_setop_enable(TRUE);
@@ -301,7 +313,7 @@
         case UI_VAR_SPECIAL: break;
         case UI_VAR_INTEGER: {
             UiInteger *f = fromvalue;
-            UiInteger *t = to->value;
+            UiInteger *t = tovalue;
             if(!f->obj) break;
             uic_int_copy(f, t);
             t->set(t, t->value);
@@ -309,7 +321,7 @@
         }
         case UI_VAR_DOUBLE: {
             UiDouble *f = fromvalue;
-            UiDouble *t = to->value;
+            UiDouble *t = tovalue;
             if(!f->obj) break;
             uic_double_copy(f, t);
             t->set(t, t->value);
@@ -317,48 +329,32 @@
         }
         case UI_VAR_STRING: {
             UiString *f = fromvalue;
-            UiString *t = to->value;
+            UiString *t = tovalue;
             if(!f->obj) break;
             uic_string_copy(f, t);
             char *tvalue = t->value.ptr ? t->value.ptr : "";
+            char *fvalue = f->value.ptr ? f->value.ptr : "";
             t->set(t, tvalue);
             break;
         }
         case UI_VAR_TEXT: {
             UiText *f = fromvalue;
-            UiText *t = to->value;
+            UiText *t = tovalue;
             if(!f->obj) break;
             uic_text_copy(f, t);
             t->restore(t);
             break;
         }
-        case UI_VAR_LIST: {
-            // TODO: not sure how correct this is
-
-            UiList *f = from->value;
-            UiList *t = to->value;
-            if (f->obj) {
-                t->obj = f->obj;
-                t->update = f->update;
-                t->getselection = f->getselection;
-                t->setselection = f->setselection;
-            }
-
-            UiVar tmp = *from;
-            *from = *to;
-            *to = tmp;
-
-            UiList* t2 = to->value;
-            if(t->update) {
-                t->update(t, -1);
-            }
-            ui_notify(t2->observers, NULL); // TODO: why not t?
-            
+        case UI_VAR_LIST: {         
+            UiList *f = fromvalue;
+            UiList *t = tovalue;
+            uic_list_copy(f, t);
+            ui_list_update(t);
             break;
         }
         case UI_VAR_RANGE: {
             UiRange *f = fromvalue;
-            UiRange *t = to->value;
+            UiRange *t = tovalue;
             if(!f->obj) break;
             uic_range_copy(f, t);
             t->setextent(t, t->extent);
@@ -368,7 +364,7 @@
         }
         case UI_VAR_GENERIC: {
             UiGeneric *f = fromvalue;
-            UiGeneric *t = to->value;
+            UiGeneric *t = tovalue;
             if(!f->obj) break;
             uic_generic_copy(f, t);
             t->set(t, t->value, t->type);

mercurial