ui/gtk/button.c

changeset 1022
4ab47c0f92ea
parent 1016
ccde46662db7
equal deleted inserted replaced
1020:cae4af417424 1022:4ab47c0f92ea
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;

mercurial