diff -r 29b2821d1262 -r 157a21a914ac ui/motif/tree.c --- a/ui/motif/tree.c Fri May 16 16:19:46 2014 +0200 +++ b/ui/motif/tree.c Fri May 16 17:39:45 2014 +0200 @@ -29,6 +29,7 @@ #include #include #include +#include #include "tree.h" @@ -68,11 +69,34 @@ Widget container = XmCreateContainer(parent, "table", args, n); XtManageChild(container); + // 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; + if(modelinfo->selection) { + XtAddCallback( + container, + XmNselectionCallback, + (XtCallbackProc)ui_table_select_callback, + event); + } + if(modelinfo->activate) { + XtAddCallback( + container, + XmNdefaultActionCallback, + (XtCallbackProc)ui_table_action_callback, + event); + } + // add initial data void *data = model->first(model); + int i = 0; while(data) { - ui_add_icon_gadget(container, modelinfo, data); + ui_add_icon_gadget(container, modelinfo, data, i); data = model->next(model); + i++; } // cleanup @@ -84,7 +108,12 @@ return container; } -void ui_add_icon_gadget(Widget container, UiModelInfo *modelinfo, void *data) { +void ui_add_icon_gadget( + Widget container, + UiModelInfo *modelinfo, + void *data, + int index) +{ if(modelinfo->columns == 0) { return; } @@ -122,9 +151,11 @@ } XtSetArg(args[1], XmNdetail, details); XtSetArg(args[2], XmNdetailCount, modelinfo->columns - 1); - + XtSetArg(args[3], XmNshadowThickness, 0); + intptr_t userdata = index; + XtSetArg(args[4], XmNuserData, userdata); // create widget - Widget item = XmCreateIconGadget(container, "table_item", args, 3); + Widget item = XmCreateIconGadget(container, "table_item", args, 5); XtManageChild(item); // cleanup @@ -148,3 +179,53 @@ *free = FALSE; return NULL; } + +void ui_table_action_callback( + Widget widget, + UiTreeEventData *event, + XmContainerSelectCallbackStruct *sel) +{ + UiListSelection *selection = malloc(sizeof(UiListSelection)); + selection->count = sel->selected_item_count; + selection->rows = calloc(selection->count, sizeof(int)); + for(int i=0;icount;i++) { + intptr_t index; + XtVaGetValues(sel->selected_items[i], XmNuserData, &index, NULL); + selection->rows[i] = index; + } + + UiEvent e; + e.obj = event->obj; + e.window = event->obj->window; + e.document = event->obj->document; + e.eventdata = selection; + e.intval = selection->count > 0 ? selection->rows[0] : -1; + event->activate(&e, event->userdata); + + free(selection); +} + +void ui_table_select_callback( + Widget widget, + UiTreeEventData *event, + XmContainerSelectCallbackStruct *sel) +{ + UiListSelection *selection = malloc(sizeof(UiListSelection)); + selection->count = sel->selected_item_count; + selection->rows = calloc(selection->count, sizeof(int)); + for(int i=0;icount;i++) { + intptr_t index; + XtVaGetValues(sel->selected_items[i], XmNuserData, &index, NULL); + selection->rows[i] = index; + } + + UiEvent e; + e.obj = event->obj; + e.window = event->obj->window; + e.document = event->obj->document; + e.eventdata = selection; + e.intval = selection->count > 0 ? selection->rows[0] : -1; + event->selection(&e, event->userdata); + + free(selection); +}