Mercurial > pidgin.yaz
comparison pidgin/gtkdisco.c @ 26689:1009214ba476
Handle expanding disco lists on the UI side
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Wed, 15 Apr 2009 02:51:48 +0000 |
parents | d6b2944f04b3 |
children | ba9876c35a5b |
comparison
equal
deleted
inserted
replaced
26688:4c974d40cc63 | 26689:1009214ba476 |
---|---|
171 gtk_widget_set_sensitive(dialog->add_button, FALSE); | 171 gtk_widget_set_sensitive(dialog->add_button, FALSE); |
172 gtk_widget_set_sensitive(dialog->register_button, FALSE); | 172 gtk_widget_set_sensitive(dialog->register_button, FALSE); |
173 } | 173 } |
174 } | 174 } |
175 | 175 |
176 static void | |
177 row_expanded_cb(GtkTreeView *tree, GtkTreeIter *arg1, GtkTreePath *rg2, | |
178 gpointer user_data) | |
179 { | |
180 PidginDiscoList *pdl; | |
181 PurpleDiscoService *service; | |
182 GValue val; | |
183 | |
184 pdl = user_data; | |
185 | |
186 val.g_type = 0; | |
187 gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), arg1, SERVICE_COLUMN, | |
188 &val); | |
189 service = g_value_get_pointer(&val); | |
190 purple_disco_service_expand(service); | |
191 } | |
192 | |
176 static gint | 193 static gint |
177 delete_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) | 194 delete_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) |
178 { | 195 { |
179 PidginDiscoDialog *dialog = d; | 196 PidginDiscoDialog *dialog = d; |
180 | 197 |
293 GTK_TREE_VIEW_COLUMN_GROW_ONLY); | 310 GTK_TREE_VIEW_COLUMN_GROW_ONLY); |
294 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); | 311 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); |
295 gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN); | 312 gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN); |
296 gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE); | 313 gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE); |
297 gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column); | 314 gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column); |
315 | |
316 g_signal_connect(G_OBJECT(pdl->tree), "row-expanded", G_CALLBACK(row_expanded_cb), pdl); | |
298 } | 317 } |
299 | 318 |
300 static PidginDiscoDialog* | 319 static PidginDiscoDialog* |
301 pidgin_disco_dialog_new_with_account(PurpleAccount *account) | 320 pidgin_disco_dialog_new_with_account(PurpleAccount *account) |
302 { | 321 { |
439 dialog = pdl->dialog; | 458 dialog = pdl->dialog; |
440 if (!dialog) | 459 if (!dialog) |
441 return; | 460 return; |
442 | 461 |
443 if (in_progress) { | 462 if (in_progress) { |
444 gtk_tree_store_clear(pdl->model); | |
445 if (dialog->account_widget) | 463 if (dialog->account_widget) |
446 gtk_widget_set_sensitive(dialog->account_widget, FALSE); | 464 gtk_widget_set_sensitive(dialog->account_widget, FALSE); |
447 gtk_widget_set_sensitive(dialog->stop_button, TRUE); | 465 gtk_widget_set_sensitive(dialog->stop_button, TRUE); |
448 gtk_widget_set_sensitive(dialog->list_button, FALSE); | 466 gtk_widget_set_sensitive(dialog->list_button, FALSE); |
449 } else { | 467 } else { |
459 { | 477 { |
460 PidginDiscoList *pdl; | 478 PidginDiscoList *pdl; |
461 PidginDiscoDialog *dialog; | 479 PidginDiscoDialog *dialog; |
462 PurpleDiscoServiceType type; | 480 PurpleDiscoServiceType type; |
463 const char *gateway_type; | 481 const char *gateway_type; |
464 GtkTreeIter iter, parent_iter; | 482 GtkTreeIter iter, parent_iter, child; |
465 GtkTreeRowReference *rr; | |
466 GtkTreePath *path; | |
467 char *filename = NULL; | 483 char *filename = NULL; |
468 GdkPixbuf *pixbuf = NULL; | 484 GdkPixbuf *pixbuf = NULL; |
485 gboolean append = TRUE; | |
469 | 486 |
470 pdl = purple_disco_list_get_ui_data(list); | 487 pdl = purple_disco_list_get_ui_data(list); |
471 dialog = pdl->dialog; | 488 dialog = pdl->dialog; |
472 | 489 |
473 purple_debug_info("disco", "Add_service \"%s\"\n", purple_disco_service_get_name(service)); | 490 purple_debug_info("disco", "Add_service \"%s\"\n", purple_disco_service_get_name(service)); |
474 | 491 |
475 gtk_progress_bar_pulse(GTK_PROGRESS_BAR(dialog->progress)); | 492 gtk_progress_bar_pulse(GTK_PROGRESS_BAR(dialog->progress)); |
476 | 493 |
477 if (parent) { | 494 if (parent) { |
495 GtkTreeRowReference *rr; | |
496 GtkTreePath *path; | |
497 | |
478 rr = g_hash_table_lookup(pdl->cats, parent); | 498 rr = g_hash_table_lookup(pdl->cats, parent); |
479 path = gtk_tree_row_reference_get_path(rr); | 499 path = gtk_tree_row_reference_get_path(rr); |
480 if (path) { | 500 if (path) { |
481 gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &parent_iter, path); | 501 gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &parent_iter, path); |
482 gtk_tree_path_free(path); | 502 gtk_tree_path_free(path); |
503 | |
504 if (gtk_tree_model_iter_children(GTK_TREE_MODEL(pdl->model), &child, | |
505 &parent_iter)) { | |
506 PurpleDiscoList *tmp; | |
507 gtk_tree_model_get(GTK_TREE_MODEL(pdl->model), &child, | |
508 SERVICE_COLUMN, &tmp, -1); | |
509 if (!tmp) | |
510 append = FALSE; | |
511 } | |
483 } | 512 } |
484 } | 513 } |
485 | 514 |
486 gtk_tree_store_append(pdl->model, &iter, (parent ? &parent_iter : NULL)); | 515 if (append) |
516 gtk_tree_store_append(pdl->model, &iter, (parent ? &parent_iter : NULL)); | |
517 else | |
518 iter = child; | |
519 | |
520 if (purple_disco_service_get_flags(service) & PURPLE_DISCO_BROWSE) { | |
521 GtkTreeRowReference *rr; | |
522 GtkTreePath *path; | |
523 | |
524 gtk_tree_store_append(pdl->model, &child, &iter); | |
525 | |
526 path = gtk_tree_model_get_path(GTK_TREE_MODEL(pdl->model), &iter); | |
527 rr = gtk_tree_row_reference_new(GTK_TREE_MODEL(pdl->model), path); | |
528 g_hash_table_insert(pdl->cats, service, rr); | |
529 gtk_tree_path_free(path); | |
530 } | |
487 | 531 |
488 type = purple_disco_service_get_type(service); | 532 type = purple_disco_service_get_type(service); |
489 gateway_type = purple_disco_service_get_gateway_type(service); | 533 gateway_type = purple_disco_service_get_gateway_type(service); |
490 | 534 |
491 if (type == PURPLE_DISCO_SERVICE_TYPE_GATEWAY && gateway_type) { | 535 if (type == PURPLE_DISCO_SERVICE_TYPE_GATEWAY && gateway_type) { |
508 PIXBUF_COLUMN, pixbuf, | 552 PIXBUF_COLUMN, pixbuf, |
509 NAME_COLUMN, purple_disco_service_get_name(service), | 553 NAME_COLUMN, purple_disco_service_get_name(service), |
510 DESCRIPTION_COLUMN, purple_disco_service_get_description(service), | 554 DESCRIPTION_COLUMN, purple_disco_service_get_description(service), |
511 SERVICE_COLUMN, service, | 555 SERVICE_COLUMN, service, |
512 -1); | 556 -1); |
513 | |
514 path = gtk_tree_model_get_path(GTK_TREE_MODEL(pdl->model), &iter); | |
515 | |
516 rr = gtk_tree_row_reference_new(GTK_TREE_MODEL(pdl->model), path); | |
517 g_hash_table_insert(pdl->cats, service, rr); | |
518 | |
519 gtk_tree_path_free(path); | |
520 | 557 |
521 if (pixbuf) | 558 if (pixbuf) |
522 g_object_unref(pixbuf); | 559 g_object_unref(pixbuf); |
523 } | 560 } |
524 | 561 |