ui/motif/list.c

changeset 153
ee49d1852a5f
parent 122
e82b01d17a78
child 176
bc63cb601f6d
--- a/ui/motif/list.c	Sun Jan 21 12:13:09 2018 +0100
+++ b/ui/motif/list.c	Sun Jul 01 19:03:26 2018 +0200
@@ -44,11 +44,9 @@
     return ui_listview(obj, list, ui_strmodel_getvalue, f, udata);
 }
 
-UIWIDGET ui_listview_var(UiObject *obj, UiListPtr *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) {
-    UiList *ls = list->list;
-    
+UIWIDGET ui_listview_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
     int count;
-    XmStringTable items = ui_create_stringlist(list->list, getvalue, &count);
+    XmStringTable items = ui_create_stringlist(var->value, getvalue, &count);
     
     Arg args[8];
     int n = 0;
@@ -65,14 +63,9 @@
     
     UiListView *listview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListView));
     listview->widget = widget;
-    listview->list = list;
+    listview->list = var;
     listview->getvalue = getvalue;
     
-    list->list->observers = ui_add_observer(
-            list->list->observers,
-            (ui_callback)ui_listview_update,
-            listview);
-    
     for (int i=0;i<count;i++) {
         XmStringFree(items[i]);
     }
@@ -86,7 +79,7 @@
         event->event.userdata = udata;
         event->event.callback = f;
         event->event.value = 0;
-        event->list = list;
+        event->var = var;
         XtAddCallback(
                 widget,
                 XmNdefaultActionCallback,
@@ -97,17 +90,18 @@
     return widget;
 }
 
-UIWIDGET ui_listview(UiObject *obj, UiList *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) {
-    UiListPtr *listptr = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListPtr));
-    listptr->list = list;
-    return ui_listview_var(obj, listptr, getvalue, f, udata);
+UIWIDGET ui_listview(UiObject *obj, UiList *list, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
+    UiVar *var = malloc(sizeof(UiVar));
+    var->value = list;
+    var->type = UI_VAR_SPECIAL;
+    return ui_listview_var(obj, var, getvalue, f, udata);
 }
 
-UIWIDGET ui_listview_nv(UiObject *obj, char *varname, ui_model_getvalue_f getvalue, ui_callback f, void *udata) {
-    UiVar *var = uic_connect_var(obj->ctx, varname, UI_VAR_LIST);
+UIWIDGET ui_listview_nv(UiObject *obj, char *varname, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
+    UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST);
     if(var) {
         UiListVar *value = var->value;
-        return ui_listview_var(obj, value->listptr, getvalue, f, udata);
+        return ui_listview_var(obj, var, getvalue, f, udata);
     } else {
         // TODO: error
     }
@@ -115,7 +109,7 @@
 }
 
 
-XmStringTable ui_create_stringlist(UiList *list, ui_model_getvalue_f getvalue, int *count) { 
+XmStringTable ui_create_stringlist(UiList *list, ui_getvaluefunc getvalue, int *count) { 
     int num = list->count(list);
     XmStringTable items = (XmStringTable)XtMalloc(num * sizeof(XmString));
     void *data = list->first(list);
@@ -132,7 +126,7 @@
 void ui_listview_update(UiEvent *event, UiListView *view) {
     int count;
     XmStringTable items = ui_create_stringlist(
-            view->list->list,
+            view->list->value,
             view->getvalue,
             &count);
     
@@ -156,7 +150,8 @@
     e.obj = event->event.obj;
     e.window = event->event.obj->window;
     e.document = event->event.obj->ctx->document;
-    e.eventdata = event->list->list->get(event->list->list, cbs->item_position - 1);
+    UiList *list = event->var->value;
+    e.eventdata = list->get(list, cbs->item_position - 1);
     e.intval = cbs->item_position - 1;
     event->event.callback(&e, event->event.userdata);
 }
@@ -168,24 +163,25 @@
     return ui_combobox(obj, list, ui_strmodel_getvalue, f, udata);
 }
 
-UIWIDGET ui_combobox(UiObject *obj, UiList *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) {
-    UiListPtr *listptr = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListPtr));
-    listptr->list = list;
-    return ui_combobox_var(obj, listptr, getvalue, f, udata);
+UIWIDGET ui_combobox(UiObject *obj, UiList *list, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
+    UiVar *var = malloc(sizeof(UiVar));
+    var->value = list;
+    var->type = UI_VAR_SPECIAL;
+    return ui_combobox_var(obj, var, getvalue, f, udata);
 }
 
-UIWIDGET ui_combobox_nv(UiObject *obj, char *varname, ui_model_getvalue_f getvalue, ui_callback f, void *udata) {
-    UiVar *var = uic_connect_var(obj->ctx, varname, UI_VAR_LIST);
+UIWIDGET ui_combobox_nv(UiObject *obj, char *varname, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
+    UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST);
     if(var) {
         UiListVar *value = var->value;
-        return ui_combobox_var(obj, value->listptr, getvalue, f, udata);
+        return ui_combobox_var(obj, var, getvalue, f, udata);
     } else {
         // TODO: error
     }
     return NULL;
 }
 
-UIWIDGET ui_combobox_var(UiObject *obj, UiListPtr *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) {
+UIWIDGET ui_combobox_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata) {
     UiListView *listview = ucx_mempool_malloc(
                 obj->ctx->mempool,
                 sizeof(UiListView));
@@ -203,14 +199,9 @@
     Widget combobox = XmCreateDropDownList(parent, "combobox", args, n);
     XtManageChild(combobox);
     listview->widget = combobox;
-    listview->list = list;
+    listview->list = var;
     listview->getvalue = getvalue;
     
     ui_listview_update(NULL, listview);
     
-    list->list->observers = ui_add_observer(
-            list->list->observers,
-            (ui_callback)ui_listview_update,
-            listview);
-    
 }

mercurial