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