comparison src/gtkrequest.c @ 7900:365d8a67972d

[gaim-migrate @ 8560] Cleaned up the main function that builds the field request UI. It's a lot easier to work with now. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sun, 21 Dec 2003 08:16:43 +0000
parents a6298fd7ee21
children d91806e4ea64
comparison
equal deleted inserted replaced
7899:7b64108b8ae3 7900:365d8a67972d
437 gtk_widget_show_all(dialog); 437 gtk_widget_show_all(dialog);
438 438
439 return data; 439 return data;
440 } 440 }
441 441
442 static GtkWidget *
443 create_string_field(GaimRequestField *field)
444 {
445 const char *value;
446 GtkWidget *widget;
447
448 value = gaim_request_field_string_get_default_value(field);
449
450 if (gaim_request_field_string_is_multiline(field))
451 {
452 GtkWidget *textview;
453
454 widget = gtk_scrolled_window_new(NULL, NULL);
455 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(widget),
456 GTK_SHADOW_IN);
457 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
458 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
459
460 textview = gtk_text_view_new();
461 gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),
462 TRUE);
463 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview),
464 GTK_WRAP_WORD_CHAR);
465
466 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck"))
467 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(textview));
468
469 gtk_container_add(GTK_CONTAINER(widget), textview);
470 gtk_widget_show(textview);
471
472 gtk_widget_set_size_request(widget, -1, 75);
473
474 if (value != NULL)
475 {
476 GtkTextBuffer *buffer;
477
478 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
479
480 gtk_text_buffer_set_text(buffer, value, -1);
481 }
482
483 gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),
484 gaim_request_field_string_is_editable(field));
485
486 g_signal_connect(G_OBJECT(textview), "focus-out-event",
487 G_CALLBACK(field_string_focus_out_cb), field);
488 }
489 else
490 {
491 widget = gtk_entry_new();
492
493 if (value != NULL)
494 gtk_entry_set_text(GTK_ENTRY(widget), value);
495
496 gtk_entry_set_visibility(GTK_ENTRY(widget),
497 !gaim_request_field_string_is_masked(field));
498
499 gtk_editable_set_editable(GTK_EDITABLE(widget),
500 gaim_request_field_string_is_editable(field));
501
502 g_signal_connect(G_OBJECT(widget), "focus-out-event",
503 G_CALLBACK(field_string_focus_out_cb), field);
504 }
505
506 return widget;
507 }
508
509 static GtkWidget *
510 create_int_field(GaimRequestField *field)
511 {
512 int value;
513 GtkWidget *widget;
514
515 widget = gtk_entry_new();
516
517 value = gaim_request_field_int_get_default_value(field);
518
519 if (value != 0)
520 {
521 char buf[32];
522
523 g_snprintf(buf, sizeof(buf), "%d", value);
524
525 gtk_entry_set_text(GTK_ENTRY(widget), buf);
526 }
527
528 g_signal_connect(G_OBJECT(widget), "focus-out-event",
529 G_CALLBACK(field_int_focus_out_cb), field);
530
531 return widget;
532 }
533
534 static GtkWidget *
535 create_bool_field(GaimRequestField *field)
536 {
537 GtkWidget *widget;
538
539 widget = gtk_check_button_new_with_label(
540 gaim_request_field_get_label(field));
541
542 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
543 gaim_request_field_bool_get_default_value(field));
544
545 g_signal_connect(G_OBJECT(widget), "toggled",
546 G_CALLBACK(field_bool_cb), field);
547
548 return widget;
549 }
550
551 static GtkWidget *
552 create_choice_field(GaimRequestField *field)
553 {
554 GtkWidget *widget;
555 GList *labels;
556 GList *l;
557
558 labels = gaim_request_field_choice_get_labels(field);
559
560 if (g_list_length(labels) > 5)
561 {
562 GtkWidget *menu;
563 GtkWidget *item;
564
565 widget = gtk_option_menu_new();
566
567 menu = gtk_menu_new();
568
569 gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), menu);
570
571 for (l = labels; l != NULL; l = l->next)
572 {
573 const char *text = l->data;
574
575 item = gtk_menu_item_new_with_label(text);
576
577 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
578 }
579
580 g_signal_connect(G_OBJECT(widget), "changed",
581 G_CALLBACK(field_choice_menu_cb),
582 field);
583 }
584 else
585 {
586 GtkWidget *box;
587 GtkWidget *first_radio = NULL;
588 GtkWidget *radio;
589
590 if (g_list_length(labels) == 2)
591 box = gtk_hbox_new(FALSE, 6);
592 else
593 box = gtk_vbox_new(FALSE, 0);
594
595 widget = box;
596
597 for (l = labels; l != NULL; l = l->next)
598 {
599 const char *text = l->data;
600
601 radio = gtk_radio_button_new_with_label_from_widget(
602 GTK_RADIO_BUTTON(first_radio), text);
603
604 if (first_radio == NULL)
605 first_radio = radio;
606
607 gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0);
608 gtk_widget_show(radio);
609
610 g_signal_connect(G_OBJECT(radio), "toggled",
611 G_CALLBACK(field_choice_option_cb), field);
612 }
613 }
614
615 return widget;
616 }
617
442 static void * 618 static void *
443 gaim_gtk_request_fields(const char *title, const char *primary, 619 gaim_gtk_request_fields(const char *title, const char *primary,
444 const char *secondary, GaimRequestFields *fields, 620 const char *secondary, GaimRequestFields *fields,
445 const char *ok_text, GCallback ok_cb, 621 const char *ok_text, GCallback ok_cb,
446 const char *cancel_text, GCallback cancel_cb, 622 const char *cancel_text, GCallback cancel_cb,
458 GtkWidget *img; 634 GtkWidget *img;
459 GtkSizeGroup *sg; 635 GtkSizeGroup *sg;
460 GList *gl, *fl; 636 GList *gl, *fl;
461 GaimRequestFieldGroup *group; 637 GaimRequestFieldGroup *group;
462 GaimRequestField *field; 638 GaimRequestField *field;
463 char *text;
464 char *label_text; 639 char *label_text;
465 640
466 data = g_new0(GaimGtkRequestData, 1); 641 data = g_new0(GaimGtkRequestData, 1);
467 data->type = GAIM_REQUEST_FIELDS; 642 data->type = GAIM_REQUEST_FIELDS;
468 data->user_data = user_data; 643 data->user_data = user_data;
500 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); 675 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
501 gtk_widget_show(vbox); 676 gtk_widget_show(vbox);
502 677
503 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); 678 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
504 679
505 if (primary != NULL || secondary != NULL) { 680 if (primary != NULL || secondary != NULL)
506 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" 681 {
507 "%s</span>%s%s" : "%s%s%s"), 682 label_text = g_strdup_printf(
508 (primary ? primary : ""), 683 (primary
509 ((primary && secondary) ? "\n\n" : ""), 684 ? "<span weight=\"bold\" size=\"larger\">"
510 (secondary ? secondary : "")); 685 "%s</span>%s%s"
686 : "%s%s%s"),
687 (primary ? primary : ""),
688 ((primary && secondary) ? "\n\n" : ""),
689 (secondary ? secondary : ""));
511 690
512 label = gtk_label_new(NULL); 691 label = gtk_label_new(NULL);
513 692
514 gtk_label_set_markup(GTK_LABEL(label), label_text); 693 gtk_label_set_markup(GTK_LABEL(label), label_text);
515 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); 694 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
520 g_free(label_text); 699 g_free(label_text);
521 } 700 }
522 701
523 for (gl = gaim_request_fields_get_groups(fields); 702 for (gl = gaim_request_fields_get_groups(fields);
524 gl != NULL; 703 gl != NULL;
525 gl = gl->next) { 704 gl = gl->next)
526 705 {
527 GList *field_list; 706 GList *field_list;
528 size_t field_count = 0; 707 size_t field_count = 0;
529 size_t cols = 1; 708 size_t cols = 1;
530 size_t rows; 709 size_t rows;
531 size_t col_num; 710 size_t col_num;
532 size_t row_num = 0; 711 size_t row_num = 0;
533 712
534 group = gl->data; 713 group = gl->data;
535 field_list = gaim_request_field_group_get_fields(group); 714 field_list = gaim_request_field_group_get_fields(group);
536 715
537 if (gaim_request_field_group_get_title(group) != NULL) { 716 if (gaim_request_field_group_get_title(group) != NULL)
717 {
538 frame = gaim_gtk_make_frame(vbox, 718 frame = gaim_gtk_make_frame(vbox,
539 gaim_request_field_group_get_title(group)); 719 gaim_request_field_group_get_title(group));
540 } 720 }
541 else 721 else
542 frame = vbox; 722 frame = vbox;
543 723
544 field_count = g_list_length(field_list); 724 field_count = g_list_length(field_list);
545 725
546 if (field_count > 9) { 726 if (field_count > 9)
727 {
547 rows = field_count / 2; 728 rows = field_count / 2;
548 cols++; 729 cols++;
549 } 730 }
550 else 731 else
551 rows = field_count; 732 rows = field_count;
552 733
553 for (fl = field_list; fl != NULL; fl = fl->next) { 734 for (fl = field_list; fl != NULL; fl = fl->next)
735 {
554 GaimRequestFieldType type; 736 GaimRequestFieldType type;
555 737
556 field = (GaimRequestField *)fl->data; 738 field = (GaimRequestField *)fl->data;
557 739
558 type = gaim_request_field_get_type(field); 740 type = gaim_request_field_get_type(field);
559 741
560 if (type == GAIM_REQUEST_FIELD_STRING && 742 if (type == GAIM_REQUEST_FIELD_STRING &&
561 gaim_request_field_string_is_multiline(field)) { 743 gaim_request_field_string_is_multiline(field))
562 744 {
563 rows += 2; 745 rows += 2;
564 } 746 }
565 } 747 }
566 748
567 table = gtk_table_new(rows, 2 * cols, FALSE); 749 table = gtk_table_new(rows, 2 * cols, FALSE);
571 gtk_container_add(GTK_CONTAINER(frame), table); 753 gtk_container_add(GTK_CONTAINER(frame), table);
572 gtk_widget_show(table); 754 gtk_widget_show(table);
573 755
574 for (row_num = 0, fl = field_list; 756 for (row_num = 0, fl = field_list;
575 row_num < rows && fl != NULL; 757 row_num < rows && fl != NULL;
576 row_num++) { 758 row_num++)
577 759 {
578 for (col_num = 0; 760 for (col_num = 0;
579 col_num < cols && fl != NULL; 761 col_num < cols && fl != NULL;
580 col_num++, fl = fl->next) { 762 col_num++, fl = fl->next)
581 763 {
582 size_t col_offset = col_num * 2; 764 size_t col_offset = col_num * 2;
583 GaimRequestFieldType type; 765 GaimRequestFieldType type;
584 GtkWidget *widget = NULL; 766 GtkWidget *widget = NULL;
585 767
586 field = fl->data; 768 field = fl->data;
587 769
588 type = gaim_request_field_get_type(field); 770 type = gaim_request_field_get_type(field);
589 771
590 if (type != GAIM_REQUEST_FIELD_BOOLEAN) { 772 if (type != GAIM_REQUEST_FIELD_BOOLEAN)
773 {
774 char *text;
775
591 text = g_strdup_printf("%s:", 776 text = g_strdup_printf("%s:",
592 gaim_request_field_get_label(field)); 777 gaim_request_field_get_label(field));
593 778
594 label = gtk_label_new(NULL); 779 label = gtk_label_new(NULL);
595 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), text); 780 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), text);
596 g_free(text); 781 g_free(text);
597 782
598 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); 783 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
599 784
600 gtk_size_group_add_widget(sg, label); 785 gtk_size_group_add_widget(sg, label);
601 786
602 if (type == GAIM_REQUEST_FIELD_STRING && 787 if (type == GAIM_REQUEST_FIELD_STRING &&
603 gaim_request_field_string_is_multiline(field)) { 788 gaim_request_field_string_is_multiline(field))
604 789 {
605 gtk_table_attach_defaults(GTK_TABLE(table), label, 790 gtk_table_attach_defaults(GTK_TABLE(table), label,
606 0, 2 * cols, 791 0, 2 * cols,
607 row_num, row_num + 1); 792 row_num, row_num + 1);
608 793
609 row_num++; 794 row_num++;
610 } 795 }
611 else { 796 else
797 {
612 gtk_table_attach_defaults(GTK_TABLE(table), label, 798 gtk_table_attach_defaults(GTK_TABLE(table), label,
613 col_offset, col_offset + 1, 799 col_offset, col_offset + 1,
614 row_num, row_num + 1); 800 row_num, row_num + 1);
615 } 801 }
616 802
617 gtk_widget_show(label); 803 gtk_widget_show(label);
618 } 804 }
619 805
620 if (type == GAIM_REQUEST_FIELD_STRING) { 806 if (type == GAIM_REQUEST_FIELD_STRING)
621 const char *value; 807 widget = create_string_field(field);
622 808 else if (type == GAIM_REQUEST_FIELD_INTEGER)
623 value = gaim_request_field_string_get_default_value(field); 809 widget = create_int_field(field);
624 810 else if (type == GAIM_REQUEST_FIELD_BOOLEAN)
625 if (gaim_request_field_string_is_multiline(field)) { 811 widget = create_bool_field(field);
626 GtkWidget *textview; 812 else if (type == GAIM_REQUEST_FIELD_CHOICE)
627 813 widget = create_choice_field(field);
628 widget = gtk_scrolled_window_new(NULL, NULL);
629 gtk_scrolled_window_set_shadow_type(
630 GTK_SCROLLED_WINDOW(widget),
631 GTK_SHADOW_IN);
632 gtk_scrolled_window_set_policy(
633 GTK_SCROLLED_WINDOW(widget),
634 GTK_POLICY_NEVER,
635 GTK_POLICY_AUTOMATIC);
636
637 textview = gtk_text_view_new();
638 gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),
639 TRUE);
640 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview),
641 GTK_WRAP_WORD_CHAR);
642
643 if (gaim_prefs_get_bool(
644 "/gaim/gtk/conversations/spellcheck"))
645 {
646 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(textview));
647 }
648
649 gtk_container_add(GTK_CONTAINER(widget), textview);
650 gtk_widget_show(textview);
651
652 gtk_widget_set_size_request(widget, -1, 75);
653
654 if (value != NULL) {
655 GtkTextBuffer *buffer;
656
657 buffer = gtk_text_view_get_buffer(
658 GTK_TEXT_VIEW(textview));
659
660 gtk_text_buffer_set_text(buffer, value, -1);
661 }
662
663 gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),
664 gaim_request_field_string_is_editable(field));
665
666 g_signal_connect(G_OBJECT(textview), "focus-out-event",
667 G_CALLBACK(field_string_focus_out_cb),
668 field);
669 }
670 else {
671 widget = gtk_entry_new();
672
673 if (value != NULL)
674 gtk_entry_set_text(GTK_ENTRY(widget), value);
675
676 gtk_entry_set_visibility(GTK_ENTRY(widget),
677 !gaim_request_field_string_is_masked(field));
678
679 gtk_editable_set_editable(GTK_EDITABLE(widget),
680 gaim_request_field_string_is_editable(field));
681
682 g_signal_connect(G_OBJECT(widget), "focus-out-event",
683 G_CALLBACK(field_string_focus_out_cb),
684 field);
685 }
686 }
687 else if (type == GAIM_REQUEST_FIELD_INTEGER) {
688 int value;
689
690 widget = gtk_entry_new();
691
692 value = gaim_request_field_int_get_default_value(field);
693
694 if (value != 0) {
695 char buf[32];
696
697 g_snprintf(buf, sizeof(buf), "%d", value);
698
699 gtk_entry_set_text(GTK_ENTRY(widget), buf);
700 }
701
702 g_signal_connect(G_OBJECT(widget), "focus-out-event",
703 G_CALLBACK(field_int_focus_out_cb),
704 field);
705 }
706 else if (type == GAIM_REQUEST_FIELD_BOOLEAN) {
707 widget = gtk_check_button_new_with_label(
708 gaim_request_field_get_label(field));
709
710 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
711 gaim_request_field_bool_get_default_value(field));
712
713 g_signal_connect(G_OBJECT(widget), "toggled",
714 G_CALLBACK(field_bool_cb), field);
715 }
716 else if (type == GAIM_REQUEST_FIELD_CHOICE) {
717 GList *labels;
718 GList *l;
719
720 labels = gaim_request_field_choice_get_labels(field);
721
722 if (g_list_length(labels) > 5) {
723 GtkWidget *menu;
724 GtkWidget *item;
725
726 widget = gtk_option_menu_new();
727
728 menu = gtk_menu_new();
729
730 gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), menu);
731
732 for (l = labels; l != NULL; l = l->next) {
733 const char *text = l->data;
734
735 item = gtk_menu_item_new_with_label(text);
736
737 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
738 }
739
740 g_signal_connect(G_OBJECT(widget), "changed",
741 G_CALLBACK(field_choice_menu_cb),
742 field);
743 }
744 else {
745 GtkWidget *box;
746 GtkWidget *first_radio = NULL;
747 GtkWidget *radio;
748
749 if (g_list_length(labels) == 2)
750 box = gtk_hbox_new(FALSE, 6);
751 else
752 box = gtk_vbox_new(FALSE, 0);
753
754 widget = box;
755
756 for (l = labels; l != NULL; l = l->next) {
757 const char *text = l->data;
758
759 radio =
760 gtk_radio_button_new_with_label_from_widget(
761 GTK_RADIO_BUTTON(first_radio), text);
762
763 if (first_radio == NULL)
764 first_radio = radio;
765
766 gtk_box_pack_start(GTK_BOX(box), radio,
767 TRUE, TRUE, 0);
768 gtk_widget_show(radio);
769
770 g_signal_connect(G_OBJECT(radio), "toggled",
771 G_CALLBACK(field_choice_option_cb),
772 field);
773 }
774 }
775 }
776 814
777 if (type == GAIM_REQUEST_FIELD_STRING && 815 if (type == GAIM_REQUEST_FIELD_STRING &&
778 gaim_request_field_string_is_multiline(field)) { 816 gaim_request_field_string_is_multiline(field))
779 817 {
780 gtk_table_attach(GTK_TABLE(table), widget, 818 gtk_table_attach(GTK_TABLE(table), widget,
781 0, 2 * cols, 819 0, 2 * cols,
782 row_num, row_num + 1, 820 row_num, row_num + 1,
783 GTK_FILL | GTK_EXPAND, 821 GTK_FILL | GTK_EXPAND,
784 GTK_FILL | GTK_EXPAND, 822 GTK_FILL | GTK_EXPAND,
785 5, 0); 823 5, 0);
786 } 824 }
787 else if (type != GAIM_REQUEST_FIELD_BOOLEAN) { 825 else if (type != GAIM_REQUEST_FIELD_BOOLEAN)
826 {
788 gtk_table_attach(GTK_TABLE(table), widget, 827 gtk_table_attach(GTK_TABLE(table), widget,
789 col_offset + 1, col_offset + 2, 828 col_offset + 1, col_offset + 2,
790 row_num, row_num + 1, 829 row_num, row_num + 1,
791 GTK_FILL | GTK_EXPAND, 830 GTK_FILL | GTK_EXPAND,
792 GTK_FILL | GTK_EXPAND, 831 GTK_FILL | GTK_EXPAND,
793 5, 0); 832 5, 0);
794 } 833 }
795 else { 834 else
835 {
796 gtk_table_attach(GTK_TABLE(table), widget, 836 gtk_table_attach(GTK_TABLE(table), widget,
797 col_offset, col_offset + 1, 837 col_offset, col_offset + 1,
798 row_num, row_num + 1, 838 row_num, row_num + 1,
799 GTK_FILL | GTK_EXPAND, 839 GTK_FILL | GTK_EXPAND,
800 GTK_FILL | GTK_EXPAND, 840 GTK_FILL | GTK_EXPAND,