diff -r 62921b370c60 -r ee49d1852a5f ui/motif/tree.c --- 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;icolumns;i++) { - header[i] = XmStringCreateLocalized(modelinfo->titles[i]); + model->columns * sizeof(XmString)); + for(int i=0;icolumns;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;icolumns;i++) { + for(int i=0;icolumns;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;icolumns;i++) { + (model->columns - 1) * sizeof(XmString)); + for(int i=1;icolumns;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;icolumns-1;i++) { + for(int i=0;icolumns-1;i++) { XmStringFree(details[i]); } XtFree((char*)details);