console/gntblist.c

changeset 15039
20a0d0117a47
parent 14997
197138c20527
child 15046
e17788e5403a
--- a/console/gntblist.c	Wed Nov 15 20:39:32 2006 +0000
+++ b/console/gntblist.c	Thu Nov 16 00:27:30 2006 +0000
@@ -61,7 +61,7 @@
 
 	GntWidget *tooltip;
 	GaimBlistNode *tnode;		/* Who is the tooltip being displayed for? */
-	GaimBuddy *tagged;
+	GList *tagged;          /* A list of tagged blistnodes */
 
 	GntWidget *context;
 	GaimBlistNode *cnode;
@@ -108,6 +108,7 @@
 static const char * get_display_name(GaimBlistNode *node);
 static void savedstatus_changed(GaimSavedStatus *now, GaimSavedStatus *old);
 static void blist_show(GaimBuddyList *list);
+static void update_buddy_display(GaimBuddy *buddy, GGBlist *ggblist);
 
 /* Sort functions */
 static int blist_node_compare_text(GaimBlistNode *n1, GaimBlistNode *n2);
@@ -174,6 +175,8 @@
 
 	gnt_tree_remove(GNT_TREE(ggblist->tree), node);
 	node->ui_data = NULL;
+	if (ggblist->tagged)
+		ggblist->tagged = g_list_remove(ggblist->tagged, node);
 
 	if (GAIM_BLIST_NODE_IS_BUDDY(node)) {
 		GaimContact *contact = (GaimContact*)node->parent;
@@ -185,6 +188,8 @@
 		if ((!gaim_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group)) ||
 				group->currentsize < 1)
 			node_remove(list, node->parent);
+		for (node = node->child; node; node = node->next)
+			node->ui_data = NULL;
 	}
 
 	draw_tooltip(ggblist);
@@ -998,23 +1003,52 @@
 }
 
 static void
-gg_blist_tag_buddy(GaimBlistNode *node)
+gg_blist_toggle_tag_buddy(GaimBlistNode *node)
 {
-	ggblist->tagged = (GaimBuddy *)node;
+	GList *iter;
+	if (ggblist->tagged && (iter = g_list_find(ggblist->tagged, node)) != NULL) {
+		ggblist->tagged = g_list_delete_link(ggblist->tagged, iter);
+	} else {
+		ggblist->tagged = g_list_prepend(ggblist->tagged, node);
+	}
+	if (GAIM_BLIST_NODE_IS_CONTACT(node))
+		node = (GaimBlistNode*)gaim_contact_get_priority_buddy((GaimContact*)node);
+	update_buddy_display((GaimBuddy*)node, ggblist);
 	gaim_debug_info("blist", "Tagged buddy\n");
 }
 
 static void
-gg_blist_place_tagged(GaimBlistNode *node)
+gg_blist_place_tagged(GaimBlistNode *target)
 {
-	if (GAIM_BLIST_NODE_IS_GROUP(node)) {
-		gaim_blist_add_buddy(ggblist->tagged, NULL, (GaimGroup *)node, NULL);
-	} else {
-		GaimContact *contact = (GaimContact *)node;
-		gaim_blist_add_buddy(ggblist->tagged, contact,
-			gaim_buddy_get_group(gaim_contact_get_priority_buddy(contact)), NULL);
+	GaimGroup *tg = NULL;
+	GaimContact *tc = NULL;
+
+	if (GAIM_BLIST_NODE_IS_GROUP(target))
+		tg = (GaimGroup*)target;
+	else
+		tc = (GaimContact*)target;
+
+	if (ggblist->tagged) {
+		GList *list = ggblist->tagged;
+		ggblist->tagged = NULL;
+
+		while (list) {
+			GaimBlistNode *node = list->data;
+			list = g_list_delete_link(list, list);
+			if (tg) {
+				if (GAIM_BLIST_NODE_IS_CONTACT(node))
+					gaim_blist_add_contact((GaimContact*)node, tg, NULL);
+				else
+					gaim_blist_add_buddy((GaimBuddy*)node, NULL, tg, NULL);
+			} else {
+				if (GAIM_BLIST_NODE_IS_BUDDY(node))
+					gaim_blist_add_buddy((GaimBuddy*)node, tc,
+						gaim_buddy_get_group(gaim_contact_get_priority_buddy(tc)), NULL);
+				else if (GAIM_BLIST_NODE_IS_CONTACT(node))
+					gaim_blist_merge_contact((GaimContact*)node, target);
+			}
+		}
 	}
-	ggblist->tagged = NULL;
 	gaim_debug_info("blist", "Placed buddy\n");
 }
 
@@ -1074,13 +1108,16 @@
 				GAIM_CALLBACK(gg_blist_rename_node_cb), node);
 		add_custom_action(GNT_MENU(context), _("Remove"),
 				GAIM_CALLBACK(gg_blist_remove_node_cb), node);
+
 		if (ggblist->tagged && (GAIM_BLIST_NODE_IS_CONTACT(node)
 				|| GAIM_BLIST_NODE_IS_GROUP(node))) {
 			add_custom_action(GNT_MENU(context), _("Place tagged"),
 					GAIM_CALLBACK(gg_blist_place_tagged), node);
-		} else if (GAIM_BLIST_NODE_IS_BUDDY(node)) {
-			add_custom_action(GNT_MENU(context), _("Tag"),
-					GAIM_CALLBACK(gg_blist_tag_buddy), node);
+		}
+		
+		if (GAIM_BLIST_NODE_IS_BUDDY(node) || GAIM_BLIST_NODE_IS_CONTACT(node)) {
+			add_custom_action(GNT_MENU(context), _("Toggle Tag"),
+					GAIM_CALLBACK(gg_blist_toggle_tag_buddy), node);
 		}
 	}
 
@@ -1285,7 +1322,7 @@
 	 * top of that, if the selected buddy belongs to the disconnected
 	 * account, then retreiving the tooltip for that causes crash. So
 	 * let's make sure we wait for all the buddies to be removed first.*/
-	int id = g_timeout_add(0, draw_tooltip_real, ggblist);
+	int id = g_timeout_add(0, (GSourceFunc)draw_tooltip_real, ggblist);
 	g_object_set_data_full(G_OBJECT(ggblist->window), "draw_tooltip_calback",
 				GINT_TO_POINTER(id), (GDestroyNotify)g_source_remove);
 }
@@ -1306,48 +1343,50 @@
 static gboolean
 key_pressed(GntWidget *widget, const char *text, GGBlist *ggblist)
 {
-	gboolean stop = FALSE, ret = FALSE;
-	if (text[0] == 27 && text[1] == 0)
-	{
+	if (text[0] == 27 && text[1] == 0) {
 		/* Escape was pressed */
 		remove_peripherals(ggblist);
-		stop = TRUE;
-		ret = TRUE;
-	}
-
-	if (strcmp(text, GNT_KEY_CTRL_O) == 0)
-	{
+	} else if (strcmp(text, GNT_KEY_CTRL_O) == 0) {
 		gaim_prefs_set_bool(PREF_ROOT "/showoffline",
 				!gaim_prefs_get_bool(PREF_ROOT "/showoffline"));
-		ret = TRUE;
-		stop = TRUE;
-	}
+	} else if (strcmp(text, "t") == 0) {
+		gg_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree)));
+	} else if (strcmp(text, "a") == 0) {
+		gg_blist_place_tagged(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree)));
+	} else
+		return FALSE;
 
-	if (stop)
-		g_signal_stop_emission_by_name(G_OBJECT(widget), "key_pressed");
-
-	return ret;
+	return TRUE;
 }
 
 static void
 update_buddy_display(GaimBuddy *buddy, GGBlist *ggblist)
 {
 	GaimContact *contact;
+	GntTextFormatFlags bflag = 0, cflag = 0;
 	
 	contact = gaim_buddy_get_contact(buddy);
 
+	gaim_debug_fatal("sadrul", "updating display for %s\n", gaim_buddy_get_name(buddy));
+	g_printerr("sadrul:  updating display for %s\n", gaim_buddy_get_name(buddy));
+
 	gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, 0, get_display_name((GaimBlistNode*)buddy));
 	gnt_tree_change_text(GNT_TREE(ggblist->tree), contact, 0, get_display_name((GaimBlistNode*)contact));
 
+	if (ggblist->tagged && g_list_find(ggblist->tagged, buddy))
+		bflag |= GNT_TEXT_FLAG_BOLD;
+	if (ggblist->tagged && g_list_find(ggblist->tagged, contact))
+		cflag |= GNT_TEXT_FLAG_BOLD;
+
 	if (ggblist->tnode == (GaimBlistNode*)buddy)
 		draw_tooltip(ggblist);
 
 	if (gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) {
-		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM);
-		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, GNT_TEXT_FLAG_DIM);
+		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag | GNT_TEXT_FLAG_DIM);
+		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag | GNT_TEXT_FLAG_DIM);
 	} else {
-		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0);
-		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, 0);
+		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag);
+		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag);
 	}
 }
 

mercurial