ui/motif/tree.c

changeset 153
ee49d1852a5f
parent 128
c284c15509a8
child 157
0b33b9396851
--- a/ui/motif/tree.c	Sun Jan 21 12:13:09 2018 +0100
+++ b/ui/motif/tree.c	Sun Jul 01 19:03:26 2018 +0200
@@ -38,7 +38,7 @@
 #include "../common/context.h"
 #include "../../ucx/utils.h"
 
-UIWIDGET ui_table(UiObject *obj, UiList *model, UiModelInfo *modelinfo) {
+UIWIDGET ui_table_var(UiObject *obj, UiVar *var, UiModel *model, UiListCallbacks cb) {
     // TODO: check if modelinfo is complete
     
     Arg args[32];
@@ -58,14 +58,14 @@
     
     // create table headers
     XmStringTable header = (XmStringTable)XtMalloc(
-            modelinfo->columns * sizeof(XmString));
-    for(int i=0;i<modelinfo->columns;i++) {
-        header[i] = XmStringCreateLocalized(modelinfo->titles[i]);
+            model->columns * sizeof(XmString));
+    for(int i=0;i<model->columns;i++) {
+        header[i] = XmStringCreateLocalized(model->titles[i]);
     }
     n = 0;
     XtSetArg(args[n], XmNdetailColumnHeading, header);
     n++;
-    XtSetArg(args[n], XmNdetailColumnHeadingCount, modelinfo->columns);
+    XtSetArg(args[n], XmNdetailColumnHeadingCount, model->columns);
     n++;
     
     // set res
@@ -88,18 +88,18 @@
     // add callbacks
     UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData));
     event->obj = obj;
-    event->activate = modelinfo->activate;
-    event->selection = modelinfo->selection;
-    event->userdata = modelinfo->userdata;
+    event->activate = cb.activate;
+    event->selection = cb.selection;
+    event->userdata = cb.userdata;
     event->last_selection = NULL;
-    if(modelinfo->selection) {
+    if(cb.selection) {
         XtAddCallback(
                 container,
                 XmNselectionCallback,
                 (XtCallbackProc)ui_table_select_callback,
                 event);
     }
-    if(modelinfo->activate) {
+    if(cb.activate) {
         XtAddCallback(
                 container,
                 XmNdefaultActionCallback,
@@ -108,30 +108,27 @@
     }
     
     // add initial data
-    void *data = model->first(model);
+    UiList *list = var->value;
+    void *data = list->first(list);
     int width = 0;
     while(data) {
-        int w = ui_add_icon_gadget(container, modelinfo, data);
+        int w = ui_add_icon_gadget(container, model, data);
         if(w > width) {
             width = w;
         }
-        data = model->next(model);
+        data = list->next(list);
     }
     
     UiTableView *tableview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiTableView));
     tableview->widget = container;
-    tableview->list = model;
-    tableview->modelinfo = modelinfo;
-    model->observers = ui_add_observer(
-            model->observers,
-            (ui_callback)ui_table_update,
-            tableview);
+    tableview->var = var;
+    tableview->model = model;
     
     // set new XmContainer width
     XtVaSetValues(container, XmNwidth, width, NULL);
     
     // cleanup
-    for(int i=0;i<modelinfo->columns;i++) {
+    for(int i=0;i<model->columns;i++) {
         XmStringFree(header[i]);
     }
     XtFree((char*)header);
@@ -139,6 +136,13 @@
     return scrollw;
 }
 
+UIWIDGET ui_table(UiObject *obj, UiList *data, UiModel *model, UiListCallbacks cb) {
+    UiVar *var = malloc(sizeof(UiVar));
+    var->value = data;
+    var->type = UI_VAR_SPECIAL;
+    return ui_table_var(obj, var, model, cb);
+}
+
 void ui_table_update(UiEvent *event, UiTableView *view) {
     // clear container
     Widget *children;
@@ -156,26 +160,26 @@
         XtDestroyWidget(children[i]);
     }
     
-    UiList *model = view->list;
+    UiList *list = view->var->value;
     
-    void *data = model->first(model);
+    void *data = list->first(list);
     int width = 0;
     while(data) {
-        int w = ui_add_icon_gadget(view->widget, view->modelinfo, data);
+        int w = ui_add_icon_gadget(view->widget, view->model, data);
         if(w > width) {
             width = w;
         }
-        data = model->next(model);
+        data = list->next(list);
     }
     
 }
 
 #define UI_COL_CHAR_WIDTH 12
 
-int ui_add_icon_gadget(Widget container, UiModelInfo *modelinfo, void *data) {
+int ui_add_icon_gadget(Widget container, UiModel *model, void *data) {
     int width = 50;
     
-    if(modelinfo->columns == 0) {
+    if(model->columns == 0) {
         return width;
     }
     
@@ -183,10 +187,10 @@
     Arg args[8];
     Boolean f;
     // first column
-    if(modelinfo->types[0] != 12345678) { // TODO: icon/label type
+    if(model->types[0] != 12345678) { // TODO: icon/label type
         char *str = ui_type_to_string(
-                modelinfo->types[0],
-                modelinfo->getvalue(data, 0),
+                model->types[0],
+                model->getvalue(data, 0),
                 &f);
         
         // column width
@@ -204,11 +208,11 @@
             
     // remaining columns are the icon gadget details
     XmStringTable details = (XmStringTable)XtMalloc(
-            (modelinfo->columns - 1) * sizeof(XmString));
-    for(int i=1;i<modelinfo->columns;i++) {
+            (model->columns - 1) * sizeof(XmString));
+    for(int i=1;i<model->columns;i++) {
         char *str = ui_type_to_string(
-                modelinfo->types[i],
-                modelinfo->getvalue(data, i),
+                model->types[i],
+                model->getvalue(data, i),
                 &f);
         
         // column width
@@ -220,7 +224,7 @@
         }
     }
     XtSetArg(args[1], XmNdetail, details);
-    XtSetArg(args[2], XmNdetailCount, modelinfo->columns - 1);
+    XtSetArg(args[2], XmNdetailCount, model->columns - 1);
     XtSetArg(args[3], XmNshadowThickness, 0); 
     // create widget
     Widget item = XmCreateIconGadget(container, "table_item", args, 4);
@@ -228,7 +232,7 @@
     
     // cleanup
     XmStringFree(label);
-    for(int i=0;i<modelinfo->columns-1;i++) {
+    for(int i=0;i<model->columns-1;i++) {
         XmStringFree(details[i]);
     }
     XtFree((char*)details);

mercurial