| 185 generic_response_start(data); |
185 generic_response_start(data); |
| 186 |
186 |
| 187 if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL) |
187 if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL) |
| 188 while (group) { |
188 while (group) { |
| 189 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data))) { |
189 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data))) { |
| 190 ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(group->data), "choice_id"))); |
190 ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, g_object_get_data(G_OBJECT(group->data), "choice_value")); |
| 191 break; |
191 break; |
| 192 } |
192 } |
| 193 group = group->next; |
193 group = group->next; |
| 194 } |
194 } |
| 195 purple_request_close(PURPLE_REQUEST_INPUT, data); |
195 purple_request_close(PURPLE_REQUEST_INPUT, data); |
| 230 } |
230 } |
| 231 |
231 |
| 232 static void |
232 static void |
| 233 field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field) |
233 field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field) |
| 234 { |
234 { |
| 235 purple_request_field_choice_set_value(field, |
235 int active = gtk_combo_box_get_active(menu); |
| 236 gtk_combo_box_get_active(menu)); |
236 gpointer *values = g_object_get_data(G_OBJECT(menu), "values"); |
| |
237 |
| |
238 g_return_if_fail(values != NULL); |
| |
239 g_return_if_fail(active >= 0); |
| |
240 |
| |
241 purple_request_field_choice_set_value(field, values[active]); |
| 237 } |
242 } |
| 238 |
243 |
| 239 static void |
244 static void |
| 240 field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field) |
245 field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field) |
| 241 { |
246 { |
| 242 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) |
247 int active; |
| 243 purple_request_field_choice_set_value(field, |
248 gpointer *values = g_object_get_data(G_OBJECT(g_object_get_data( |
| 244 (g_slist_length(gtk_radio_button_get_group(button)) - |
249 G_OBJECT(button), "box")), "values"); |
| 245 g_slist_index(gtk_radio_button_get_group(button), button)) - 1); |
250 |
| |
251 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) |
| |
252 return; |
| |
253 |
| |
254 active = (g_slist_length(gtk_radio_button_get_group(button)) - |
| |
255 g_slist_index(gtk_radio_button_get_group(button), button)) - 1; |
| |
256 |
| |
257 g_return_if_fail(values != NULL); |
| |
258 g_return_if_fail(active >= 0); |
| |
259 |
| |
260 purple_request_field_choice_set_value(field, values[active]); |
| 246 } |
261 } |
| 247 |
262 |
| 248 static void |
263 static void |
| 249 field_account_cb(GObject *w, PurpleAccount *account, PurpleRequestField *field) |
264 field_account_cb(GObject *w, PurpleAccount *account, PurpleRequestField *field) |
| 250 { |
265 { |
| 564 return data; |
579 return data; |
| 565 } |
580 } |
| 566 |
581 |
| 567 static void * |
582 static void * |
| 568 pidgin_request_choice(const char *title, const char *primary, |
583 pidgin_request_choice(const char *title, const char *primary, |
| 569 const char *secondary, int default_value, |
584 const char *secondary, gpointer default_value, const char *ok_text, |
| 570 const char *ok_text, GCallback ok_cb, |
585 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, |
| 571 const char *cancel_text, GCallback cancel_cb, |
586 PurpleRequestCommonParameters *cpar, void *user_data, va_list args) |
| 572 PurpleRequestCommonParameters *cpar, |
|
| 573 void *user_data, va_list args) |
|
| 574 { |
587 { |
| 575 PidginRequestData *data; |
588 PidginRequestData *data; |
| 576 GtkWidget *dialog; |
589 GtkWidget *dialog; |
| 577 GtkWidget *vbox, *vbox2; |
590 GtkWidget *vbox, *vbox2; |
| 578 GtkWidget *hbox; |
591 GtkWidget *hbox; |
| 655 g_free(label_text); |
668 g_free(label_text); |
| 656 |
669 |
| 657 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
670 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| 658 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0); |
671 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0); |
| 659 while ((radio_text = va_arg(args, char*))) { |
672 while ((radio_text = va_arg(args, char*))) { |
| 660 int resp = va_arg(args, int); |
673 gpointer resp = va_arg(args, gpointer); |
| 661 radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), radio_text); |
674 radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), radio_text); |
| 662 gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0); |
675 gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0); |
| 663 g_object_set_data(G_OBJECT(radio), "choice_id", GINT_TO_POINTER(resp)); |
676 g_object_set_data(G_OBJECT(radio), "choice_value", resp); |
| 664 if (resp == default_value) |
677 if (resp == default_value) |
| 665 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
678 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
| 666 } |
679 } |
| 667 |
680 |
| 668 g_object_set_data(G_OBJECT(dialog), "radio", radio); |
681 g_object_set_data(G_OBJECT(dialog), "radio", radio); |
| 1007 |
1020 |
| 1008 static GtkWidget * |
1021 static GtkWidget * |
| 1009 create_choice_field(PurpleRequestField *field) |
1022 create_choice_field(PurpleRequestField *field) |
| 1010 { |
1023 { |
| 1011 GtkWidget *widget; |
1024 GtkWidget *widget; |
| 1012 GList *labels = purple_request_field_choice_get_labels(field); |
1025 GList *elements = purple_request_field_choice_get_elements(field); |
| 1013 int num_labels = g_list_length(labels); |
1026 int num_labels = g_list_length(elements) / 2; |
| 1014 GList *l; |
1027 GList *l; |
| 1015 |
1028 gpointer *values = g_new(gpointer, num_labels); |
| |
1029 gpointer default_value; |
| |
1030 int i, default_index = -1; |
| |
1031 |
| |
1032 default_value = purple_request_field_choice_get_default_value(field); |
| 1016 if (num_labels > 5) |
1033 if (num_labels > 5) |
| 1017 { |
1034 { |
| 1018 widget = gtk_combo_box_text_new(); |
1035 widget = gtk_combo_box_text_new(); |
| 1019 |
1036 |
| 1020 for (l = labels; l != NULL; l = l->next) |
1037 i = 0; |
| |
1038 l = elements; |
| |
1039 while (l != NULL) |
| 1021 { |
1040 { |
| 1022 const char *text = l->data; |
1041 const char *text; |
| |
1042 gpointer *value; |
| |
1043 |
| |
1044 text = l->data; |
| |
1045 l = g_list_next(l); |
| |
1046 value = l->data; |
| |
1047 l = g_list_next(l); |
| |
1048 |
| 1023 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), text); |
1049 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), text); |
| |
1050 if (value == default_value) |
| |
1051 default_index = i; |
| |
1052 values[i++] = value; |
| 1024 } |
1053 } |
| 1025 |
1054 |
| 1026 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), |
1055 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), default_index); |
| 1027 purple_request_field_choice_get_default_value(field)); |
|
| 1028 |
1056 |
| 1029 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
1057 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
| 1030 |
1058 |
| 1031 g_signal_connect(G_OBJECT(widget), "changed", |
1059 g_signal_connect(G_OBJECT(widget), "changed", |
| 1032 G_CALLBACK(field_choice_menu_cb), field); |
1060 G_CALLBACK(field_choice_menu_cb), field); |
| 1034 else |
1062 else |
| 1035 { |
1063 { |
| 1036 GtkWidget *box; |
1064 GtkWidget *box; |
| 1037 GtkWidget *first_radio = NULL; |
1065 GtkWidget *first_radio = NULL; |
| 1038 GtkWidget *radio; |
1066 GtkWidget *radio; |
| 1039 gint i; |
|
| 1040 |
1067 |
| 1041 if (num_labels == 2) |
1068 if (num_labels == 2) |
| 1042 box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
1069 box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| 1043 else |
1070 else |
| 1044 box = gtk_vbox_new(FALSE, 0); |
1071 box = gtk_vbox_new(FALSE, 0); |
| 1045 |
1072 |
| 1046 widget = box; |
1073 widget = box; |
| 1047 |
1074 |
| 1048 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
1075 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
| 1049 |
1076 |
| 1050 for (l = labels, i = 0; l != NULL; l = l->next, i++) |
1077 i = 0; |
| |
1078 l = elements; |
| |
1079 while (l != NULL) |
| 1051 { |
1080 { |
| 1052 const char *text = l->data; |
1081 const char *text; |
| |
1082 gpointer *value; |
| |
1083 |
| |
1084 text = l->data; |
| |
1085 l = g_list_next(l); |
| |
1086 value = l->data; |
| |
1087 l = g_list_next(l); |
| 1053 |
1088 |
| 1054 radio = gtk_radio_button_new_with_label_from_widget( |
1089 radio = gtk_radio_button_new_with_label_from_widget( |
| 1055 GTK_RADIO_BUTTON(first_radio), text); |
1090 GTK_RADIO_BUTTON(first_radio), text); |
| |
1091 g_object_set_data(G_OBJECT(radio), "box", box); |
| 1056 |
1092 |
| 1057 if (first_radio == NULL) |
1093 if (first_radio == NULL) |
| 1058 first_radio = radio; |
1094 first_radio = radio; |
| 1059 |
1095 |
| 1060 if (i == purple_request_field_choice_get_default_value(field)) |
1096 if (value == default_value) |
| 1061 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
1097 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); |
| |
1098 values[i++] = value; |
| 1062 |
1099 |
| 1063 gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0); |
1100 gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0); |
| 1064 gtk_widget_show(radio); |
1101 gtk_widget_show(radio); |
| 1065 |
1102 |
| 1066 g_signal_connect(G_OBJECT(radio), "toggled", |
1103 g_signal_connect(G_OBJECT(radio), "toggled", |
| 1067 G_CALLBACK(field_choice_option_cb), field); |
1104 G_CALLBACK(field_choice_option_cb), field); |
| 1068 } |
1105 } |
| 1069 } |
1106 } |
| |
1107 |
| |
1108 g_object_set_data_full(G_OBJECT(widget), "values", values, g_free); |
| 1070 |
1109 |
| 1071 return widget; |
1110 return widget; |
| 1072 } |
1111 } |
| 1073 |
1112 |
| 1074 static GtkWidget * |
1113 static GtkWidget * |