| 176 purple_request_close(PURPLE_REQUEST_INPUT, data); |
176 purple_request_close(PURPLE_REQUEST_INPUT, data); |
| 177 } |
177 } |
| 178 |
178 |
| 179 |
179 |
| 180 static void |
180 static void |
| 181 choice_response_cb(G_GNUC_UNUSED GtkDialog *dialog, G_GNUC_UNUSED gint id, G_GNUC_UNUSED PidginRequestData *data) |
181 choice_response_cb(GtkDialog *dialog, gint id, PidginRequestData *data) { |
| 182 { |
182 GtkDropDown *dropdown = g_object_get_data(G_OBJECT(dialog), "dropdown"); |
| 183 #warning please rewrite me |
|
| 184 #if 0 |
|
| 185 GtkWidget *radio = g_object_get_data(G_OBJECT(dialog), "radio"); |
|
| 186 GSList *group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio)); |
|
| 187 |
183 |
| 188 generic_response_start(data); |
184 generic_response_start(data); |
| 189 |
185 |
| 190 if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL) |
186 if(0 <= id && (gsize)id < data->cb_count && data->cbs[id] != NULL) { |
| 191 while (group) { |
187 GObject *item = gtk_drop_down_get_selected_item(dropdown); |
| 192 if (gtk_check_button_get_active(GTK_CHECK_BUTTON(group->data))) { |
188 if(G_IS_OBJECT(item)) { |
| 193 ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, g_object_get_data(G_OBJECT(group->data), "choice_value")); |
189 gpointer value = g_object_get_data(item, "choice_value"); |
| 194 break; |
190 ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, value); |
| 195 } |
191 } |
| 196 group = group->next; |
192 } |
| 197 } |
193 |
| 198 purple_request_close(PURPLE_REQUEST_INPUT, data); |
194 purple_request_close(PURPLE_REQUEST_INPUT, data); |
| 199 #endif |
|
| 200 } |
195 } |
| 201 |
196 |
| 202 static gboolean |
197 static gboolean |
| 203 field_string_focus_out_cb(GtkEventControllerFocus *controller, |
198 field_string_focus_out_cb(GtkEventControllerFocus *controller, |
| 204 PurpleRequestField *field) |
199 PurpleRequestField *field) |
| 268 |
263 |
| 269 req_field_changed_common(GTK_WIDGET(button), field); |
264 req_field_changed_common(GTK_WIDGET(button), field); |
| 270 } |
265 } |
| 271 |
266 |
| 272 static void |
267 static void |
| 273 field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field) |
268 field_choice_option_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, |
| 274 { |
269 gpointer data) |
| 275 int active = gtk_combo_box_get_active(menu); |
270 { |
| 276 gpointer *values = g_object_get_data(G_OBJECT(menu), "values"); |
271 PurpleRequestField *field = data; |
| 277 |
272 GtkDropDown *dropdown = GTK_DROP_DOWN(obj); |
| 278 g_return_if_fail(values != NULL); |
273 GObject *item = gtk_drop_down_get_selected_item(dropdown); |
| 279 g_return_if_fail(active >= 0); |
274 |
| 280 |
275 if(G_IS_OBJECT(item)) { |
| 281 purple_request_field_choice_set_value(field, values[active]); |
276 gpointer value = g_object_get_data(item, "choice_value"); |
| 282 } |
277 purple_request_field_choice_set_value(field, value); |
| 283 |
278 } |
| 284 static void |
|
| 285 field_choice_option_cb(G_GNUC_UNUSED GtkCheckButton *button, G_GNUC_UNUSED PurpleRequestField *field) |
|
| 286 { |
|
| 287 #warning please rewrite me |
|
| 288 #if 0 |
|
| 289 int active; |
|
| 290 gpointer *values = g_object_get_data(G_OBJECT(g_object_get_data( |
|
| 291 G_OBJECT(button), "box")), "values"); |
|
| 292 |
|
| 293 if (!gtk_check_button_get_active(GTK_CHECK_BUTTON(button))) { |
|
| 294 return; |
|
| 295 } |
|
| 296 |
|
| 297 active = (g_slist_length(gtk_radio_button_get_group(button)) - |
|
| 298 g_slist_index(gtk_radio_button_get_group(button), button)) - 1; |
|
| 299 |
|
| 300 g_return_if_fail(values != NULL); |
|
| 301 g_return_if_fail(active >= 0); |
|
| 302 |
|
| 303 purple_request_field_choice_set_value(field, values[active]); |
|
| 304 #endif |
|
| 305 } |
279 } |
| 306 |
280 |
| 307 static void |
281 static void |
| 308 field_account_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, gpointer data) |
282 field_account_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, gpointer data) |
| 309 { |
283 { |
| 690 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, |
664 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, |
| 691 PurpleRequestCommonParameters *cpar, void *user_data, va_list args) |
665 PurpleRequestCommonParameters *cpar, void *user_data, va_list args) |
| 692 { |
666 { |
| 693 PidginRequestData *data; |
667 PidginRequestData *data; |
| 694 GtkWidget *dialog; |
668 GtkWidget *dialog; |
| 695 GtkWidget *vbox, *vbox2; |
669 GtkWidget *vbox; |
| 696 GtkWidget *hbox; |
670 GtkWidget *hbox; |
| 697 GtkWidget *label; |
671 GtkWidget *label; |
| 698 GtkWidget *img; |
672 GtkWidget *img; |
| 699 GtkWidget *first_radio = NULL; |
673 GtkWidget *dropdown; |
| |
674 GListModel *model; |
| 700 GtkWidget *content; |
675 GtkWidget *content; |
| 701 char *label_text; |
676 char *label_text; |
| 702 char *radio_text; |
677 const char *radio_text; |
| 703 char *primary_esc, *secondary_esc; |
678 char *primary_esc, *secondary_esc; |
| |
679 guint index, selected; |
| 704 |
680 |
| 705 data = g_new0(PidginRequestData, 1); |
681 data = g_new0(PidginRequestData, 1); |
| 706 data->type = PURPLE_REQUEST_ACTION; |
682 data->type = PURPLE_REQUEST_ACTION; |
| 707 data->user_data = user_data; |
683 data->user_data = user_data; |
| 708 |
684 |
| 778 gtk_widget_set_vexpand(label, TRUE); |
754 gtk_widget_set_vexpand(label, TRUE); |
| 779 gtk_box_append(GTK_BOX(vbox), label); |
755 gtk_box_append(GTK_BOX(vbox), label); |
| 780 |
756 |
| 781 g_free(label_text); |
757 g_free(label_text); |
| 782 |
758 |
| 783 vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); |
759 dropdown = gtk_drop_down_new_from_strings(NULL); |
| 784 gtk_box_append(GTK_BOX(vbox), vbox2); |
760 gtk_box_append(GTK_BOX(vbox), dropdown); |
| 785 while ((radio_text = va_arg(args, char*))) { |
761 g_object_set_data(G_OBJECT(dialog), "dropdown", dropdown); |
| 786 GtkWidget *radio = NULL; |
762 |
| |
763 index = 0; |
| |
764 selected = GTK_INVALID_LIST_POSITION; |
| |
765 model = gtk_drop_down_get_model(GTK_DROP_DOWN(dropdown)); |
| |
766 while((radio_text = va_arg(args, const char *))) { |
| |
767 GObject *item = NULL; |
| 787 gpointer resp = va_arg(args, gpointer); |
768 gpointer resp = va_arg(args, gpointer); |
| 788 |
769 |
| 789 radio = gtk_check_button_new_with_label(radio_text); |
770 gtk_string_list_append(GTK_STRING_LIST(model), radio_text); |
| 790 |
771 item = g_list_model_get_item(model, index); |
| 791 if(first_radio == NULL) { |
772 g_object_set_data(item, "choice_value", resp); |
| 792 first_radio = radio; |
|
| 793 } else { |
|
| 794 gtk_check_button_set_group(GTK_CHECK_BUTTON(radio), |
|
| 795 GTK_CHECK_BUTTON(first_radio)); |
|
| 796 } |
|
| 797 |
|
| 798 gtk_box_append(GTK_BOX(vbox2), radio); |
|
| 799 |
|
| 800 g_object_set_data(G_OBJECT(radio), "choice_value", resp); |
|
| 801 if (resp == default_value) { |
773 if (resp == default_value) { |
| 802 gtk_check_button_set_active(GTK_CHECK_BUTTON(radio), TRUE); |
774 selected = index; |
| 803 } |
775 } |
| 804 } |
776 |
| 805 |
777 g_clear_object(&item); |
| 806 g_object_set_data(G_OBJECT(dialog), "radio", first_radio); |
778 index++; |
| |
779 } |
| |
780 |
| |
781 if(selected != GTK_INVALID_LIST_POSITION) { |
| |
782 gtk_drop_down_set_selected(GTK_DROP_DOWN(dropdown), selected); |
| |
783 } |
| 807 |
784 |
| 808 /* Show everything. */ |
785 /* Show everything. */ |
| 809 pidgin_auto_parent_window(dialog); |
786 pidgin_auto_parent_window(dialog); |
| 810 |
787 |
| 811 gtk_widget_show(dialog); |
788 gtk_widget_show(dialog); |
| 1266 |
1243 |
| 1267 return widget; |
1244 return widget; |
| 1268 } |
1245 } |
| 1269 |
1246 |
| 1270 static GtkWidget * |
1247 static GtkWidget * |
| 1271 create_choice_field(PurpleRequestField *field, |
1248 create_choice_field(PurpleRequestField *field) { |
| 1272 PurpleRequestCommonParameters *cpar) |
|
| 1273 { |
|
| 1274 GtkWidget *widget; |
1249 GtkWidget *widget; |
| 1275 GList *elements = purple_request_field_choice_get_elements(field); |
1250 GListModel *model = NULL; |
| 1276 guint num_labels = g_list_length(elements); |
1251 GList *elements = NULL; |
| 1277 gpointer *values = g_new(gpointer, num_labels); |
1252 guint default_index = GTK_INVALID_LIST_POSITION; |
| 1278 gpointer default_value; |
1253 gpointer default_value; |
| 1279 gboolean default_found = FALSE; |
1254 guint index; |
| 1280 int i; |
|
| 1281 |
1255 |
| 1282 default_value = purple_request_field_choice_get_value(field); |
1256 default_value = purple_request_field_choice_get_value(field); |
| 1283 if (num_labels > 5 || purple_request_cpar_is_compact(cpar)) |
1257 widget = gtk_drop_down_new_from_strings(NULL); |
| 1284 { |
1258 model = gtk_drop_down_get_model(GTK_DROP_DOWN(widget)); |
| 1285 int default_index = 0; |
1259 |
| 1286 widget = gtk_combo_box_text_new(); |
1260 index = 0; |
| 1287 |
1261 elements = purple_request_field_choice_get_elements(field); |
| 1288 i = 0; |
1262 for(GList *l = elements; l != NULL; l = g_list_next(l)) { |
| 1289 for (GList *l = elements; l != NULL; l = g_list_next(l)) |
1263 PurpleKeyValuePair *choice = l->data; |
| 1290 { |
1264 GObject *item = NULL; |
| 1291 PurpleKeyValuePair *choice = l->data; |
1265 |
| 1292 |
1266 gtk_string_list_append(GTK_STRING_LIST(model), choice->key); |
| 1293 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), choice->key); |
1267 item = g_list_model_get_item(model, index); |
| 1294 if (choice->value == default_value) { |
1268 g_object_set_data(item, "choice_value", choice->value); |
| 1295 default_index = i; |
1269 if(choice->value == default_value) { |
| 1296 default_found = TRUE; |
1270 default_index = index; |
| 1297 } |
1271 } |
| 1298 values[i++] = choice->value; |
1272 |
| 1299 } |
1273 g_clear_object(&item); |
| 1300 |
1274 index++; |
| 1301 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), default_index); |
1275 } |
| 1302 |
1276 |
| 1303 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
1277 gtk_drop_down_set_selected(GTK_DROP_DOWN(widget), default_index); |
| 1304 |
1278 |
| 1305 g_signal_connect(G_OBJECT(widget), "changed", |
1279 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
| 1306 G_CALLBACK(field_choice_menu_cb), field); |
1280 |
| 1307 } |
1281 g_signal_connect(G_OBJECT(widget), "notify::selected", |
| 1308 else |
1282 G_CALLBACK(field_choice_option_cb), field); |
| 1309 { |
1283 |
| 1310 GtkWidget *box; |
1284 if(default_index == GTK_INVALID_LIST_POSITION && index > 0) { |
| 1311 GtkWidget *first_radio = NULL; |
1285 GObject *item = g_list_model_get_item(model, 0); |
| 1312 GtkWidget *radio; |
1286 gpointer value = g_object_get_data(item, "choice_value"); |
| 1313 GtkOrientation orientation = GTK_ORIENTATION_HORIZONTAL; |
1287 purple_request_field_choice_set_value(field, value); |
| 1314 |
1288 g_clear_object(&item); |
| 1315 if(num_labels == 2) { |
1289 } |
| 1316 orientation = GTK_ORIENTATION_HORIZONTAL; |
|
| 1317 box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); |
|
| 1318 } else { |
|
| 1319 orientation = GTK_ORIENTATION_VERTICAL; |
|
| 1320 box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); |
|
| 1321 } |
|
| 1322 |
|
| 1323 widget = box; |
|
| 1324 |
|
| 1325 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); |
|
| 1326 |
|
| 1327 i = 0; |
|
| 1328 for (GList *l = elements; l != NULL; l = g_list_next(l)) |
|
| 1329 { |
|
| 1330 PurpleKeyValuePair *choice = l->data; |
|
| 1331 |
|
| 1332 radio = gtk_check_button_new_with_label(choice->key); |
|
| 1333 g_object_set_data(G_OBJECT(radio), "box", box); |
|
| 1334 |
|
| 1335 if(first_radio == NULL) { |
|
| 1336 first_radio = radio; |
|
| 1337 } else { |
|
| 1338 gtk_check_button_set_group(GTK_CHECK_BUTTON(radio), |
|
| 1339 GTK_CHECK_BUTTON(first_radio)); |
|
| 1340 } |
|
| 1341 |
|
| 1342 if (choice->value == default_value) { |
|
| 1343 gtk_check_button_set_active(GTK_CHECK_BUTTON(radio), TRUE); |
|
| 1344 default_found = TRUE; |
|
| 1345 } |
|
| 1346 values[i++] = choice->value; |
|
| 1347 |
|
| 1348 if(orientation == GTK_ORIENTATION_VERTICAL) { |
|
| 1349 gtk_widget_set_vexpand(radio, TRUE); |
|
| 1350 } else if(orientation == GTK_ORIENTATION_HORIZONTAL) { |
|
| 1351 gtk_widget_set_hexpand(radio, TRUE); |
|
| 1352 } |
|
| 1353 |
|
| 1354 gtk_box_append(GTK_BOX(box), radio); |
|
| 1355 |
|
| 1356 g_signal_connect(G_OBJECT(radio), "toggled", |
|
| 1357 G_CALLBACK(field_choice_option_cb), field); |
|
| 1358 } |
|
| 1359 } |
|
| 1360 |
|
| 1361 if (!default_found && i > 0) |
|
| 1362 purple_request_field_choice_set_value(field, values[0]); |
|
| 1363 |
|
| 1364 g_object_set_data_full(G_OBJECT(widget), "values", values, g_free); |
|
| 1365 |
1290 |
| 1366 return widget; |
1291 return widget; |
| 1367 |
|
| 1368 return NULL; |
|
| 1369 } |
1292 } |
| 1370 |
1293 |
| 1371 static GtkWidget * |
1294 static GtkWidget * |
| 1372 create_image_field(PurpleRequestField *field) |
1295 create_image_field(PurpleRequestField *field) |
| 1373 { |
1296 { |
| 2190 else if (type == PURPLE_REQUEST_FIELD_INTEGER) |
2113 else if (type == PURPLE_REQUEST_FIELD_INTEGER) |
| 2191 widget = create_int_field(field); |
2114 widget = create_int_field(field); |
| 2192 else if (type == PURPLE_REQUEST_FIELD_BOOLEAN) |
2115 else if (type == PURPLE_REQUEST_FIELD_BOOLEAN) |
| 2193 widget = create_bool_field(field, cpar); |
2116 widget = create_bool_field(field, cpar); |
| 2194 else if (type == PURPLE_REQUEST_FIELD_CHOICE) |
2117 else if (type == PURPLE_REQUEST_FIELD_CHOICE) |
| 2195 widget = create_choice_field(field, cpar); |
2118 widget = create_choice_field(field); |
| 2196 else if (type == PURPLE_REQUEST_FIELD_LIST) |
2119 else if (type == PURPLE_REQUEST_FIELD_LIST) |
| 2197 widget = create_list_field(field); |
2120 widget = create_list_field(field); |
| 2198 else if (type == PURPLE_REQUEST_FIELD_IMAGE) |
2121 else if (type == PURPLE_REQUEST_FIELD_IMAGE) |
| 2199 widget = create_image_field(field); |
2122 widget = create_image_field(field); |
| 2200 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) |
2123 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) |