--- a/ui/motif/list.c Fri Feb 07 21:57:32 2025 +0100 +++ b/ui/motif/list.c Sat Feb 08 21:42:56 2025 +0100 @@ -196,3 +196,78 @@ void* ui_strmodel_getvalue(void *elm, int column) { return column == 0 ? elm : NULL; } + +/* ------------------------------- Drop Down ------------------------------- */ + +static void ui_dropdown_selection( + Widget w, + UiListView *listview, + XmComboBoxCallbackStruct *cb) +{ + UiListSelection sel = { 0, NULL }; + if(cb->item_position > 0) { + sel.count = 1; + sel.rows = malloc(sizeof(int)); + sel.rows[0] = cb->item_position-1; + } + UiEvent event; + event.obj = listview->obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.eventdata = &sel; + event.intval = 0; + if(listview->onactivate) { + listview->onactivate(&event, listview->onactivatedata); + } + if(listview->onselection) { + listview->onselection(&event, listview->onselectiondata); + } +} + +UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs args) { + Arg xargs[16]; + int n = 0; + + UiContainerPrivate *ctn = ui_obj_container(obj); + UI_APPLY_LAYOUT(ctn->layout, args); + + char *name = args.name ? (char*)args.name : "dropdown"; + Widget parent = ctn->prepare(ctn, xargs, &n); + Widget widget = XmCreateDropDownList(parent, name, xargs, n); + XtManageChild(widget); + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST); + + UiListView *listview = malloc(sizeof(UiListView)); + memset(listview, 0, sizeof(UiListView)); + listview->obj = obj; + listview->widget = widget; + listview->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; + listview->var = var; + listview->onactivate = args.onactivate; + listview->onactivatedata = args.onactivatedata; + listview->onselection = args.onselection; + listview->onselectiondata = args.onselectiondata; + + if(var) { + UiList *list = var->value; + list->obj = listview; + list->update = ui_listview_update; + list->getselection = ui_listview_getselection; + list->setselection = ui_listview_setselection; + ui_listview_update(list, 0); + } + + XtAddCallback( + widget, + XmNdestroyCallback, + (XtCallbackProc)ui_listview_destroy, + listview); + XtAddCallback( + widget, + XmNselectionCallback, + (XtCallbackProc)ui_dropdown_selection, + listview); + + return widget; +}