| 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 |