Mercurial > pidgin
comparison src/gtksavedstatuses.c @ 12080:3b52d94437f3
[gaim-migrate @ 14377]
The rest of sf patch #1354886, from Sadrul Habib Chowdhury, with
an EXTREME amount of changes from me. Come to me, first, if something
doesn't work.
This allows you to edit the substatuses of a saved status.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 14 Nov 2005 07:20:22 +0000 |
parents | 351f4dd75718 |
children | 5e24b8e49522 |
comparison
equal
deleted
inserted
replaced
12079:15732b01ea3d | 12080:3b52d94437f3 |
---|---|
38 #include "gtkimhtmltoolbar.h" | 38 #include "gtkimhtmltoolbar.h" |
39 #include "gtksavedstatuses.h" | 39 #include "gtksavedstatuses.h" |
40 #include "gtkstock.h" | 40 #include "gtkstock.h" |
41 #include "gtkutils.h" | 41 #include "gtkutils.h" |
42 | 42 |
43 /* | |
44 * TODO: Should attach to the account-deleted and account-added signals | |
45 * and update the GtkListStores in any StatusEditor windows that | |
46 * may be open. | |
47 */ | |
48 | |
49 /** | |
50 * These are used for the GtkTreeView when you're scrolling through | |
51 * all your saved statuses. | |
52 */ | |
43 enum | 53 enum |
44 { | 54 { |
45 /* A hidden column containing a pointer to the GaimStatusType */ | |
46 STATUS_WINDOW_COLUMN_STATUS, | |
47 | |
48 STATUS_WINDOW_COLUMN_TITLE, | 55 STATUS_WINDOW_COLUMN_TITLE, |
49 STATUS_WINDOW_COLUMN_TYPE, | 56 STATUS_WINDOW_COLUMN_TYPE, |
50 STATUS_WINDOW_COLUMN_MESSAGE, | 57 STATUS_WINDOW_COLUMN_MESSAGE, |
51 STATUS_WINDOW_NUM_COLUMNS | 58 STATUS_WINDOW_NUM_COLUMNS |
52 }; | 59 }; |
53 | 60 |
61 /** | |
62 * These is used for the GtkTreeView containing the list of accounts | |
63 * at the bottom of the window when you're editing a particular | |
64 * saved status. | |
65 */ | |
54 enum | 66 enum |
55 { | 67 { |
56 STATUS_EDITOR_COLUMN_CUSTOM_STATUS, | 68 /** A hidden column containing a pointer to the GaimAccount */ |
69 STATUS_EDITOR_COLUMN_ACCOUNT, | |
70 STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, | |
57 STATUS_EDITOR_COLUMN_ICON, | 71 STATUS_EDITOR_COLUMN_ICON, |
58 STATUS_EDITOR_COLUMN_SCREENNAME, | 72 STATUS_EDITOR_COLUMN_SCREENNAME, |
73 /** A hidden column containing the ID of this GaimStatusType. */ | |
74 STATUS_EDITOR_COLUMN_STATUS_ID, | |
75 STATUS_EDITOR_COLUMN_STATUS_NAME, | |
76 STATUS_EDITOR_COLUMN_STATUS_MESSAGE, | |
59 STATUS_EDITOR_NUM_COLUMNS | 77 STATUS_EDITOR_NUM_COLUMNS |
78 }; | |
79 | |
80 /** | |
81 * These are used in the GtkComboBox to select the specific | |
82 * GaimStatusType when setting a substatus for a particular saved | |
83 * status. | |
84 */ | |
85 enum | |
86 { | |
87 /** A hidden column containing a pointer to the GaimAccount. */ | |
88 SUBSTATUS_COLUMN_ACCOUNT, | |
89 SUBSTATUS_COLUMN_ICON, | |
90 /** A hidden column containing the ID of this GaimStatusType. */ | |
91 SUBSTATUS_COLUMN_STATUS_ID, | |
92 SUBSTATUS_COLUMN_STATUS_NAME, | |
93 SUBSTATUS_NUM_COLUMNS | |
60 }; | 94 }; |
61 | 95 |
62 typedef struct | 96 typedef struct |
63 { | 97 { |
64 GtkWidget *window; | 98 GtkWidget *window; |
80 GtkEntry *title; | 114 GtkEntry *title; |
81 GtkOptionMenu *type; | 115 GtkOptionMenu *type; |
82 GtkIMHtml *message; | 116 GtkIMHtml *message; |
83 } StatusEditor; | 117 } StatusEditor; |
84 | 118 |
119 typedef struct | |
120 { | |
121 StatusEditor *status_editor; | |
122 GaimAccount *account; | |
123 | |
124 GtkWidget *window; | |
125 GtkListStore *model; | |
126 GtkComboBox *box; | |
127 GtkIMHtml *message; | |
128 GtkIMHtmlToolbar *toolbar; | |
129 } SubStatusEditor; | |
130 | |
85 static StatusWindow *status_window = NULL; | 131 static StatusWindow *status_window = NULL; |
86 | 132 |
87 | 133 |
88 /************************************************************************** | 134 /************************************************************************** |
89 * Status window | 135 * Status window |
151 static void | 197 static void |
152 status_window_use_cb(GtkButton *button, StatusWindow *dialog) | 198 status_window_use_cb(GtkButton *button, StatusWindow *dialog) |
153 { | 199 { |
154 GtkTreeSelection *selection; | 200 GtkTreeSelection *selection; |
155 GtkTreeIter iter; | 201 GtkTreeIter iter; |
156 GaimSavedStatus *saved_status; | |
157 GList *list = NULL; | 202 GList *list = NULL; |
158 int num_selected = 0; | 203 int num_selected = 0; |
159 | 204 |
160 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); | 205 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); |
161 | 206 |
178 #endif | 223 #endif |
179 | 224 |
180 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), | 225 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), |
181 &iter, list->data)) | 226 &iter, list->data)) |
182 { | 227 { |
228 gchar *title; | |
229 GaimSavedStatus *saved_status; | |
183 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, | 230 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, |
184 STATUS_WINDOW_COLUMN_STATUS, &saved_status, | 231 STATUS_WINDOW_COLUMN_TITLE, &title, |
185 -1); | 232 -1); |
186 | 233 saved_status = gaim_savedstatus_find(title); |
234 g_free(title); | |
187 gaim_savedstatus_activate(saved_status); | 235 gaim_savedstatus_activate(saved_status); |
188 } | 236 } |
189 | 237 |
190 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL); | 238 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL); |
191 g_list_free(list); | 239 g_list_free(list); |
199 | 247 |
200 static void | 248 static void |
201 status_window_modify_foreach(GtkTreeModel *model, GtkTreePath *path, | 249 status_window_modify_foreach(GtkTreeModel *model, GtkTreePath *path, |
202 GtkTreeIter *iter, gpointer user_data) | 250 GtkTreeIter *iter, gpointer user_data) |
203 { | 251 { |
204 GaimSavedStatus *status; | 252 gchar *title; |
205 | 253 GaimSavedStatus *saved_status; |
206 gtk_tree_model_get(model, iter, STATUS_WINDOW_COLUMN_STATUS, &status, -1); | 254 |
207 gaim_gtk_status_editor_show(status); | 255 gtk_tree_model_get(model, iter, STATUS_WINDOW_COLUMN_TITLE, &title, -1); |
256 saved_status = gaim_savedstatus_find(title); | |
257 g_free(title); | |
258 gaim_gtk_status_editor_show(saved_status); | |
208 } | 259 } |
209 | 260 |
210 static void | 261 static void |
211 status_window_modify_cb(GtkButton *button, gpointer user_data) | 262 status_window_modify_cb(GtkButton *button, gpointer user_data) |
212 { | 263 { |
298 type = gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved_status)); | 349 type = gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved_status)); |
299 message = gaim_markup_strip_html(gaim_savedstatus_get_message(saved_status)); | 350 message = gaim_markup_strip_html(gaim_savedstatus_get_message(saved_status)); |
300 | 351 |
301 gtk_list_store_append(model, &iter); | 352 gtk_list_store_append(model, &iter); |
302 gtk_list_store_set(model, &iter, | 353 gtk_list_store_set(model, &iter, |
303 STATUS_WINDOW_COLUMN_STATUS, saved_status, | |
304 STATUS_WINDOW_COLUMN_TITLE, title, | 354 STATUS_WINDOW_COLUMN_TITLE, title, |
305 STATUS_WINDOW_COLUMN_TYPE, type, | 355 STATUS_WINDOW_COLUMN_TYPE, type, |
306 STATUS_WINDOW_COLUMN_MESSAGE, message, | 356 STATUS_WINDOW_COLUMN_MESSAGE, message, |
307 -1); | 357 -1); |
308 free(message); | 358 free(message); |
355 GTK_SHADOW_IN); | 405 GTK_SHADOW_IN); |
356 gtk_widget_show(sw); | 406 gtk_widget_show(sw); |
357 | 407 |
358 /* Create the list model */ | 408 /* Create the list model */ |
359 dialog->model = gtk_list_store_new(STATUS_WINDOW_NUM_COLUMNS, | 409 dialog->model = gtk_list_store_new(STATUS_WINDOW_NUM_COLUMNS, |
360 G_TYPE_POINTER, | |
361 G_TYPE_STRING, | 410 G_TYPE_STRING, |
362 G_TYPE_STRING, | 411 G_TYPE_STRING, |
363 G_TYPE_STRING); | 412 G_TYPE_STRING); |
364 | 413 |
365 /* Create the treeview */ | 414 /* Create the treeview */ |
585 { | 634 { |
586 StatusEditor *dialog = user_data; | 635 StatusEditor *dialog = user_data; |
587 const char *title; | 636 const char *title; |
588 GaimStatusPrimitive type; | 637 GaimStatusPrimitive type; |
589 char *message, *unformatted; | 638 char *message, *unformatted; |
590 GaimSavedStatus *status; | 639 GaimSavedStatus *saved_status = NULL; |
640 GtkTreeModel *model; | |
641 GtkTreeIter iter; | |
591 | 642 |
592 title = gtk_entry_get_text(dialog->title); | 643 title = gtk_entry_get_text(dialog->title); |
593 | 644 |
594 /* | 645 /* |
595 * If the title is already taken then show an error dialog and | 646 * If the title is already taken then show an error dialog and |
606 type = gtk_option_menu_get_history(dialog->type); | 657 type = gtk_option_menu_get_history(dialog->type); |
607 message = gtk_imhtml_get_markup(dialog->message); | 658 message = gtk_imhtml_get_markup(dialog->message); |
608 unformatted = gaim_markup_strip_html(message); | 659 unformatted = gaim_markup_strip_html(message); |
609 | 660 |
610 /* | 661 /* |
611 * If we're editing an existing status, remove the old one to | 662 * If we're editing an old status, then lookup the old status (it's |
612 * make way for the modified one. | 663 * possible that it has been deleted or renamed or something, and |
664 * no longer exists). | |
613 */ | 665 */ |
614 if (dialog->original_title != NULL) | 666 if (dialog->original_title != NULL) |
615 { | 667 { |
616 GtkTreeIter iter; | 668 GtkTreeIter iter; |
617 | 669 |
618 gaim_savedstatus_delete(dialog->original_title); | 670 saved_status = gaim_savedstatus_find(dialog->original_title); |
619 | 671 |
620 if (status_window_find_savedstatus(&iter, dialog->original_title)) | 672 if (status_window_find_savedstatus(&iter, dialog->original_title)) |
621 { | 673 { |
622 gtk_list_store_remove(status_window->model, &iter); | 674 gtk_list_store_remove(status_window->model, &iter); |
623 } | 675 } |
624 } | 676 } |
625 | 677 |
626 status = gaim_savedstatus_new(title, type); | 678 if (saved_status == NULL) |
679 { | |
680 /* This is a new status */ | |
681 saved_status = gaim_savedstatus_new(title, type); | |
682 } | |
683 else | |
684 { | |
685 /* Modify the old status */ | |
686 if (strcmp(title, dialog->original_title)) | |
687 gaim_savedstatus_set_title(saved_status, title); | |
688 gaim_savedstatus_set_type(saved_status, type); | |
689 } | |
690 | |
627 if (*unformatted != '\0') | 691 if (*unformatted != '\0') |
628 gaim_savedstatus_set_message(status, message); | 692 gaim_savedstatus_set_message(saved_status, message); |
693 | |
694 /* Set any substatuses */ | |
695 model = GTK_TREE_MODEL(dialog->model); | |
696 if (gtk_tree_model_get_iter_first(model, &iter)) | |
697 { | |
698 GaimAccount *account; | |
699 gboolean enabled; | |
700 char *id; | |
701 char *message; | |
702 GaimStatusType *type; | |
703 | |
704 gtk_tree_model_get(model, &iter, | |
705 STATUS_EDITOR_COLUMN_ACCOUNT, &account, | |
706 STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, &enabled, | |
707 STATUS_EDITOR_COLUMN_STATUS_ID, &id, | |
708 STATUS_EDITOR_COLUMN_STATUS_MESSAGE, &message, | |
709 -1); | |
710 if (enabled) | |
711 { | |
712 type = gaim_account_get_status_type(account, id); | |
713 gaim_savedstatus_set_substatus(saved_status, account, type, message); | |
714 } | |
715 g_free(id); | |
716 g_free(message); | |
717 | |
718 while (gtk_tree_model_iter_next(model, &iter)) | |
719 { | |
720 gtk_tree_model_get(model, &iter, | |
721 STATUS_EDITOR_COLUMN_ACCOUNT, &account, | |
722 STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, &enabled, | |
723 STATUS_EDITOR_COLUMN_STATUS_ID, &id, | |
724 STATUS_EDITOR_COLUMN_STATUS_MESSAGE, &message, | |
725 -1); | |
726 if (enabled) | |
727 { | |
728 type = gaim_account_get_status_type(account, id); | |
729 gaim_savedstatus_set_substatus(saved_status, account, type, message); | |
730 } | |
731 g_free(id); | |
732 g_free(message); | |
733 } | |
734 } | |
735 | |
629 g_free(message); | 736 g_free(message); |
630 g_free(unformatted); | 737 g_free(unformatted); |
631 | 738 |
632 gtk_widget_destroy(dialog->window); | 739 gtk_widget_destroy(dialog->window); |
633 g_free(dialog->original_title); | 740 g_free(dialog->original_title); |
634 g_free(dialog); | 741 g_free(dialog); |
635 | 742 |
636 add_status_to_saved_status_list(status_window->model, status); | 743 if (status_window != NULL) |
637 } | 744 add_status_to_saved_status_list(status_window->model, saved_status); |
638 | |
639 static void | |
640 status_editor_custom_status_cb(GtkCellRendererToggle *renderer, gchar *path_str, gpointer data) | |
641 { | |
642 /* StatusEditor *dialog = (StatusEditor *)data; */ | |
643 | |
644 /* TODO: Need to allow user to set a custom status for the highlighted account, somehow */ | |
645 } | 745 } |
646 | 746 |
647 static void | 747 static void |
648 editor_title_changed_cb(GtkWidget *widget, gpointer user_data) | 748 editor_title_changed_cb(GtkWidget *widget, gpointer user_data) |
649 { | 749 { |
678 gtk_widget_show(menu); | 778 gtk_widget_show(menu); |
679 | 779 |
680 return dropdown; | 780 return dropdown; |
681 } | 781 } |
682 | 782 |
783 static void edit_substatus(StatusEditor *status_editor, GaimAccount *account); | |
784 | |
785 static void | |
786 edit_substatus_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data) | |
787 { | |
788 StatusEditor *dialog = user_data; | |
789 GtkTreeIter iter; | |
790 GaimAccount *account; | |
791 | |
792 gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path); | |
793 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, | |
794 STATUS_EDITOR_COLUMN_ACCOUNT, &account, | |
795 -1); | |
796 | |
797 edit_substatus(dialog, account); | |
798 } | |
799 | |
800 static void | |
801 status_editor_substatus_cb(GtkCellRendererToggle *renderer, gchar *path_str, gpointer data) | |
802 { | |
803 StatusEditor *dialog = (StatusEditor *)data; | |
804 GtkTreeIter iter; | |
805 gboolean enabled; | |
806 GaimAccount *account; | |
807 | |
808 gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(dialog->model), &iter, path_str); | |
809 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, | |
810 STATUS_EDITOR_COLUMN_ACCOUNT, &account, | |
811 STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, &enabled, | |
812 -1); | |
813 | |
814 enabled = !enabled; | |
815 | |
816 if (enabled) | |
817 { | |
818 edit_substatus(dialog, account); | |
819 } | |
820 else | |
821 { | |
822 GaimSavedStatus *saved_status; | |
823 | |
824 /* Remove the substatus */ | |
825 saved_status = gaim_savedstatus_find(dialog->original_title); | |
826 gaim_savedstatus_unset_substatus(saved_status, account); | |
827 gtk_list_store_set(dialog->model, &iter, | |
828 STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, enabled, | |
829 STATUS_EDITOR_COLUMN_STATUS_ID, NULL, | |
830 STATUS_EDITOR_COLUMN_STATUS_NAME, NULL, | |
831 STATUS_EDITOR_COLUMN_STATUS_MESSAGE, NULL, | |
832 -1); | |
833 } | |
834 } | |
835 | |
683 static void | 836 static void |
684 status_editor_add_columns(StatusEditor *dialog) | 837 status_editor_add_columns(StatusEditor *dialog) |
685 { | 838 { |
686 GtkCellRenderer *renderer; | 839 GtkCellRenderer *renderer; |
687 GtkTreeViewColumn *column; | 840 GtkTreeViewColumn *column; |
688 | 841 |
689 /* Custom status column */ | 842 /* Enable Different status column */ |
690 renderer = gtk_cell_renderer_toggle_new(); | 843 renderer = gtk_cell_renderer_toggle_new(); |
691 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(dialog->treeview), | 844 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(dialog->treeview), |
692 -1, _("Custom status"), | 845 -1, _("Different"), |
693 renderer, | 846 renderer, |
694 "active", STATUS_EDITOR_COLUMN_CUSTOM_STATUS, | 847 "active", STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, |
695 NULL); | 848 NULL); |
696 column = gtk_tree_view_get_column(GTK_TREE_VIEW(dialog->treeview), 1); | 849 column = gtk_tree_view_get_column(GTK_TREE_VIEW(dialog->treeview), 1); |
697 g_signal_connect(G_OBJECT(renderer), "toggled", | 850 g_signal_connect(G_OBJECT(renderer), "toggled", |
698 G_CALLBACK(status_editor_custom_status_cb), dialog); | 851 G_CALLBACK(status_editor_substatus_cb), dialog); |
699 | 852 |
700 /* Screen Name column */ | 853 /* Screen Name column */ |
701 column = gtk_tree_view_column_new(); | 854 column = gtk_tree_view_column_new(); |
702 gtk_tree_view_column_set_resizable(column, TRUE); | 855 gtk_tree_view_column_set_resizable(column, TRUE); |
703 gtk_tree_view_column_set_title(column, _("Screen Name")); | 856 gtk_tree_view_column_set_title(column, _("Screen Name")); |
713 /* Screen Name */ | 866 /* Screen Name */ |
714 renderer = gtk_cell_renderer_text_new(); | 867 renderer = gtk_cell_renderer_text_new(); |
715 gtk_tree_view_column_pack_start(column, renderer, TRUE); | 868 gtk_tree_view_column_pack_start(column, renderer, TRUE); |
716 gtk_tree_view_column_add_attribute(column, renderer, "text", | 869 gtk_tree_view_column_add_attribute(column, renderer, "text", |
717 STATUS_EDITOR_COLUMN_SCREENNAME); | 870 STATUS_EDITOR_COLUMN_SCREENNAME); |
718 } | 871 |
719 | 872 /* Status column */ |
720 static void | 873 column = gtk_tree_view_column_new(); |
721 status_editor_set_account(GtkListStore *store, GaimAccount *account, GtkTreeIter *iter) | 874 gtk_tree_view_column_set_resizable(column, TRUE); |
875 gtk_tree_view_column_set_title(column, _("Status")); | |
876 gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog->treeview), column, -1); | |
877 gtk_tree_view_column_set_resizable(column, TRUE); | |
878 renderer = gtk_cell_renderer_text_new(); | |
879 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
880 gtk_tree_view_column_add_attribute(column, renderer, "text", | |
881 STATUS_EDITOR_COLUMN_STATUS_NAME); | |
882 | |
883 /* Message column */ | |
884 column = gtk_tree_view_column_new(); | |
885 gtk_tree_view_column_set_resizable(column, TRUE); | |
886 gtk_tree_view_column_set_title(column, _("Message")); | |
887 gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog->treeview), column, -1); | |
888 gtk_tree_view_column_set_resizable(column, TRUE); | |
889 renderer = gtk_cell_renderer_text_new(); | |
890 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
891 gtk_tree_view_column_add_attribute(column, renderer, "text", | |
892 STATUS_EDITOR_COLUMN_STATUS_MESSAGE); | |
893 | |
894 g_signal_connect(G_OBJECT(dialog->treeview), "row-activated", | |
895 G_CALLBACK(edit_substatus_cb), dialog); | |
896 } | |
897 | |
898 static void | |
899 status_editor_set_account(GtkListStore *store, GaimAccount *account, | |
900 GtkTreeIter *iter, GaimSavedStatusSub *substatus) | |
722 { | 901 { |
723 GdkPixbuf *pixbuf; | 902 GdkPixbuf *pixbuf; |
724 GdkPixbuf *scale; | 903 GdkPixbuf *scale; |
904 const char *id = NULL, *name = NULL, *message = NULL; | |
725 | 905 |
726 scale = NULL; | 906 scale = NULL; |
727 | 907 |
728 pixbuf = gaim_gtk_create_prpl_icon(account); | 908 pixbuf = gaim_gtk_create_prpl_icon(account); |
729 | 909 |
733 | 913 |
734 if (gaim_account_is_disconnected(account)) | 914 if (gaim_account_is_disconnected(account)) |
735 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); | 915 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); |
736 } | 916 } |
737 | 917 |
918 if (substatus != NULL) | |
919 { | |
920 const GaimStatusType *type; | |
921 | |
922 type = gaim_savedstatus_substatus_get_type(substatus); | |
923 id = gaim_status_type_get_id(type); | |
924 name = gaim_status_type_get_name(type); | |
925 if (gaim_status_type_get_attr(type, "message")) | |
926 message = gaim_savedstatus_substatus_get_message(substatus); | |
927 } | |
928 | |
738 gtk_list_store_set(store, iter, | 929 gtk_list_store_set(store, iter, |
930 STATUS_EDITOR_COLUMN_ACCOUNT, account, | |
931 STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, (substatus != NULL), | |
739 STATUS_EDITOR_COLUMN_ICON, scale, | 932 STATUS_EDITOR_COLUMN_ICON, scale, |
740 STATUS_EDITOR_COLUMN_SCREENNAME, gaim_account_get_username(account), | 933 STATUS_EDITOR_COLUMN_SCREENNAME, gaim_account_get_username(account), |
934 STATUS_EDITOR_COLUMN_STATUS_ID, id, | |
935 STATUS_EDITOR_COLUMN_STATUS_NAME, name, | |
936 STATUS_EDITOR_COLUMN_STATUS_MESSAGE, message, | |
741 -1); | 937 -1); |
742 | 938 |
743 if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); | 939 if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); |
744 if (scale != NULL) g_object_unref(G_OBJECT(scale)); | 940 if (scale != NULL) g_object_unref(G_OBJECT(scale)); |
745 } | 941 } |
746 | 942 |
747 static void | 943 static void |
748 status_editor_add_account(StatusEditor *dialog, GaimAccount *account) | 944 status_editor_add_account(StatusEditor *dialog, GaimAccount *account, |
945 GaimSavedStatusSub *substatus) | |
749 { | 946 { |
750 GtkTreeIter iter; | 947 GtkTreeIter iter; |
751 | 948 |
752 gtk_list_store_append(dialog->model, &iter); | 949 gtk_list_store_append(dialog->model, &iter); |
753 | 950 |
754 status_editor_set_account(dialog->model, account, &iter); | 951 status_editor_set_account(dialog->model, account, &iter, substatus); |
755 } | 952 } |
756 | 953 |
757 static void | 954 static void |
758 status_editor_populate_list(StatusEditor *dialog) | 955 status_editor_populate_list(StatusEditor *dialog, GaimSavedStatus *saved_status) |
759 { | 956 { |
760 GList *l; | 957 GList *iter; |
958 GaimSavedStatusSub *substatus; | |
761 | 959 |
762 gtk_list_store_clear(dialog->model); | 960 gtk_list_store_clear(dialog->model); |
763 | 961 |
764 for (l = gaim_accounts_get_all(); l != NULL; l = l->next) | 962 for (iter = gaim_accounts_get_all(); iter != NULL; iter = iter->next) |
765 status_editor_add_account(dialog, (GaimAccount *)l->data); | 963 { |
964 GaimAccount *account = (GaimAccount *)iter->data; | |
965 | |
966 if (saved_status != NULL) | |
967 substatus = gaim_savedstatus_get_substatus(saved_status, account); | |
968 else | |
969 substatus = NULL; | |
970 | |
971 status_editor_add_account(dialog, account, substatus); | |
972 } | |
766 } | 973 } |
767 | 974 |
768 void | 975 void |
769 gaim_gtk_status_editor_show(GaimSavedStatus *status) | 976 gaim_gtk_status_editor_show(GaimSavedStatus *saved_status) |
770 { | 977 { |
771 StatusEditor *dialog; | 978 StatusEditor *dialog; |
772 GtkSizeGroup *sg; | 979 GtkSizeGroup *sg; |
773 GtkWidget *bbox; | 980 GtkWidget *bbox; |
774 GtkWidget *button; | 981 GtkWidget *button; |
785 GtkWidget *vbox; | 992 GtkWidget *vbox; |
786 GtkWidget *win; | 993 GtkWidget *win; |
787 | 994 |
788 dialog = g_new0(StatusEditor, 1); | 995 dialog = g_new0(StatusEditor, 1); |
789 | 996 |
790 if (status != NULL) | 997 if (saved_status != NULL) |
791 dialog->original_title = g_strdup(gaim_savedstatus_get_title(status)); | 998 dialog->original_title = g_strdup(gaim_savedstatus_get_title(saved_status)); |
792 | 999 |
793 dialog->window = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | 1000 dialog->window = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
794 gtk_window_set_role(GTK_WINDOW(win), "status"); | 1001 gtk_window_set_role(GTK_WINDOW(win), "status"); |
795 gtk_window_set_title(GTK_WINDOW(win), _("Status")); | 1002 gtk_window_set_title(GTK_WINDOW(win), _("Status")); |
796 gtk_window_set_resizable(GTK_WINDOW(win), FALSE); | 1003 gtk_window_set_resizable(GTK_WINDOW(win), FALSE); |
817 gtk_widget_show(label); | 1024 gtk_widget_show(label); |
818 gtk_size_group_add_widget(sg, label); | 1025 gtk_size_group_add_widget(sg, label); |
819 | 1026 |
820 entry = gtk_entry_new(); | 1027 entry = gtk_entry_new(); |
821 dialog->title = GTK_ENTRY(entry); | 1028 dialog->title = GTK_ENTRY(entry); |
822 if (status != NULL) | 1029 if (dialog->original_title != NULL) |
823 gtk_entry_set_text(GTK_ENTRY(entry), dialog->original_title); | 1030 gtk_entry_set_text(GTK_ENTRY(entry), dialog->original_title); |
824 gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); | 1031 gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); |
825 gtk_widget_show(entry); | 1032 gtk_widget_show(entry); |
826 g_signal_connect(G_OBJECT(entry), "changed", | 1033 g_signal_connect(G_OBJECT(entry), "changed", |
827 G_CALLBACK(editor_title_changed_cb), dialog); | 1034 G_CALLBACK(editor_title_changed_cb), dialog); |
835 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | 1042 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
836 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | 1043 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
837 gtk_widget_show(label); | 1044 gtk_widget_show(label); |
838 gtk_size_group_add_widget(sg, label); | 1045 gtk_size_group_add_widget(sg, label); |
839 | 1046 |
840 if (status != NULL) | 1047 if (saved_status != NULL) |
841 dropdown = create_status_type_menu(gaim_savedstatus_get_type(status)); | 1048 dropdown = create_status_type_menu(gaim_savedstatus_get_type(saved_status)); |
842 else | 1049 else |
843 dropdown = create_status_type_menu(GAIM_STATUS_AWAY); | 1050 dropdown = create_status_type_menu(GAIM_STATUS_AWAY); |
844 dialog->type = GTK_OPTION_MENU(dropdown); | 1051 dialog->type = GTK_OPTION_MENU(dropdown); |
845 gtk_box_pack_start(GTK_BOX(hbox), dropdown, TRUE, TRUE, 0); | 1052 gtk_box_pack_start(GTK_BOX(hbox), dropdown, TRUE, TRUE, 0); |
846 gtk_widget_show(dropdown); | 1053 gtk_widget_show(dropdown); |
859 frame = gaim_gtk_create_imhtml(TRUE, &text, &toolbar); | 1066 frame = gaim_gtk_create_imhtml(TRUE, &text, &toolbar); |
860 dialog->message = GTK_IMHTML(text); | 1067 dialog->message = GTK_IMHTML(text); |
861 gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); | 1068 gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); |
862 gtk_widget_show(frame); | 1069 gtk_widget_show(frame); |
863 | 1070 |
864 if ((status != NULL) && (gaim_savedstatus_get_message(status) != NULL)) | 1071 if ((saved_status != NULL) && (gaim_savedstatus_get_message(saved_status) != NULL)) |
865 gtk_imhtml_append_text(GTK_IMHTML(text), | 1072 gtk_imhtml_append_text(GTK_IMHTML(text), |
866 gaim_savedstatus_get_message(status), 0); | 1073 gaim_savedstatus_get_message(saved_status), 0); |
867 | 1074 |
868 /* Custom status message expander */ | 1075 /* Different status message expander */ |
869 expander = gtk_expander_new_with_mnemonic(_("Use a _different status for some accounts")); | 1076 expander = gtk_expander_new_with_mnemonic(_("Use a _different status for some accounts")); |
870 gtk_box_pack_start(GTK_BOX(vbox), expander, FALSE, FALSE, 0); | 1077 gtk_box_pack_start(GTK_BOX(vbox), expander, FALSE, FALSE, 0); |
871 gtk_widget_show(expander); | 1078 gtk_widget_show(expander); |
872 | 1079 |
873 /* Setup the box that the expander will cover */ | 1080 /* Setup the box that the expander will cover */ |
874 dbox = gtk_vbox_new(FALSE, GAIM_HIG_CAT_SPACE); | 1081 dbox = gtk_vbox_new(FALSE, GAIM_HIG_CAT_SPACE); |
875 gtk_container_add(GTK_CONTAINER(expander), dbox); | 1082 gtk_container_add(GTK_CONTAINER(expander), dbox); |
876 gtk_widget_show(dbox); | 1083 gtk_widget_show(dbox); |
877 | 1084 |
878 /* Custom status message treeview */ | 1085 /* Different status message treeview */ |
879 sw = gtk_scrolled_window_new(NULL, NULL); | 1086 sw = gtk_scrolled_window_new(NULL, NULL); |
880 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | 1087 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), |
881 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | 1088 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); |
882 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | 1089 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), |
883 GTK_SHADOW_IN); | 1090 GTK_SHADOW_IN); |
884 gtk_box_pack_start(GTK_BOX(dbox), sw, TRUE, TRUE, 0); | 1091 gtk_box_pack_start(GTK_BOX(dbox), sw, TRUE, TRUE, 0); |
885 gtk_widget_show(sw); | 1092 gtk_widget_show(sw); |
886 | 1093 |
887 /* Create the list model */ | 1094 /* Create the list model */ |
888 dialog->model = gtk_list_store_new(STATUS_EDITOR_NUM_COLUMNS, | 1095 dialog->model = gtk_list_store_new(STATUS_EDITOR_NUM_COLUMNS, |
1096 G_TYPE_POINTER, | |
889 G_TYPE_BOOLEAN, | 1097 G_TYPE_BOOLEAN, |
890 GDK_TYPE_PIXBUF, G_TYPE_STRING); | 1098 GDK_TYPE_PIXBUF, |
1099 G_TYPE_STRING, | |
1100 G_TYPE_STRING, | |
1101 G_TYPE_STRING, | |
1102 G_TYPE_STRING); | |
891 | 1103 |
892 /* Create the treeview */ | 1104 /* Create the treeview */ |
893 dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); | 1105 dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); |
894 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dialog->treeview), TRUE); | 1106 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dialog->treeview), TRUE); |
895 gtk_widget_set_size_request(dialog->treeview, 400, 250); | 1107 gtk_widget_set_size_request(dialog->treeview, 400, 250); |
898 | 1110 |
899 /* Add columns */ | 1111 /* Add columns */ |
900 status_editor_add_columns(dialog); | 1112 status_editor_add_columns(dialog); |
901 | 1113 |
902 /* Populate list */ | 1114 /* Populate list */ |
903 status_editor_populate_list(dialog); | 1115 status_editor_populate_list(dialog, saved_status); |
904 | 1116 |
905 /* Button box */ | 1117 /* Button box */ |
906 bbox = gtk_hbutton_box_new(); | 1118 bbox = gtk_hbutton_box_new(); |
907 gtk_box_set_spacing(GTK_BOX(bbox), GAIM_HIG_BOX_SPACE); | 1119 gtk_box_set_spacing(GTK_BOX(bbox), GAIM_HIG_BOX_SPACE); |
908 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | 1120 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); |
919 | 1131 |
920 /* Save button */ | 1132 /* Save button */ |
921 button = gtk_button_new_from_stock(GTK_STOCK_SAVE); | 1133 button = gtk_button_new_from_stock(GTK_STOCK_SAVE); |
922 dialog->save_button = button; | 1134 dialog->save_button = button; |
923 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | 1135 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); |
1136 if (dialog->title == NULL) | |
1137 gtk_widget_set_sensitive(button, FALSE); | |
924 gtk_widget_show(button); | 1138 gtk_widget_show(button); |
925 | 1139 |
926 g_signal_connect(G_OBJECT(button), "clicked", | 1140 g_signal_connect(G_OBJECT(button), "clicked", |
927 G_CALLBACK(status_editor_save_cb), dialog); | 1141 G_CALLBACK(status_editor_save_cb), dialog); |
1142 | |
1143 gtk_widget_show(win); | |
1144 } | |
1145 | |
1146 | |
1147 /************************************************************************** | |
1148 * SubStatus editor | |
1149 **************************************************************************/ | |
1150 | |
1151 static void | |
1152 substatus_selection_changed_cb(GtkComboBox *box, gpointer user_data) | |
1153 { | |
1154 SubStatusEditor *select = user_data; | |
1155 GtkTreeIter iter; | |
1156 GaimAccount *account; | |
1157 char *id; | |
1158 GaimStatusType *type; | |
1159 | |
1160 if (!gtk_combo_box_get_active_iter(box, &iter)) | |
1161 return; | |
1162 gtk_tree_model_get(GTK_TREE_MODEL(select->model), &iter, | |
1163 SUBSTATUS_COLUMN_ACCOUNT, &account, | |
1164 SUBSTATUS_COLUMN_STATUS_ID, &id, | |
1165 -1); | |
1166 type = gaim_account_get_status_type(account, id); | |
1167 g_free(id); | |
1168 | |
1169 if (gaim_status_type_get_attr(type, "message") == NULL) | |
1170 { | |
1171 gtk_widget_set_sensitive(GTK_WIDGET(select->message), FALSE); | |
1172 gtk_widget_set_sensitive(GTK_WIDGET(select->toolbar), FALSE); | |
1173 } | |
1174 else | |
1175 { | |
1176 gtk_widget_set_sensitive(GTK_WIDGET(select->message), TRUE); | |
1177 gtk_widget_set_sensitive(GTK_WIDGET(select->toolbar), TRUE); | |
1178 } | |
1179 } | |
1180 | |
1181 static gboolean | |
1182 substatus_editor_destroy_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) | |
1183 { | |
1184 SubStatusEditor *dialog = user_data; | |
1185 | |
1186 g_free(dialog); | |
1187 | |
1188 return FALSE; | |
1189 } | |
1190 | |
1191 void | |
1192 substatus_editor_cancel_cb(GtkButton *button, gpointer user_data) | |
1193 { | |
1194 SubStatusEditor *dialog = user_data; | |
1195 | |
1196 gtk_widget_destroy(dialog->window); | |
1197 | |
1198 g_free(dialog); | |
1199 } | |
1200 | |
1201 static gboolean | |
1202 status_editor_find_account_in_treemodel(GtkTreeIter *iter, | |
1203 StatusEditor *status_editor, | |
1204 GaimAccount *account) | |
1205 { | |
1206 GtkTreeModel *model; | |
1207 GaimAccount *cur; | |
1208 | |
1209 g_return_val_if_fail(status_editor != NULL, FALSE); | |
1210 g_return_val_if_fail(account != NULL, FALSE); | |
1211 | |
1212 model = GTK_TREE_MODEL(status_editor->model); | |
1213 | |
1214 if (!gtk_tree_model_get_iter_first(model, iter)) | |
1215 return FALSE; | |
1216 | |
1217 gtk_tree_model_get(model, iter, STATUS_EDITOR_COLUMN_ACCOUNT, &cur, -1); | |
1218 if (cur == account) | |
1219 return TRUE; | |
1220 | |
1221 while (gtk_tree_model_iter_next(model, iter)) | |
1222 { | |
1223 gtk_tree_model_get(model, iter, STATUS_EDITOR_COLUMN_ACCOUNT, &cur, -1); | |
1224 if (cur == account) | |
1225 return TRUE; | |
1226 } | |
1227 | |
1228 return FALSE; | |
1229 } | |
1230 | |
1231 void | |
1232 substatus_editor_ok_cb(GtkButton *button, gpointer user_data) | |
1233 { | |
1234 SubStatusEditor *dialog = user_data; | |
1235 StatusEditor *status_editor; | |
1236 GtkTreeIter iter; | |
1237 GaimAccount *account; | |
1238 GaimStatusType *type; | |
1239 char *id = NULL; | |
1240 char *message = NULL; | |
1241 const char *name = NULL; | |
1242 | |
1243 gtk_combo_box_get_active_iter(dialog->box, &iter); | |
1244 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, | |
1245 SUBSTATUS_COLUMN_ACCOUNT, &account, | |
1246 SUBSTATUS_COLUMN_STATUS_ID, &id, | |
1247 -1); | |
1248 type = gaim_account_get_status_type(account, id); | |
1249 if (gaim_status_type_get_attr(type, "message") != NULL) | |
1250 message = gtk_imhtml_get_text(GTK_IMHTML(dialog->message), NULL, NULL); | |
1251 name = gaim_status_type_get_name(type); | |
1252 | |
1253 status_editor = dialog->status_editor; | |
1254 | |
1255 if (status_editor_find_account_in_treemodel(&iter, status_editor, account)) | |
1256 { | |
1257 gtk_list_store_set(status_editor->model, &iter, | |
1258 STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, TRUE, | |
1259 STATUS_EDITOR_COLUMN_STATUS_ID, id, | |
1260 STATUS_EDITOR_COLUMN_STATUS_NAME, name, | |
1261 STATUS_EDITOR_COLUMN_STATUS_MESSAGE, message, | |
1262 -1); | |
1263 } | |
1264 | |
1265 gtk_widget_destroy(dialog->window); | |
1266 g_free(id); | |
1267 g_free(message); | |
1268 g_free(dialog); | |
1269 } | |
1270 | |
1271 static void | |
1272 edit_substatus(StatusEditor *status_editor, GaimAccount *account) | |
1273 { | |
1274 char *tmp; | |
1275 SubStatusEditor *dialog; | |
1276 GtkSizeGroup *sg; | |
1277 GtkWidget *bbox; | |
1278 GtkWidget *button; | |
1279 GtkWidget *combo; | |
1280 GtkWidget *hbox; | |
1281 GtkWidget *frame; | |
1282 GtkWidget *label; | |
1283 GtkWidget *text; | |
1284 GtkWidget *toolbar; | |
1285 GtkWidget *vbox; | |
1286 GtkWidget *win; | |
1287 GtkTreeIter iter; | |
1288 GtkCellRenderer *rend; | |
1289 const char *id = NULL; | |
1290 const GList *list; | |
1291 gboolean select = FALSE; | |
1292 | |
1293 g_return_if_fail(status_editor != NULL); | |
1294 g_return_if_fail(account != NULL); | |
1295 | |
1296 dialog = g_new0(SubStatusEditor, 1); | |
1297 dialog->status_editor = status_editor; | |
1298 | |
1299 dialog->window = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
1300 gtk_window_set_role(GTK_WINDOW(win), "substatus"); | |
1301 tmp = g_strdup_printf(_("Status for %s"), gaim_account_get_username(account)); | |
1302 gtk_window_set_title(GTK_WINDOW(win), tmp); | |
1303 g_free(tmp); | |
1304 gtk_window_set_resizable(GTK_WINDOW(win), FALSE); | |
1305 gtk_container_set_border_width(GTK_CONTAINER(win), GAIM_HIG_BORDER); | |
1306 | |
1307 g_signal_connect(G_OBJECT(win), "delete_event", | |
1308 G_CALLBACK(substatus_editor_destroy_cb), dialog); | |
1309 | |
1310 /* Setup the vbox */ | |
1311 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BORDER); | |
1312 gtk_container_add(GTK_CONTAINER(win), vbox); | |
1313 gtk_widget_show(vbox); | |
1314 | |
1315 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
1316 | |
1317 /* Status type */ | |
1318 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
1319 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
1320 gtk_widget_show(hbox); | |
1321 | |
1322 label = gtk_label_new_with_mnemonic(_("_Status:")); | |
1323 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
1324 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
1325 gtk_widget_show(label); | |
1326 gtk_size_group_add_widget(sg, label); | |
1327 | |
1328 dialog->model = gtk_list_store_new(SUBSTATUS_NUM_COLUMNS, | |
1329 G_TYPE_POINTER, | |
1330 GDK_TYPE_PIXBUF, | |
1331 G_TYPE_STRING, | |
1332 G_TYPE_STRING); | |
1333 combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(dialog->model)); | |
1334 dialog->box = GTK_COMBO_BOX(combo); | |
1335 | |
1336 rend = GTK_CELL_RENDERER(gtk_cell_renderer_pixbuf_new()); | |
1337 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), rend, FALSE); | |
1338 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), rend, | |
1339 "pixbuf", SUBSTATUS_COLUMN_ICON, NULL); | |
1340 | |
1341 rend = GTK_CELL_RENDERER(gtk_cell_renderer_text_new()); | |
1342 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), rend, TRUE); | |
1343 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), rend, | |
1344 "text", SUBSTATUS_COLUMN_STATUS_NAME, NULL); | |
1345 | |
1346 g_signal_connect(G_OBJECT(combo), "changed", | |
1347 G_CALLBACK(substatus_selection_changed_cb), dialog); | |
1348 | |
1349 gtk_box_pack_start(GTK_BOX(hbox), combo, FALSE, FALSE, 0); | |
1350 gtk_widget_show(combo); | |
1351 | |
1352 /* Status mesage */ | |
1353 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
1354 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
1355 gtk_widget_show(hbox); | |
1356 | |
1357 label = gtk_label_new_with_mnemonic(_("_Message:")); | |
1358 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
1359 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
1360 gtk_widget_show(label); | |
1361 gtk_size_group_add_widget(sg, label); | |
1362 | |
1363 frame = gaim_gtk_create_imhtml(TRUE, &text, &toolbar); | |
1364 dialog->message = GTK_IMHTML(text); | |
1365 dialog->toolbar = GTK_IMHTMLTOOLBAR(toolbar); | |
1366 gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); | |
1367 gtk_widget_show(frame); | |
1368 | |
1369 /* Button box */ | |
1370 bbox = gtk_hbutton_box_new(); | |
1371 gtk_box_set_spacing(GTK_BOX(bbox), GAIM_HIG_BOX_SPACE); | |
1372 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
1373 gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, TRUE, 0); | |
1374 gtk_widget_show(bbox); | |
1375 | |
1376 /* Cancel button */ | |
1377 button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); | |
1378 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
1379 gtk_widget_show(button); | |
1380 | |
1381 g_signal_connect(G_OBJECT(button), "clicked", | |
1382 G_CALLBACK(substatus_editor_cancel_cb), dialog); | |
1383 | |
1384 /* OK button */ | |
1385 button = gtk_button_new_from_stock(GTK_STOCK_OK); | |
1386 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
1387 gtk_widget_show(button); | |
1388 | |
1389 g_signal_connect(G_OBJECT(button), "clicked", | |
1390 G_CALLBACK(substatus_editor_ok_cb), dialog); | |
1391 | |
1392 /* Seed the input widgets with the current values */ | |
1393 /* TODO: Get the current values from our parent's list store, not the saved_status! */ | |
1394 if (status_editor->original_title != NULL) | |
1395 { | |
1396 GaimSavedStatus *saved_status = NULL; | |
1397 GaimSavedStatusSub *substatus = NULL; | |
1398 | |
1399 saved_status = gaim_savedstatus_find(status_editor->original_title); | |
1400 if (saved_status != NULL) | |
1401 substatus = gaim_savedstatus_get_substatus(saved_status, account); | |
1402 | |
1403 if (substatus != NULL) | |
1404 { | |
1405 gtk_imhtml_append_text(dialog->message, | |
1406 gaim_savedstatus_substatus_get_message(substatus), | |
1407 0); | |
1408 id = gaim_status_type_get_id(gaim_savedstatus_substatus_get_type(substatus)); | |
1409 } | |
1410 } | |
1411 | |
1412 for (list = gaim_account_get_status_types(account); list; list = list->next) | |
1413 { | |
1414 GaimStatusType *status_type; | |
1415 GdkPixbuf *pixbuf, *scale = NULL; | |
1416 const char *id, *name; | |
1417 | |
1418 status_type = list->data; | |
1419 id = gaim_status_type_get_id(status_type); | |
1420 pixbuf = gaim_gtk_create_prpl_icon_with_status(account, status_type); | |
1421 if (pixbuf != NULL) | |
1422 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
1423 name = gaim_status_type_get_name(status_type); | |
1424 | |
1425 gtk_list_store_append(dialog->model, &iter); | |
1426 gtk_list_store_set(dialog->model, &iter, | |
1427 SUBSTATUS_COLUMN_ACCOUNT, account, | |
1428 SUBSTATUS_COLUMN_ICON, scale, | |
1429 SUBSTATUS_COLUMN_STATUS_ID, id, | |
1430 SUBSTATUS_COLUMN_STATUS_NAME, name, | |
1431 -1); | |
1432 if (id && !strcmp(id, gaim_status_type_get_id(status_type))) | |
1433 { | |
1434 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo), &iter); | |
1435 select = TRUE; | |
1436 } | |
1437 } | |
1438 | |
1439 if (!select) | |
1440 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); | |
928 | 1441 |
929 gtk_widget_show(win); | 1442 gtk_widget_show(win); |
930 } | 1443 } |
931 | 1444 |
932 | 1445 |