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;