ui/motif/list.c

changeset 117
38c53b8a6139
parent 98
efaae97bd95b
child 122
e82b01d17a78
--- a/ui/motif/list.c	Tue Jan 26 19:45:28 2016 +0100
+++ b/ui/motif/list.c	Tue Jan 26 20:06:16 2016 +0100
@@ -160,3 +160,57 @@
     e.intval = cbs->item_position - 1;
     event->event.callback(&e, event->event.userdata);
 }
+
+
+/* --------------------------- ComboBox ---------------------------  */
+
+UIWIDGET ui_combobox_str(UiObject *obj, UiList *list, ui_callback f, void *udata) {
+    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_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);
+    if(var) {
+        UiListVar *value = var->value;
+        return ui_combobox_var(obj, value->listptr, 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) {
+    UiListView *listview = ucx_mempool_malloc(
+                obj->ctx->mempool,
+                sizeof(UiListView));
+    
+    UiContainer *ct = uic_get_current_container(obj);
+    Arg args[16];
+    int n = 0;
+    XtSetArg(args[n], XmNindicatorOn, XmINDICATOR_NONE);
+    n++;
+    XtSetArg(args[n], XmNtraversalOn, FALSE);
+    n++;
+    XtSetArg(args[n], XmNwidth, 160);
+    n++;
+    Widget parent = ct->prepare(ct, args, &n, FALSE);
+    Widget combobox = XmCreateDropDownList(parent, "combobox", args, n);
+    XtManageChild(combobox);
+    listview->widget = combobox;
+    listview->list = list;
+    listview->getvalue = getvalue;
+    
+    ui_listview_update(NULL, listview);
+    
+    list->list->observers = ui_add_observer(
+            list->list->observers,
+            (ui_callback)ui_listview_update,
+            listview);
+    
+}
\ No newline at end of file

mercurial