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