Mercurial > pidgin
changeset 4810:0abbbeec0ee8
[gaim-migrate @ 5130]
This will make grey text revert back to the "normal" color when you click on it, which lets gtk handle making it legible. Or something cool like that.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Mon, 17 Mar 2003 07:21:13 +0000 |
parents | 71ef8462630e |
children | 22a7602ebe25 |
files | src/buddy.c src/gtklist.h |
diffstat | 2 files changed, 55 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/buddy.c Mon Mar 17 05:21:09 2003 +0000 +++ b/src/buddy.c Mon Mar 17 07:21:13 2003 +0000 @@ -59,6 +59,7 @@ /* Docklet nonsense */ static gboolean gaim_gtk_blist_obscured = FALSE; +static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data); static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node); static char *gaim_get_tooltip_text(struct buddy *b); static GdkPixbuf *gaim_gtk_blist_get_status_icon(struct buddy *b, GaimStatusIconSize size); @@ -790,7 +791,7 @@ return NULL; } -static gchar *gaim_gtk_blist_get_name_markup(struct buddy *b) +static gchar *gaim_gtk_blist_get_name_markup(struct buddy *b, gboolean selected) { char *name = gaim_get_buddy_alias(b); char *esc = g_markup_escape_text(name, strlen(name)), *text = NULL; @@ -803,7 +804,7 @@ time_t t; if (!(blist_options & OPT_BLIST_SHOW_ICONS)) { - if (b->idle > 0 && blist_options & OPT_BLIST_GREY_IDLERS) { + if (b->idle > 0 && blist_options & OPT_BLIST_GREY_IDLERS && !selected) { text = g_strdup_printf("<span color='dim grey'>%s</span>", esc); g_free(esc); @@ -840,7 +841,7 @@ if (b->evil > 0) warning = g_strdup_printf(_("Warned (%d%%) "), b->evil); - if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS) { + if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS && !selected) { text = g_strdup_printf("<span color='dim grey'>%s</span>\n<span color='dim grey' size='smaller'>%s%s%s</span>", esc, statustext != NULL ? statustext : "", @@ -849,10 +850,11 @@ } else if (statustext == NULL && idletime == NULL && warning == NULL) { text = g_strdup_printf("%s", esc); } else { - text = g_strdup_printf("%s\n<span color='dim grey' size='smaller'>%s%s%s</span>", esc, - statustext != NULL ? statustext : "", - idletime != NULL ? idletime : "", - warning != NULL ? warning : ""); + text = g_strdup_printf("%s\n<span %s size='smaller'>%s%s%s</span>", esc, + selected ? "" : "color='dim grey'", + statustext != NULL ? statustext : "", + idletime != NULL ? idletime : "", + warning != NULL ? warning : ""); } if (idletime) g_free(idletime); @@ -902,6 +904,7 @@ GtkWidget *sw; GtkWidget *button; GtkSizeGroup *sg; + GtkTreeSelection *selection; GtkTargetEntry gte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, {"application/x-im-contact", 0, DRAG_BUDDY}}; @@ -946,6 +949,12 @@ gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); + /* Set up selection stuff */ + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); + g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL); + + /* Set up dnd */ gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), GDK_BUTTON1_MASK, gte, 2, GDK_ACTION_COPY); @@ -1115,6 +1124,34 @@ } } +static gboolean do_selection_changed(GaimBlistNode *new_selection) +{ + GaimBlistNode *old_selection = gtkblist->selected_node; + + if(new_selection != gtkblist->selected_node) { + gtkblist->selected_node = new_selection; + if(new_selection) + gaim_gtk_blist_update(NULL, new_selection); + if(old_selection) + gaim_gtk_blist_update(NULL, old_selection); + } + + return FALSE; +} + +static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data) +{ + GaimBlistNode *new_selection = NULL; + GtkTreeIter iter; + + if(gtk_tree_selection_get_selected(selection, NULL, &iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, + NODE_COLUMN, &new_selection, -1); + } + /* we set this up as a timeout, otherwise the blist flickers */ + g_timeout_add(0, (GSourceFunc)do_selection_changed, new_selection); +} + static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node) { @@ -1163,13 +1200,13 @@ expand = TRUE; } - + oldersibling = node->prev; while (oldersibling && !get_iter_from_node(oldersibling, &oldersiblingiter)) oldersibling = oldersibling->prev; gtk_tree_store_insert_after(gtkblist->treemodel, &iter, &groupiter, oldersibling ? &oldersiblingiter : NULL); - + if (blist_options & OPT_BLIST_POPUP) gtk_window_present(GTK_WINDOW(gtkblist->window)); @@ -1188,10 +1225,12 @@ char *mark; char *warning = NULL, *idle = NULL; - status = gaim_gtk_blist_get_status_icon((struct buddy*)node, + gboolean selected = (gtkblist->selected_node == node); + + status = gaim_gtk_blist_get_status_icon((struct buddy*)node, blist_options & OPT_BLIST_SHOW_ICONS ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL); avatar = gaim_gtk_blist_get_buddy_icon((struct buddy*)node); - mark = gaim_gtk_blist_get_name_markup((struct buddy*)node); + mark = gaim_gtk_blist_get_name_markup((struct buddy*)node, selected); if (((struct buddy*)node)->idle > 0) { time_t t; @@ -1207,18 +1246,18 @@ if (((struct buddy*)node)->evil > 0) warning = g_strdup_printf("%d%%", ((struct buddy*)node)->evil); - + if((blist_options & OPT_BLIST_GREY_IDLERS) && ((struct buddy *)node)->idle) { - if(warning) { + if(warning && !selected) { char *w2 = g_strdup_printf("<span color='dim grey'>%s</span>", warning); g_free(warning); warning = w2; } - if(idle) { + if(idle && !selected) { char *i2 = g_strdup_printf("<span color='dim grey'>%s</span>", idle); g_free(idle);
--- a/src/gtklist.h Mon Mar 17 05:21:09 2003 +0000 +++ b/src/gtklist.h Mon Mar 17 07:21:13 2003 +0000 @@ -63,6 +63,8 @@ cell we're currently hovering over. This is used for tooltips. */ GtkWidget *tipwindow; /**< The window used by the tooltip */ + + GaimBlistNode *selected_node; /**< The currently selected node */ }; /**