ui/gtk/button.c

changeset 1025
4f7e335a95ca
parent 1022
4ab47c0f92ea
equal deleted inserted replaced
1024:d218b70e1499 1025:4f7e335a95ca
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;

mercurial