pidgin/gtkrequest.c

changeset 42097
f29c4d466cf5
parent 42096
13adc8e7563d
child 42098
9f746a79d7c4
equal deleted inserted replaced
42096:13adc8e7563d 42097:f29c4d466cf5
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)

mercurial