Mercurial > pidgin
changeset 16925:9a568611fa4a
When getting information, show "Information: Retrieving..." before the
data reaches from the server. This addresses #387.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sun, 06 May 2007 21:55:07 +0000 |
parents | 49f66fab6b31 |
children | 7e4a22162bb6 3d0aec991e5d |
files | finch/gntblist.c finch/gntnotify.c |
diffstat | 2 files changed, 77 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/finch/gntblist.c Sun May 06 21:40:29 2007 +0000 +++ b/finch/gntblist.c Sun May 06 21:55:07 2007 +0000 @@ -819,6 +819,13 @@ static void finch_blist_get_buddy_info_cb(PurpleBuddy *buddy, PurpleBlistNode *selected) { + /* Add a userinfo with a "Retrieving information", which will later be updated + * when the server finally returns the information. */ + PurpleNotifyUserInfo *info = purple_notify_user_info_new(); + purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving...")); + purple_notify_userinfo(buddy->account->gc, purple_buddy_get_name(buddy), info, NULL, NULL); + purple_notify_user_info_destroy(info); + serv_get_info(buddy->account->gc, purple_buddy_get_name(buddy)); }
--- a/finch/gntnotify.c Sun May 06 21:40:29 2007 +0000 +++ b/finch/gntnotify.c Sun May 06 21:55:07 2007 +0000 @@ -27,6 +27,7 @@ #include <gntbutton.h> #include <gntlabel.h> #include <gnttree.h> +#include <gntutils.h> #include <util.h> @@ -72,11 +73,26 @@ if (primary) gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(primary, pf)); - if (secondary) - gnt_box_add_widget(GNT_BOX(window), - gnt_label_new_with_format(secondary, sf)); button = gnt_button_new(_("OK")); + + if (secondary) { + GntWidget *msg; + if (type == PURPLE_NOTIFY_FORMATTED) { + int width = -1, height = -1; + msg = gnt_text_view_new(); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(msg), secondary, sf); + gnt_text_view_scroll(GNT_TEXT_VIEW(msg), 0); + gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(msg), button); + gnt_util_get_text_bound(secondary, &width, &height); + gnt_widget_set_size(msg, width + 3, height + 1); + } else { + msg = gnt_label_new_with_format(secondary, sf); + } + gnt_box_add_widget(GNT_BOX(window), msg); + g_object_set_data(G_OBJECT(window), "info-widget", msg); + } + gnt_box_add_widget(GNT_BOX(window), button); g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); @@ -219,19 +235,63 @@ url ? &url : NULL); } +/** User information. **/ +static GHashTable *userinfo; + +static char * +userinfo_hash(PurpleAccount *account, const char *who) +{ + char key[256]; + snprintf(key, sizeof(key), "%s - %s", purple_account_get_username(account), purple_normalize(account, who)); + return g_utf8_strup(key, -1); +} + +static void +remove_userinfo(GntWidget *widget, gpointer key) +{ + g_hash_table_remove(userinfo, key); +} + static void * finch_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) { - /* Xeroxed from gtknotify.c */ char *primary; char *info; void *ui_handle; - - primary = g_strdup_printf(_("Info for %s"), who); + char *key = userinfo_hash(purple_connection_get_account(gc), who); + info = purple_notify_user_info_get_text_with_newline(user_info, "<BR>"); - ui_handle = finch_notify_formatted(_("Buddy Information"), primary, NULL, info); + + ui_handle = g_hash_table_lookup(userinfo, key); + if (ui_handle != NULL) { + GntTextView *msg = GNT_TEXT_VIEW(g_object_get_data(G_OBJECT(ui_handle), "info-widget")); + char *strip = purple_markup_strip_html(info); + int tvw, tvh, width, height, ntvw, ntvh; + + gnt_widget_get_size(GNT_WIDGET(ui_handle), &width, &height); + gnt_widget_get_size(GNT_WIDGET(msg), &tvw, &tvh); + + /* Ideally, I would replace the information in "info". But replacing tagged text is a + * bit nasty right now. So clear the view and add the new stuff instead. */ + gnt_text_view_clear(msg); + gnt_text_view_append_text_with_flags(msg, strip, GNT_TEXT_FLAG_NORMAL); + gnt_text_view_scroll(msg, 0); + gnt_util_get_text_bound(strip, &ntvw, &ntvh); + ntvw += 3; + ntvh++; + + gnt_screen_resize_widget(GNT_WIDGET(ui_handle), width + (ntvw - tvw), height + (ntvh - tvh)); + g_free(strip); + g_free(key); + } else { + primary = g_strdup_printf(_("Info for %s"), who); + ui_handle = finch_notify_formatted(_("Buddy Information"), primary, NULL, info); + g_hash_table_insert(userinfo, key, ui_handle); + g_free(primary); + g_signal_connect(G_OBJECT(ui_handle), "destroy", G_CALLBACK(remove_userinfo), key); + } + g_free(info); - g_free(primary); return ui_handle; } @@ -365,10 +425,12 @@ void finch_notify_init() { + userinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); } void finch_notify_uninit() { + g_hash_table_destroy(userinfo); }