Mercurial > pidgin
comparison gtk/gtkblist.c @ 15323:99dcbb8c4557
[gaim-migrate @ 18114]
Patch #1575852 from Denis Washington to fix group count display in the buddy
list when expanding/collapsing the groups.
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Fri, 12 Jan 2007 17:43:25 +0000 |
parents | b17a907065cc |
children | e3ea20c6e73f |
comparison
equal
deleted
inserted
replaced
15322:daf402269760 | 15323:99dcbb8c4557 |
---|---|
131 static char *gaim_get_tooltip_text(GaimBlistNode *node, gboolean full); | 131 static char *gaim_get_tooltip_text(GaimBlistNode *node, gboolean full); |
132 static const char *item_factory_translate_func (const char *path, gpointer func_data); | 132 static const char *item_factory_translate_func (const char *path, gpointer func_data); |
133 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter); | 133 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter); |
134 static void redo_buddy_list(GaimBuddyList *list, gboolean remove, gboolean rerender); | 134 static void redo_buddy_list(GaimBuddyList *list, gboolean remove, gboolean rerender); |
135 static void gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node); | 135 static void gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node); |
136 static char *gaim_get_group_title(GaimBlistNode *gnode, gboolean expanded); | |
136 | 137 |
137 static void gaim_gtk_blist_tooltip_destroy(void); | 138 static void gaim_gtk_blist_tooltip_destroy(void); |
138 | 139 |
139 struct _gaim_gtk_blist_node { | 140 struct _gaim_gtk_blist_node { |
140 GtkTreeRowReference *row; | 141 GtkTreeRowReference *row; |
773 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); | 774 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); |
774 | 775 |
775 node = g_value_get_pointer(&val); | 776 node = g_value_get_pointer(&val); |
776 | 777 |
777 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | 778 if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
779 char *title; | |
780 | |
781 title = gaim_get_group_title(node, TRUE); | |
782 | |
783 gtk_tree_store_set(gtkblist->treemodel, iter, | |
784 NAME_COLUMN, title, | |
785 -1); | |
786 | |
787 g_free(title); | |
788 | |
778 gaim_blist_node_set_bool(node, "collapsed", FALSE); | 789 gaim_blist_node_set_bool(node, "collapsed", FALSE); |
779 } | 790 } |
780 } | 791 } |
781 | 792 |
782 static void gtk_blist_row_collapsed_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { | 793 static void gtk_blist_row_collapsed_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { |
787 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); | 798 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); |
788 | 799 |
789 node = g_value_get_pointer(&val); | 800 node = g_value_get_pointer(&val); |
790 | 801 |
791 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | 802 if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
803 char *title; | |
804 | |
805 title = gaim_get_group_title(node, FALSE); | |
806 | |
807 gtk_tree_store_set(gtkblist->treemodel, iter, | |
808 NAME_COLUMN, title, | |
809 -1); | |
810 | |
811 g_free(title); | |
812 | |
792 gaim_blist_node_set_bool(node, "collapsed", TRUE); | 813 gaim_blist_node_set_bool(node, "collapsed", TRUE); |
793 } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | 814 } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { |
794 gaim_gtk_blist_collapse_contact_cb(NULL, node); | 815 gaim_gtk_blist_collapse_contact_cb(NULL, node); |
795 } | 816 } |
796 } | 817 } |
4617 { | 4638 { |
4618 GaimGroup *group; | 4639 GaimGroup *group; |
4619 int count; | 4640 int count; |
4620 gboolean show = FALSE; | 4641 gboolean show = FALSE; |
4621 GaimBlistNode* gnode; | 4642 GaimBlistNode* gnode; |
4622 gboolean selected; | |
4623 | 4643 |
4624 g_return_if_fail(node != NULL); | 4644 g_return_if_fail(node != NULL); |
4625 | 4645 |
4626 if (GAIM_BLIST_NODE_IS_GROUP(node)) | 4646 if (GAIM_BLIST_NODE_IS_GROUP(node)) |
4627 gnode = node; | 4647 gnode = node; |
4630 else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) | 4650 else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) |
4631 gnode = node->parent; | 4651 gnode = node->parent; |
4632 else | 4652 else |
4633 return; | 4653 return; |
4634 | 4654 |
4635 selected = gtkblist ? (gtkblist->selected_node == gnode) : FALSE; | |
4636 group = (GaimGroup*)gnode; | 4655 group = (GaimGroup*)gnode; |
4637 | 4656 |
4638 if(gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")) | 4657 if(gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")) |
4639 count = gaim_blist_get_group_size(group, FALSE); | 4658 count = gaim_blist_get_group_size(group, FALSE); |
4640 else | 4659 else |
4645 else if (GAIM_BLIST_NODE_IS_BUDDY(node)){ /* Or chat? */ | 4664 else if (GAIM_BLIST_NODE_IS_BUDDY(node)){ /* Or chat? */ |
4646 if (buddy_is_displayable((GaimBuddy*)node)) | 4665 if (buddy_is_displayable((GaimBuddy*)node)) |
4647 show = TRUE;} | 4666 show = TRUE;} |
4648 | 4667 |
4649 if (show) { | 4668 if (show) { |
4650 char group_count[12] = ""; | |
4651 char *mark, *esc; | |
4652 GtkTreeIter iter; | 4669 GtkTreeIter iter; |
4653 GtkTreePath *path; | 4670 GtkTreePath *path; |
4654 gboolean expanded; | 4671 gboolean expanded; |
4655 GdkColor bgcolor; | 4672 GdkColor bgcolor; |
4656 GdkColor textcolor; | 4673 char *title; |
4674 | |
4657 | 4675 |
4658 if(!insert_node(list, gnode, &iter)) | 4676 if(!insert_node(list, gnode, &iter)) |
4659 return; | 4677 return; |
4660 | 4678 |
4661 bgcolor = gtkblist->treeview->style->bg[GTK_STATE_ACTIVE]; | 4679 bgcolor = gtkblist->treeview->style->bg[GTK_STATE_ACTIVE]; |
4662 textcolor = gtkblist->treeview->style->fg[GTK_STATE_ACTIVE]; | |
4663 | 4680 |
4664 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); | 4681 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); |
4665 expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(gtkblist->treeview), path); | 4682 expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(gtkblist->treeview), path); |
4666 gtk_tree_path_free(path); | 4683 gtk_tree_path_free(path); |
4667 | 4684 |
4668 if (!expanded) { | 4685 title = gaim_get_group_title(gnode, expanded); |
4669 g_snprintf(group_count, sizeof(group_count), " (%d/%d)", | |
4670 gaim_blist_get_group_online_count(group), | |
4671 gaim_blist_get_group_size(group, FALSE)); | |
4672 } | |
4673 | |
4674 esc = g_markup_escape_text(group->name, -1); | |
4675 if (selected) | |
4676 mark = g_strdup_printf("<span weight='bold'>%s</span>%s", esc, group_count); | |
4677 else | |
4678 mark = g_strdup_printf("<span color='#%02x%02x%02x' weight='bold'>%s</span>%s", | |
4679 textcolor.red>>8, textcolor.green>>8, textcolor.blue>>8, | |
4680 esc, group_count); | |
4681 | |
4682 g_free(esc); | |
4683 | 4686 |
4684 gtk_tree_store_set(gtkblist->treemodel, &iter, | 4687 gtk_tree_store_set(gtkblist->treemodel, &iter, |
4685 STATUS_ICON_VISIBLE_COLUMN, FALSE, | 4688 STATUS_ICON_VISIBLE_COLUMN, FALSE, |
4686 STATUS_ICON_COLUMN, NULL, | 4689 STATUS_ICON_COLUMN, NULL, |
4687 NAME_COLUMN, mark, | 4690 NAME_COLUMN, title, |
4688 NODE_COLUMN, gnode, | 4691 NODE_COLUMN, gnode, |
4689 BGCOLOR_COLUMN, &bgcolor, | 4692 BGCOLOR_COLUMN, &bgcolor, |
4690 GROUP_EXPANDER_COLUMN, TRUE, | 4693 GROUP_EXPANDER_COLUMN, TRUE, |
4691 CONTACT_EXPANDER_VISIBLE_COLUMN, FALSE, | 4694 CONTACT_EXPANDER_VISIBLE_COLUMN, FALSE, |
4692 BUDDY_ICON_VISIBLE_COLUMN, FALSE, | 4695 BUDDY_ICON_VISIBLE_COLUMN, FALSE, |
4693 IDLE_VISIBLE_COLUMN, FALSE, | 4696 IDLE_VISIBLE_COLUMN, FALSE, |
4694 -1); | 4697 -1); |
4695 g_free(mark); | 4698 g_free(title); |
4696 } else { | 4699 } else { |
4697 gaim_gtk_blist_hide_node(list, gnode, TRUE); | 4700 gaim_gtk_blist_hide_node(list, gnode, TRUE); |
4698 } | 4701 } |
4702 } | |
4703 | |
4704 static char *gaim_get_group_title(GaimBlistNode *gnode, gboolean expanded) | |
4705 { | |
4706 GaimGroup *group; | |
4707 GdkColor textcolor; | |
4708 gboolean selected; | |
4709 char group_count[12] = ""; | |
4710 char *mark, *esc; | |
4711 | |
4712 group = (GaimGroup*)gnode; | |
4713 textcolor = gtkblist->treeview->style->fg[GTK_STATE_ACTIVE]; | |
4714 selected = gtkblist ? (gtkblist->selected_node == gnode) : FALSE; | |
4715 | |
4716 if (!expanded) { | |
4717 g_snprintf(group_count, sizeof(group_count), " (%d/%d)", | |
4718 gaim_blist_get_group_online_count(group), | |
4719 gaim_blist_get_group_size(group, FALSE)); | |
4720 } | |
4721 | |
4722 esc = g_markup_escape_text(group->name, -1); | |
4723 if (selected) | |
4724 mark = g_strdup_printf("<span weight='bold'>%s</span>%s", esc, group_count); | |
4725 else | |
4726 mark = g_strdup_printf("<span color='#%02x%02x%02x' weight='bold'>%s</span>%s", | |
4727 textcolor.red>>8, textcolor.green>>8, textcolor.blue>>8, | |
4728 esc, group_count); | |
4729 | |
4730 g_free(esc); | |
4731 return mark; | |
4699 } | 4732 } |
4700 | 4733 |
4701 static void buddy_node(GaimBuddy *buddy, GtkTreeIter *iter, GaimBlistNode *node) | 4734 static void buddy_node(GaimBuddy *buddy, GtkTreeIter *iter, GaimBlistNode *node) |
4702 { | 4735 { |
4703 GaimPresence *presence; | 4736 GaimPresence *presence; |