ui/gtk/window.c

changeset 675
b612026b060b
parent 659
d6baaa93f7be
child 680
a4795b40e679
equal deleted inserted replaced
674:51670b0bc625 675:b612026b060b
331 if(data->callback) { 331 if(data->callback) {
332 data->callback(&evt, data->userdata); 332 data->callback(&evt, data->userdata);
333 } 333 }
334 } 334 }
335 335
336 void ui_dialog_create(UiObject *parent, UiDialogArgs args) { 336 void ui_dialog_create(UiObject *parent, UiDialogArgs *args) {
337 AdwDialog *dialog = adw_alert_dialog_new(args.title, args.content); 337 AdwDialog *dialog = adw_alert_dialog_new(args->title, args->content);
338 UiEventData *event = malloc(sizeof(UiEventData)); 338 UiEventData *event = malloc(sizeof(UiEventData));
339 event->callback = args.result; 339 event->callback = args->result;
340 event->userdata = args.resultdata; 340 event->userdata = args->resultdata;
341 event->customdata = NULL; 341 event->customdata = NULL;
342 event->customint = 0; 342 event->customint = 0;
343 event->value = 0; 343 event->value = 0;
344 event->obj = parent; 344 event->obj = parent;
345 345
346 if(args.button1_label) { 346 if(args->button1_label) {
347 adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn1", args.button1_label); 347 adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn1", args->button1_label);
348 } 348 }
349 if(args.button2_label) { 349 if(args->button2_label) {
350 adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn2", args.button2_label); 350 adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "btn2", args->button2_label);
351 } 351 }
352 if(args.closebutton_label) { 352 if(args->closebutton_label) {
353 adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "close", args.closebutton_label); 353 adw_alert_dialog_add_response(ADW_ALERT_DIALOG(dialog), "close", args->closebutton_label);
354 adw_alert_dialog_set_close_response(ADW_ALERT_DIALOG(dialog), "close"); 354 adw_alert_dialog_set_close_response(ADW_ALERT_DIALOG(dialog), "close");
355 } 355 }
356 356
357 GtkWidget *entry = NULL; 357 GtkWidget *entry = NULL;
358 if(args.input || args.password) { 358 if(args->input || args->password) {
359 entry = gtk_entry_new(); 359 entry = gtk_entry_new();
360 if(args.password) { 360 if(args->password) {
361 gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); 361 gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
362 } 362 }
363 if(args.input_value) { 363 if(args->input_value) {
364 ENTRY_SET_TEXT(entry, args.input_value); 364 ENTRY_SET_TEXT(entry, args->input_value);
365 } 365 }
366 adw_alert_dialog_set_extra_child(ADW_ALERT_DIALOG(dialog), entry); 366 adw_alert_dialog_set_extra_child(ADW_ALERT_DIALOG(dialog), entry);
367 event->customdata = entry; 367 event->customdata = entry;
368 event->customint = 0; 368 event->customint = 0;
369 } 369 }
414 GtkDialog *dialog = GTK_DIALOG(gtk_dialog_new()); 414 GtkDialog *dialog = GTK_DIALOG(gtk_dialog_new());
415 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent->widget)); 415 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent->widget));
416 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); 416 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
417 417
418 GtkWidget *dialog_w = GTK_WIDGET(dialog); 418 GtkWidget *dialog_w = GTK_WIDGET(dialog);
419 if(args.title) { 419 if(args->title) {
420 gtk_window_set_title(GTK_WINDOW(dialog), args.title); 420 gtk_window_set_title(GTK_WINDOW(dialog), args->title);
421 } 421 }
422 if(args.button1_label) { 422 if(args->button1_label) {
423 gtk_dialog_add_button(dialog, args.button1_label, 1); 423 gtk_dialog_add_button(dialog, args->button1_label, 1);
424 } 424 }
425 if(args.button2_label) { 425 if(args->button2_label) {
426 gtk_dialog_add_button(dialog, args.button2_label, 2); 426 gtk_dialog_add_button(dialog, args->button2_label, 2);
427 } 427 }
428 if(args.closebutton_label) { 428 if(args->closebutton_label) {
429 gtk_dialog_add_button(dialog, args.closebutton_label, 0); 429 gtk_dialog_add_button(dialog, args->closebutton_label, 0);
430 } 430 }
431 431
432 GtkWidget *content_area = gtk_dialog_get_content_area(dialog); 432 GtkWidget *content_area = gtk_dialog_get_content_area(dialog);
433 if(args.content) { 433 if(args->content) {
434 GtkWidget *label = gtk_label_new(args.content); 434 GtkWidget *label = gtk_label_new(args->content);
435 BOX_ADD(content_area, label); 435 BOX_ADD(content_area, label);
436 } 436 }
437 437
438 GtkWidget *textfield = NULL; 438 GtkWidget *textfield = NULL;
439 if(args.input || args.password) { 439 if(args->input || args->password) {
440 textfield = gtk_entry_new(); 440 textfield = gtk_entry_new();
441 if(args.password) { 441 if(args->password) {
442 gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE); 442 gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE);
443 } 443 }
444 if(args.input_value) { 444 if(args->input_value) {
445 ENTRY_SET_TEXT(textfield, args.input_value); 445 ENTRY_SET_TEXT(textfield, args->input_value);
446 } 446 }
447 BOX_ADD(content_area, textfield); 447 BOX_ADD(content_area, textfield);
448 } 448 }
449 449
450 UiEventData *event = malloc(sizeof(UiEventData)); 450 UiEventData *event = malloc(sizeof(UiEventData));
451 event->obj = parent; 451 event->obj = parent;
452 event->callback = args.result; 452 event->callback = args->result;
453 event->userdata = args.resultdata; 453 event->userdata = args->resultdata;
454 event->value = 0; 454 event->value = 0;
455 event->customdata = textfield; 455 event->customdata = textfield;
456 456
457 g_signal_connect(dialog_w, 457 g_signal_connect(dialog_w,
458 "response", 458 "response",
747 #define DEFAULT_BUTTON(window, button) gtk_widget_set_can_default(button, TRUE); gtk_window_set_default(GTK_WINDOW(window), button) 747 #define DEFAULT_BUTTON(window, button) gtk_widget_set_can_default(button, TRUE); gtk_window_set_default(GTK_WINDOW(window), button)
748 #endif 748 #endif
749 749
750 750
751 751
752 UiObject* ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs args) { 752 UiObject* ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args) {
753 GtkWidget *dialog = DIALOG_NEW(); 753 GtkWidget *dialog = DIALOG_NEW();
754 if(args.width > 0 || args.height > 0) { 754 if(args->width > 0 || args->height > 0) {
755 gtk_window_set_default_size( 755 gtk_window_set_default_size(
756 GTK_WINDOW(dialog), 756 GTK_WINDOW(dialog),
757 args.width, 757 args->width,
758 args.height); 758 args->height);
759 } 759 }
760 760
761 761
762 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent->widget)); 762 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent->widget));
763 if(args.modal != UI_OFF) { 763 if(args->modal != UI_OFF) {
764 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); 764 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
765 } 765 }
766 766
767 UiObject *obj = uic_object_new_toplevel(); 767 UiObject *obj = uic_object_new_toplevel();
768 obj->widget = dialog; 768 obj->widget = dialog;
769 obj->ref = 0; 769 obj->ref = 0;
770 obj->destroy = ui_window_widget_destroy; 770 obj->destroy = ui_window_widget_destroy;
771 nwindows++; 771 nwindows++;
772 772
773 if(args.title != NULL) { 773 if(args->title != NULL) {
774 gtk_window_set_title(GTK_WINDOW(dialog), args.title); 774 gtk_window_set_title(GTK_WINDOW(dialog), args->title);
775 } 775 }
776 776
777 #if ! GTK_CHECK_VERSION(4, 10, 0) 777 #if ! GTK_CHECK_VERSION(4, 10, 0)
778 UiEventData *event = malloc(sizeof(UiEventData)); 778 UiEventData *event = malloc(sizeof(UiEventData));
779 event->obj = obj; 779 event->obj = obj;
780 event->userdata = args.onclickdata; 780 event->userdata = args->onclickdata;
781 event->callback = args.onclick; 781 event->callback = args->onclick;
782 event->value = 0; 782 event->value = 0;
783 event->customdata = NULL; 783 event->customdata = NULL;
784 784
785 g_signal_connect(dialog, "response", G_CALLBACK(ui_dialogwindow_response), event); 785 g_signal_connect(dialog, "response", G_CALLBACK(ui_dialogwindow_response), event);
786 g_signal_connect( 786 g_signal_connect(
814 gtk_container_remove(GTK_CONTAINER(dialog), c); 814 gtk_container_remove(GTK_CONTAINER(dialog), c);
815 #endif 815 #endif
816 816
817 GtkWidget *content_vbox = ui_gtk_vbox_new(0); 817 GtkWidget *content_vbox = ui_gtk_vbox_new(0);
818 obj->container = ui_box_container(obj, content_vbox, UI_CONTAINER_VBOX); 818 obj->container = ui_box_container(obj, content_vbox, UI_CONTAINER_VBOX);
819 if(args.lbutton1 || args.lbutton2 || args.rbutton3 || args.rbutton4) { 819 if(args->lbutton1 || args->lbutton2 || args->rbutton3 || args->rbutton4) {
820 #if GTK_CHECK_VERSION(3, 10, 0) 820 #if GTK_CHECK_VERSION(3, 10, 0)
821 if(args.titlebar_buttons != UI_OFF) { 821 if(args->titlebar_buttons != UI_OFF) {
822 GtkWidget *headerbar = gtk_header_bar_new(); 822 GtkWidget *headerbar = gtk_header_bar_new();
823 gtk_window_set_titlebar(GTK_WINDOW(dialog), headerbar); 823 gtk_window_set_titlebar(GTK_WINDOW(dialog), headerbar);
824 if(args.show_closebutton == UI_OFF) { 824 if(args->show_closebutton == UI_OFF) {
825 HEADERBAR_SHOW_CLOSEBUTTON(headerbar, FALSE); 825 HEADERBAR_SHOW_CLOSEBUTTON(headerbar, FALSE);
826 } 826 }
827 827
828 if(args.lbutton1) { 828 if(args->lbutton1) {
829 GtkWidget *button = ui_create_button(obj, args.lbutton1, NULL, args.onclick, args.onclickdata, 1, args.default_button == 1); 829 GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, args->onclick, args->onclickdata, 1, args->default_button == 1);
830 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button); 830 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button);
831 if(args.default_button == 1) { 831 if(args->default_button == 1) {
832 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 832 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
833 DEFAULT_BUTTON(dialog, button); 833 DEFAULT_BUTTON(dialog, button);
834 } 834 }
835 } 835 }
836 if(args.lbutton2) { 836 if(args->lbutton2) {
837 GtkWidget *button = ui_create_button(obj, args.lbutton2, NULL, args.onclick, args.onclickdata, 2, args.default_button == 2); 837 GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, args->onclick, args->onclickdata, 2, args->default_button == 2);
838 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button); 838 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button);
839 if(args.default_button == 2) { 839 if(args->default_button == 2) {
840 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 840 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
841 DEFAULT_BUTTON(dialog, button); 841 DEFAULT_BUTTON(dialog, button);
842 } 842 }
843 } 843 }
844 844
845 if(args.rbutton4) { 845 if(args->rbutton4) {
846 GtkWidget *button = ui_create_button(obj, args.rbutton4, NULL, args.onclick, args.onclickdata, 4, args.default_button == 4); 846 GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, args->onclick, args->onclickdata, 4, args->default_button == 4);
847 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button); 847 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button);
848 if(args.default_button == 4) { 848 if(args->default_button == 4) {
849 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 849 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
850 DEFAULT_BUTTON(dialog, button); 850 DEFAULT_BUTTON(dialog, button);
851 } 851 }
852 } 852 }
853 if(args.rbutton3) { 853 if(args->rbutton3) {
854 GtkWidget *button = ui_create_button(obj, args.rbutton3, NULL, args.onclick, args.onclickdata, 3, args.default_button == 3); 854 GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, args->onclick, args->onclickdata, 3, args->default_button == 3);
855 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button); 855 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button);
856 if(args.default_button == 3) { 856 if(args->default_button == 3) {
857 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 857 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
858 DEFAULT_BUTTON(dialog, button); 858 DEFAULT_BUTTON(dialog, button);
859 } 859 }
860 } 860 }
861 WINDOW_SET_CONTENT(obj->widget, content_vbox); 861 WINDOW_SET_CONTENT(obj->widget, content_vbox);
869 869
870 GtkWidget *grid = ui_create_grid_widget(10, 10); 870 GtkWidget *grid = ui_create_grid_widget(10, 10);
871 GtkWidget *widget = ui_box_set_margin(grid, 16); 871 GtkWidget *widget = ui_box_set_margin(grid, 16);
872 gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE); 872 gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
873 873
874 if(args.lbutton1) { 874 if(args->lbutton1) {
875 GtkWidget *button = ui_create_button(obj, args.lbutton1, NULL, args.onclick, args.onclickdata, 1, args.default_button == 1); 875 GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, args->onclick, args->onclickdata, 1, args->default_button == 1);
876 gtk_grid_attach(GTK_GRID(grid), button, 0, 0, 1, 1); 876 gtk_grid_attach(GTK_GRID(grid), button, 0, 0, 1, 1);
877 if(args.default_button == 1) { 877 if(args->default_button == 1) {
878 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 878 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
879 DEFAULT_BUTTON(dialog, button); 879 DEFAULT_BUTTON(dialog, button);
880 } 880 }
881 } 881 }
882 if(args.lbutton2) { 882 if(args->lbutton2) {
883 GtkWidget *button = ui_create_button(obj, args.lbutton2, NULL, args.onclick, args.onclickdata, 2, args.default_button == 2); 883 GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, args->onclick, args->onclickdata, 2, args->default_button == 2);
884 gtk_grid_attach(GTK_GRID(grid), button, 1, 0, 1, 1); 884 gtk_grid_attach(GTK_GRID(grid), button, 1, 0, 1, 1);
885 if(args.default_button == 2) { 885 if(args->default_button == 2) {
886 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 886 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
887 DEFAULT_BUTTON(dialog, button); 887 DEFAULT_BUTTON(dialog, button);
888 } 888 }
889 } 889 }
890 GtkWidget *space = gtk_label_new(NULL); 890 GtkWidget *space = gtk_label_new(NULL);
891 gtk_widget_set_hexpand(space, TRUE); 891 gtk_widget_set_hexpand(space, TRUE);
892 gtk_grid_attach(GTK_GRID(grid), space, 2, 0, 1, 1); 892 gtk_grid_attach(GTK_GRID(grid), space, 2, 0, 1, 1);
893 if(args.rbutton3) { 893 if(args->rbutton3) {
894 GtkWidget *button = ui_create_button(obj, args.rbutton3, NULL, args.onclick, args.onclickdata, 3, args.default_button == 3); 894 GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, args->onclick, args->onclickdata, 3, args->default_button == 3);
895 gtk_grid_attach(GTK_GRID(grid), button, 3, 0, 1, 1); 895 gtk_grid_attach(GTK_GRID(grid), button, 3, 0, 1, 1);
896 if(args.default_button == 3) { 896 if(args->default_button == 3) {
897 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 897 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
898 DEFAULT_BUTTON(dialog, button); 898 DEFAULT_BUTTON(dialog, button);
899 } 899 }
900 } 900 }
901 if(args.rbutton4) { 901 if(args->rbutton4) {
902 GtkWidget *button = ui_create_button(obj, args.rbutton4, NULL, args.onclick, args.onclickdata, 4, args.default_button == 4); 902 GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, args->onclick, args->onclickdata, 4, args->default_button == 4);
903 gtk_grid_attach(GTK_GRID(grid), button, 4, 0, 1, 1); 903 gtk_grid_attach(GTK_GRID(grid), button, 4, 0, 1, 1);
904 if(args.default_button == 4) { 904 if(args->default_button == 4) {
905 WIDGET_ADD_CSS_CLASS(button, "suggested-action"); 905 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
906 DEFAULT_BUTTON(dialog, button); 906 DEFAULT_BUTTON(dialog, button);
907 } 907 }
908 } 908 }
909 909

mercurial