add combobox (Motif)

5 weeks ago

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 08 Feb 2025 21:42:56 +0100 (5 weeks ago)
changeset 462
9e499276136a
parent 461
b480e133b576
child 463
e8ee57cc052e

add combobox (Motif)

application/main.c file | annotate | diff | comparison | revisions
ui/motif/list.c file | annotate | diff | comparison | revisions
--- a/application/main.c	Fri Feb 07 21:57:32 2025 +0100
+++ b/application/main.c	Sat Feb 08 21:42:56 2025 +0100
@@ -653,7 +653,7 @@
         }
         
         ui_tab(obj, "Tab 2") {
-            ui_button(obj, .label = "Test Tab 2");
+            ui_combobox(obj, .list = wdata->list);
         }
         
         ui_tab(obj, "Tab 3") {
--- 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;
+}

mercurial