# HG changeset patch # User Olaf Wintermann # Date 1453659829 -3600 # Node ID fdd33964b35f007cfcfd562b8885e862a553910e # Parent 40dbf1a7526a68acfcb75a0d8a027460c7072557 added radio buttons (Motif) diff -r 40dbf1a7526a -r fdd33964b35f application/main.c --- a/application/main.c Sun Jan 24 18:47:39 2016 +0100 +++ b/application/main.c Sun Jan 24 19:23:49 2016 +0100 @@ -121,9 +121,9 @@ ui_button(obj, "ABC", action_button2, NULL); ui_newline(obj); - //ui_radiobutton(obj, "Radio1", &radio); - //ui_radiobutton(obj, "Radio2", &radio); - //ui_radiobutton(obj, "Radio3", &radio); + ui_radiobutton(obj, "Radio1", &radio); + ui_radiobutton(obj, "Radio2", &radio); + ui_radiobutton(obj, "Radio3", &radio); ui_end(obj); diff -r 40dbf1a7526a -r fdd33964b35f ui/motif/button.c --- a/ui/motif/button.c Sun Jan 24 18:47:39 2016 +0100 +++ b/ui/motif/button.c Sun Jan 24 19:23:49 2016 +0100 @@ -105,3 +105,103 @@ e.intval = event->value; event->callback(&e, event->userdata); } + + +static void radio_callback( + Widget widget, + RadioEventData *event, + XmToggleButtonCallbackStruct *tb) +{ + if(tb->set) { + RadioButtonGroup *group = event->group; + if(group->current) { + Arg arg; + XtSetArg(arg, XmNset, FALSE); + XtSetValues(group->current, &arg, 1); + } + group->current = widget; + } +} + +UIWIDGET ui_radiobutton(UiObject *obj, char *label, UiInteger *rgroup) { + UiContainer *ct = uic_get_current_container(obj); + XmString str = XmStringCreateLocalized(label); + + int n = 0; + Arg args[16]; + + XtSetArg(args[n], XmNlabelString, str); + n++; + XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY_ROUND); + n++; + + Widget parent = ct->prepare(ct, args, &n, FALSE); + Widget button = XmCreateToggleButton(parent, "radiobutton", args, n); + ct->add(ct, button); + + if(rgroup) { + RadioButtonGroup *group; + if(rgroup->obj) { + group = rgroup->obj; + group->buttons = ucx_list_append(group->buttons, button); + group->ref++; + } else { + group = malloc(sizeof(RadioButtonGroup)); + group->buttons = ucx_list_append(NULL, button); + group->current = button; + // this is the first button in the radiobutton group + // so we should enable it + Arg arg; + XtSetArg(arg, XmNset, TRUE); + XtSetValues(button, &arg, 1); + rgroup->obj = group; + + group->current = button; + } + + RadioEventData *event = malloc(sizeof(RadioEventData)); + event->obj = obj; + event->callback = NULL; + event->userdata = NULL; + event->group = group; + XtAddCallback( + button, + XmNvalueChangedCallback, + (XtCallbackProc)radio_callback, + event); + + rgroup->get = ui_radiobutton_get; + rgroup->set = ui_radiobutton_set; + } + + XtManageChild(button); + return button; +} + +int ui_radiobutton_get(UiInteger *value) { + RadioButtonGroup *group = value->obj; + + int i = ucx_list_find(group->buttons, group->current, NULL, NULL); + if (i >= 0) { + value->value = i; + return i; + } else { + return 0; + } +} + +void ui_radiobutton_set(UiInteger *value, int i) { + RadioButtonGroup *group = value->obj; + Arg arg; + + XtSetArg(arg, XmNset, FALSE); + XtSetValues(group->current, &arg, 1); + + UcxList *elm = ucx_list_get(group->buttons, i); + if(elm) { + Widget button = elm->data; + XtSetArg(arg, XmNset, TRUE); + XtSetValues(button, &arg, 1); + group->current = button; + } +} diff -r 40dbf1a7526a -r fdd33964b35f ui/motif/button.h --- a/ui/motif/button.h Sun Jan 24 18:47:39 2016 +0100 +++ b/ui/motif/button.h Sun Jan 24 19:23:49 2016 +0100 @@ -36,6 +36,18 @@ extern "C" { #endif +typedef struct { + UcxList *buttons; + Widget current; + int ref; +} RadioButtonGroup; + +typedef struct { + UiObject *obj; + ui_callback callback; + void *userdata; + RadioButtonGroup *group; +} RadioEventData; // wrapper int ui_toggle_button_get(UiInteger *i); @@ -46,6 +58,9 @@ XmToggleButtonCallbackStruct *e); void ui_push_button_callback(Widget widget, UiEventData *event, XtPointer d); +int ui_radiobutton_get(UiInteger *value); +void ui_radiobutton_set(UiInteger *value, int i); + #ifdef __cplusplus } #endif