src/gtkrequest.c

changeset 5811
f9b61b4eda57
parent 5794
ebdbb7dc6658
child 5813
ba2693e8db07
equal deleted inserted replaced
5810:1d659318f194 5811:f9b61b4eda57
48 48
49 } input; 49 } input;
50 50
51 } u; 51 } u;
52 52
53 } GaimRequestData; 53 } GaimGtkRequestData;
54 54
55 static void 55 static void
56 input_response_cb(GtkDialog *dialog, gint id, GaimRequestData *data) 56 input_response_cb(GtkDialog *dialog, gint id, GaimGtkRequestData *data)
57 { 57 {
58 const char *value; 58 const char *value;
59 59
60 if (data->u.input.multiline) { 60 if (data->u.input.multiline) {
61 GtkTextIter start_iter, end_iter; 61 GtkTextIter start_iter, end_iter;
76 76
77 gaim_request_close(GAIM_REQUEST_INPUT, data); 77 gaim_request_close(GAIM_REQUEST_INPUT, data);
78 } 78 }
79 79
80 static void 80 static void
81 action_response_cb(GtkDialog *dialog, gint id, GaimRequestData *data) 81 action_response_cb(GtkDialog *dialog, gint id, GaimGtkRequestData *data)
82 { 82 {
83 if (id < data->cb_count && data->cbs[id] != NULL) 83 if (id < data->cb_count && data->cbs[id] != NULL)
84 ((GaimRequestActionCb)data->cbs[id])(data->user_data, id); 84 ((GaimRequestActionCb)data->cbs[id])(data->user_data, id);
85 85
86 gaim_request_close(GAIM_REQUEST_INPUT, data); 86 gaim_request_close(GAIM_REQUEST_INPUT, data);
112 gboolean multiline, 112 gboolean multiline,
113 const char *ok_text, GCallback ok_cb, 113 const char *ok_text, GCallback ok_cb,
114 const char *cancel_text, GCallback cancel_cb, 114 const char *cancel_text, GCallback cancel_cb,
115 void *user_data) 115 void *user_data)
116 { 116 {
117 GaimRequestData *data; 117 GaimGtkRequestData *data;
118 GtkWidget *dialog; 118 GtkWidget *dialog;
119 GtkWidget *vbox; 119 GtkWidget *vbox;
120 GtkWidget *hbox; 120 GtkWidget *hbox;
121 GtkWidget *label; 121 GtkWidget *label;
122 GtkWidget *entry; 122 GtkWidget *entry;
123 GtkWidget *img; 123 GtkWidget *img;
124 char *label_text; 124 char *label_text;
125 125
126 data = g_new0(GaimRequestData, 1); 126 data = g_new0(GaimGtkRequestData, 1);
127 data->type = GAIM_REQUEST_INPUT; 127 data->type = GAIM_REQUEST_INPUT;
128 data->user_data = user_data; 128 data->user_data = user_data;
129 129
130 data->cb_count = 2; 130 data->cb_count = 2;
131 data->cbs = g_new0(GCallback, 2); 131 data->cbs = g_new0(GCallback, 2);
240 void * 240 void *
241 gaim_gtk_request_action(const char *title, const char *primary, 241 gaim_gtk_request_action(const char *title, const char *primary,
242 const char *secondary, unsigned int default_action, 242 const char *secondary, unsigned int default_action,
243 void *user_data, size_t action_count, va_list actions) 243 void *user_data, size_t action_count, va_list actions)
244 { 244 {
245 GaimRequestData *data; 245 GaimGtkRequestData *data;
246 GtkWidget *dialog; 246 GtkWidget *dialog;
247 GtkWidget *vbox; 247 GtkWidget *vbox;
248 GtkWidget *hbox; 248 GtkWidget *hbox;
249 GtkWidget *label; 249 GtkWidget *label;
250 GtkWidget *img; 250 GtkWidget *img;
251 void **buttons; 251 void **buttons;
252 char *label_text; 252 char *label_text;
253 int i; 253 int i;
254 254
255 data = g_new0(GaimRequestData, 1); 255 data = g_new0(GaimGtkRequestData, 1);
256 data->type = GAIM_REQUEST_ACTION; 256 data->type = GAIM_REQUEST_ACTION;
257 data->user_data = user_data; 257 data->user_data = user_data;
258 258
259 data->cb_count = action_count; 259 data->cb_count = action_count;
260 data->cbs = g_new0(GCallback, action_count); 260 data->cbs = g_new0(GCallback, action_count);
325 gtk_widget_show_all(dialog); 325 gtk_widget_show_all(dialog);
326 326
327 return data; 327 return data;
328 } 328 }
329 329
330 void *
331 gaim_gtk_request_fields(const char *title, const char *primary,
332 const char *secondary, GaimRequestFields *fields,
333 const char *ok_text, GCallback ok_cb,
334 const char *cancel_text, GCallback cancel_cb,
335 void *user_data)
336 {
337 GaimGtkRequestData *data;
338 GtkWidget *win;
339 GtkWidget *vbox;
340 GtkWidget *frame;
341 GtkWidget *label;
342 GtkWidget *table;
343 GList *gl, *fl;
344 GaimRequestFieldGroup *group;
345 GaimRequestField *field;
346 char *text;
347 char *label_text;
348
349 data = g_new0(GaimGtkRequestData, 1);
350 data->type = GAIM_REQUEST_FIELDS;
351 data->user_data = user_data;
352
353 data->cb_count = 2;
354 data->cbs = g_new0(GCallback, 2);
355
356 data->cbs[0] = ok_cb;
357 data->cbs[1] = cancel_cb;
358
359 data->dialog = win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
360 gtk_window_set_role(GTK_WINDOW(win), "fields request");
361 gtk_container_set_border_width(GTK_CONTAINER(win), 12);
362 gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
363
364 /* Setup the vbox */
365 vbox = gtk_vbox_new(FALSE, 12);
366 gtk_container_add(GTK_CONTAINER(win), vbox);
367 gtk_widget_show(vbox);
368
369 if (primary != NULL || secondary != NULL) {
370 label_text = g_strdup_printf("<span weight=\"bold\" size=\"larger\">"
371 "%s</span>\n\n%s",
372 (primary ? primary : ""),
373 (secondary ? secondary : ""));
374
375 label = gtk_label_new(NULL);
376
377 gtk_label_set_markup(GTK_LABEL(label), label_text);
378 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
379 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
380 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
381
382 g_free(label_text);
383 }
384
385 for (gl = gaim_request_fields_get_groups(fields);
386 gl != NULL;
387 gl = gl->next) {
388
389 GList *fields;
390 size_t field_count = 0;
391 size_t cols = 1;
392 size_t rows;
393 size_t col_num;
394 size_t row_num;
395
396 group = gl->data;
397 fields = gaim_request_field_group_get_fields(group);
398
399 frame = gaim_gtk_make_frame(vbox,
400 gaim_request_field_group_get_title(group));
401
402 field_count = g_list_length(fields);
403
404 if (field_count > 9) {
405 rows = field_count / 2;
406 cols++;
407 }
408 else
409 rows = field_count;
410
411 table = gtk_table_new(rows, 2 * cols, FALSE);
412 gtk_table_set_row_spacings(GTK_TABLE(table), 6);
413 gtk_table_set_col_spacings(GTK_TABLE(table), 6);
414
415 gtk_container_add(GTK_CONTAINER(frame), table);
416 gtk_widget_show(table);
417
418 for (col_num = 0, fl = fields;
419 col_num < cols && fl != NULL;
420 col_num++) {
421
422 for (row_num = 0;
423 row_num < rows && fl != NULL;
424 row_num++, fl = fl->next) {
425
426 size_t col_offset = col_num * 2;
427 GaimRequestFieldType type;
428 GtkWidget *widget = NULL;
429
430 field = fl->data;
431
432 type = gaim_request_field_get_type(field);
433
434 if (type != GAIM_REQUEST_FIELD_BOOLEAN) {
435 text = g_strdup_printf("%s:",
436 gaim_request_field_get_label(field));
437 label = gtk_label_new(text);
438 g_free(text);
439
440 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
441
442 gtk_table_attach_defaults(GTK_TABLE(table), label,
443 col_offset, col_offset + 1,
444 row_num, row_num + 1);
445 gtk_widget_show(label);
446 }
447
448 if (type == GAIM_REQUEST_FIELD_STRING) {
449 const char *value;
450
451 widget = gtk_entry_new();
452
453 value = gaim_request_field_string_get_default_value(field);
454
455 if (value != NULL)
456 gtk_entry_set_text(GTK_ENTRY(widget), value);
457 }
458 else if (type == GAIM_REQUEST_FIELD_INTEGER) {
459 int value;
460
461 widget = gtk_entry_new();
462
463 value = gaim_request_field_int_get_default_value(field);
464
465 if (value != 0) {
466 char buf[32];
467
468 g_snprintf(buf, sizeof(buf), "%d", value);
469
470 gtk_entry_set_text(GTK_ENTRY(widget), buf);
471 }
472 }
473 else if (type == GAIM_REQUEST_FIELD_BOOLEAN) {
474 widget = gtk_check_button_new_with_label(
475 gaim_request_field_get_label(field));
476
477 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
478 gaim_request_field_bool_get_default_value(field));
479 }
480 else if (type == GAIM_REQUEST_FIELD_CHOICE) {
481 GList *labels;
482 GList *l;
483
484 labels = gaim_request_field_choice_get_labels(field);
485
486 if (g_list_length(labels) > 5) {
487 GtkWidget *menu;
488 GtkWidget *item;
489
490 widget = gtk_option_menu_new();
491
492 menu = gtk_menu_new();
493
494 gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), menu);
495
496 for (l = labels; l != NULL; l = l->next) {
497 const char *text = l->data;
498
499 item = gtk_menu_item_new_with_label(text);
500
501 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
502 }
503 }
504 else {
505 GtkWidget *box;
506 GtkWidget *first_radio = NULL;
507 GtkWidget *radio;
508
509 if (g_list_length(labels) == 2)
510 box = gtk_hbox_new(FALSE, 6);
511 else
512 box = gtk_vbox_new(FALSE, 0);
513
514 widget = box;
515
516 for (l = labels; l != NULL; l = l->next) {
517 const char *text = l->data;
518
519 radio =
520 gtk_radio_button_new_with_label_from_widget(
521 GTK_RADIO_BUTTON(first_radio), text);
522
523 if (first_radio == NULL)
524 first_radio = radio;
525
526 gtk_box_pack_start(GTK_BOX(box), radio,
527 TRUE, TRUE, 0);
528 gtk_widget_show(radio);
529 }
530 }
531 }
532
533 if (type != GAIM_REQUEST_FIELD_BOOLEAN) {
534 gtk_table_attach(GTK_TABLE(table), widget,
535 col_offset + 1, col_offset + 2,
536 row_num, row_num + 1,
537 GTK_FILL | GTK_EXPAND,
538 GTK_FILL | GTK_EXPAND,
539 5, 0);
540 }
541 else {
542 gtk_table_attach(GTK_TABLE(table), widget,
543 col_offset, col_offset + 1,
544 row_num, row_num + 1,
545 GTK_FILL | GTK_EXPAND,
546 GTK_FILL | GTK_EXPAND,
547 5, 0);
548 }
549
550 gtk_widget_show(widget);
551
552 field->ui_data = widget;
553 }
554 }
555 }
556
557 gtk_widget_show(win);
558
559 return data;
560 }
561
330 void 562 void
331 gaim_gtk_close_request(GaimRequestType type, void *ui_handle) 563 gaim_gtk_close_request(GaimRequestType type, void *ui_handle)
332 { 564 {
333 GaimRequestData *data = (GaimRequestData *)ui_handle; 565 GaimGtkRequestData *data = (GaimGtkRequestData *)ui_handle;
334 566
335 if (data->cbs != NULL) 567 if (data->cbs != NULL)
336 g_free(data->cbs); 568 g_free(data->cbs);
337 569
338 gtk_widget_destroy(data->dialog); 570 gtk_widget_destroy(data->dialog);
343 static GaimRequestUiOps ops = 575 static GaimRequestUiOps ops =
344 { 576 {
345 gaim_gtk_request_input, 577 gaim_gtk_request_input,
346 gaim_gtk_request_choice, 578 gaim_gtk_request_choice,
347 gaim_gtk_request_action, 579 gaim_gtk_request_action,
580 gaim_gtk_request_fields,
348 gaim_gtk_close_request 581 gaim_gtk_close_request
349 }; 582 };
350 583
351 GaimRequestUiOps * 584 GaimRequestUiOps *
352 gaim_get_gtk_request_ui_ops(void) 585 gaim_get_gtk_request_ui_ops(void)

mercurial