ui/common/types.c

changeset 1168
2f9d8af6a499
parent 1142
e2a6707aa1e0
child 1172
e1c1559f2522
--- a/ui/common/types.c	Thu Jun 04 19:22:54 2026 +0200
+++ b/ui/common/types.c	Thu Jun 04 19:59:58 2026 +0200
@@ -121,6 +121,7 @@
     UiList *list = ui_malloc(ctx, sizeof(UiList));
     memset(list, 0, sizeof(UiList));
     listinit(ctx, list, userdata);
+    list->save_selection = TRUE;
     
     if(name && ctx) {
         uic_reg_var(ctx, name, UI_VAR_LIST, list);
@@ -137,6 +138,7 @@
     } else {
         default_list_destroy(ctx, list, default_list_destroy_userdata);
     }
+    ui_list_selection_free(list->saved_selection);
     ui_free(ctx, list);
 }
 
@@ -219,6 +221,11 @@
     ui_notify(list->observers, list);
 }
 
+void ui_list_clear_saved_selection(UiList *list) {
+    ui_list_selection_free(list->saved_selection);
+    list->saved_selection = NULL;
+}
+
 
 typedef struct {
     int  type;
@@ -806,6 +813,15 @@
 }
 
 void uic_list_unbind(UiList *l) {
+    // save selection
+    ui_list_selection_free(l->saved_selection);
+    if(l->getselection && l->save_selection) {
+        l->saved_selection = ui_list_get_selection_allocated(l);
+    } else {
+        l->saved_selection = NULL;
+    }
+    
+    // unbind
     l->update = NULL;
     l->getselection = NULL;
     l->setselection = NULL;
@@ -820,6 +836,23 @@
 }
 
 
+
+UiListSelection* ui_list_get_selection_allocated(UiList *list) {
+    UiListSelection *sel = malloc(sizeof(UiListSelection));
+    *sel = ui_list_get_selection(list);
+    return sel;
+    
+}
+
+void ui_list_selection_free(UiListSelection *sel) {
+    if(!sel) {
+        return;
+    }
+    ui_listselection_free(*sel);
+    free(sel);
+}
+
+
 UIEXPORT int ui_list_getselection(UiList *list) {
     int selection = -1;
     if (list->getselection) {

mercurial