| 503 #define RADIOBUTTON_SET_GROUP(button, group) /* noop */ |
503 #define RADIOBUTTON_SET_GROUP(button, group) /* noop */ |
| 504 #define RADIOBUTTON_GET_GROUP(button) gtk_radio_button_get_group(GTK_RADIO_BUTTON(button)) |
504 #define RADIOBUTTON_GET_GROUP(button) gtk_radio_button_get_group(GTK_RADIO_BUTTON(button)) |
| 505 #define RADIOBUTTON_GET_ACTIVE(button) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) |
505 #define RADIOBUTTON_GET_ACTIVE(button) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) |
| 506 #endif |
506 #endif |
| 507 |
507 |
| 508 static void radiobutton_toggled(void *widget, UiVarEventData *event) { |
508 static void radiobutton_toggled(void *widget, UiEventData *event) { |
| 509 gboolean active = RADIOBUTTON_GET_ACTIVE(widget); |
|
| 510 |
|
| 511 UiEvent e; |
509 UiEvent e; |
| 512 e.obj = event->obj; |
510 e.obj = event->obj; |
| 513 e.window = event->obj->window; |
511 e.window = event->obj->window; |
| 514 e.document = event->obj->ctx->document; |
512 e.document = event->obj->ctx->document; |
| 515 e.eventdata = NULL; |
513 e.eventdata = NULL; |
| 516 e.eventdatatype = 0; |
514 e.eventdatatype = 0; |
| 517 e.intval = active; |
515 e.intval = RADIOBUTTON_GET_ACTIVE(widget); |
| 518 e.set = ui_get_setop(); |
516 e.set = ui_get_setop(); |
| 519 |
517 event->callback(&e, event->userdata); |
| 520 if(event->callback) { |
|
| 521 event->callback(&e, event->userdata); |
|
| 522 } |
|
| 523 |
|
| 524 if(active && event->var) { |
|
| 525 UiInteger *i = event->var->value; |
|
| 526 |
|
| 527 e.intval = i->get(i); |
|
| 528 ui_notify_evt(i->observers, &e); |
|
| 529 } |
|
| 530 } |
518 } |
| 531 |
519 |
| 532 typedef struct UiRadioButtonData { |
520 typedef struct UiRadioButtonData { |
| 533 UiObject *obj; |
521 UiInteger *value; |
| 534 UiVar *var; |
522 UiVarEventData *eventdata; |
| 535 UiBool first; |
523 UiBool first; |
| 536 } UiRadioButtonData; |
524 } UiRadioButtonData; |
| 537 |
525 |
| 538 static void destroy_radiobutton(GtkWidget *w, UiRadioButtonData *data) { |
526 static void destroy_radiobutton(GtkWidget *w, UiRadioButtonData *data) { |
| 539 if(data->first) { |
527 if(data->first) { |
| 540 UiInteger *value = data->var->value; |
528 ui_destroy_vardata(w, data->eventdata); |
| 541 ui_destroy_boundvar(data->obj->ctx, data->var); |
529 g_slist_free(data->value->obj); |
| 542 g_slist_free(value->obj); |
530 data->value->obj = NULL; |
| |
531 data->value->get = NULL; |
| |
532 data->value->set = NULL; |
| |
533 } else { |
| |
534 free(data->eventdata); |
| 543 } |
535 } |
| 544 free(data); |
536 free(data); |
| 545 } |
537 } |
| 546 |
538 |
| 547 UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { |
539 UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { |
| 560 } |
552 } |
| 561 |
553 |
| 562 GtkWidget *rbutton = RADIOBUTTON_NEW(rg, args->label); |
554 GtkWidget *rbutton = RADIOBUTTON_NEW(rg, args->label); |
| 563 ui_set_name_and_style(rbutton, args->name, args->style_class); |
555 ui_set_name_and_style(rbutton, args->name, args->style_class); |
| 564 ui_set_widget_states(obj->ctx, rbutton, args->states); |
556 ui_set_widget_states(obj->ctx, rbutton, args->states); |
| 565 |
|
| 566 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
|
| 567 event->obj = obj; |
|
| 568 event->var = var; |
|
| 569 event->observers = NULL; |
|
| 570 event->callback = args->onchange; |
|
| 571 event->userdata = args->onchangedata; |
|
| 572 event->customint1 = 0; |
|
| 573 event->customint2 = 0; |
|
| 574 |
|
| 575 if(rgroup) { |
557 if(rgroup) { |
| 576 #if GTK_MAJOR_VERSION >= 4 |
558 #if GTK_MAJOR_VERSION >= 4 |
| 577 if(rg) { |
559 if(rg) { |
| 578 gtk_check_button_set_group(GTK_CHECK_BUTTON(rbutton), rg->data); |
560 gtk_check_button_set_group(GTK_CHECK_BUTTON(rbutton), rg->data); |
| 579 } |
561 } |
| 587 rgroup->get = ui_radiobutton_get; |
569 rgroup->get = ui_radiobutton_get; |
| 588 rgroup->set = ui_radiobutton_set; |
570 rgroup->set = ui_radiobutton_set; |
| 589 |
571 |
| 590 ui_radiobutton_set(rgroup, rgroup->value); |
572 ui_radiobutton_set(rgroup, rgroup->value); |
| 591 |
573 |
| |
574 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
| |
575 event->obj = obj; |
| |
576 event->var = var; |
| |
577 event->observers = NULL; |
| |
578 event->callback = NULL; |
| |
579 event->userdata = NULL; |
| |
580 event->customint1 = 0; |
| |
581 event->customint2 = 0; |
| |
582 |
| 592 UiRadioButtonData *rbdata = malloc(sizeof(UiRadioButtonData)); |
583 UiRadioButtonData *rbdata = malloc(sizeof(UiRadioButtonData)); |
| 593 rbdata->obj = obj; |
584 rbdata->value = rgroup; |
| 594 rbdata->var = var; |
585 rbdata->eventdata = event; |
| 595 rbdata->first = first; |
586 rbdata->first = first; |
| 596 |
587 |
| |
588 g_signal_connect( |
| |
589 rbutton, |
| |
590 "toggled", |
| |
591 G_CALLBACK(ui_radio_obs), |
| |
592 event); |
| 597 g_signal_connect( |
593 g_signal_connect( |
| 598 rbutton, |
594 rbutton, |
| 599 "destroy", |
595 "destroy", |
| 600 G_CALLBACK(destroy_radiobutton), |
596 G_CALLBACK(destroy_radiobutton), |
| 601 rbdata); |
597 rbdata); |
| 602 } |
598 } |
| 603 |
599 |
| 604 g_signal_connect( |
600 if(args->onchange) { |
| 605 rbutton, |
601 UiEventData *event = malloc(sizeof(UiEventData)); |
| 606 "toggled", |
602 event->obj = obj; |
| 607 G_CALLBACK(radiobutton_toggled), |
603 event->userdata = args->onchangedata; |
| 608 event); |
604 event->callback = args->onchange; |
| 609 g_signal_connect( |
605 event->value = 0; |
| 610 rbutton, |
606 event->customdata = NULL; |
| 611 "destroy", |
607 event->customint = 0; |
| 612 G_CALLBACK(ui_destroy_userdata), |
608 |
| 613 event); |
609 g_signal_connect( |
| |
610 rbutton, |
| |
611 "toggled", |
| |
612 G_CALLBACK(radiobutton_toggled), |
| |
613 event); |
| |
614 g_signal_connect( |
| |
615 rbutton, |
| |
616 "destroy", |
| |
617 G_CALLBACK(ui_destroy_userdata), |
| |
618 event); |
| |
619 } |
| 614 |
620 |
| 615 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
621 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
| 616 UiLayout layout = UI_ARGS2LAYOUT(args); |
622 UiLayout layout = UI_ARGS2LAYOUT(args); |
| 617 ct->add(ct, rbutton, &layout); |
623 ct->add(ct, rbutton, &layout); |
| 618 |
624 |
| 619 return rbutton; |
625 return rbutton; |
| |
626 } |
| |
627 |
| |
628 void ui_radio_obs(GtkToggleButton *widget, UiVarEventData *event) { |
| |
629 UiInteger *i = event->var->value; |
| |
630 |
| |
631 UiEvent e; |
| |
632 e.obj = event->obj; |
| |
633 e.window = event->obj->window; |
| |
634 e.document = event->obj->ctx->document; |
| |
635 e.eventdata = NULL; |
| |
636 e.eventdatatype = 0; |
| |
637 e.intval = i->get(i); |
| |
638 |
| |
639 ui_notify_evt(i->observers, &e); |
| 620 } |
640 } |
| 621 |
641 |
| 622 #if GTK_MAJOR_VERSION >= 4 |
642 #if GTK_MAJOR_VERSION >= 4 |
| 623 int64_t ui_radiobutton_get(UiInteger *value) { |
643 int64_t ui_radiobutton_get(UiInteger *value) { |
| 624 int selection = 0; |
644 int selection = 0; |