pidgin/gtkrequest.c

changeset 34338
c652670afac5
parent 34336
5f3ec29a886b
child 34339
3579cb14f8f2
child 34940
c0aef3b64c56
equal deleted inserted replaced
34337:1d70570eab23 34338:c652670afac5
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 *

mercurial