src/gtkblist.c

changeset 11016
9990e360ee9c
parent 10992
ccf59743dae4
child 11018
a3843543f132
--- a/src/gtkblist.c	Fri Jun 17 14:53:38 2005 +0000
+++ b/src/gtkblist.c	Tue Jun 21 04:40:34 2005 +0000
@@ -534,14 +534,92 @@
 	serv_join_chat(chat->account->gc, chat->components);
 }
 
+static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1,
+					 char *arg2, gpointer nada)
+{
+	GtkTreeIter iter;
+	GtkTreePath *path;
+	GValue val = {0,};
+	GaimBlistNode *node;
+
+	path = gtk_tree_path_new_from_string (arg1);
+	gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
+	gtk_tree_path_free (path);
+	gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
+	node = g_value_get_pointer(&val);
+	gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), TRUE);
+	g_object_set(G_OBJECT(gtkblist->text_rend), "editable", FALSE, NULL);
+	switch (node->type){
+	case GAIM_BLIST_CONTACT_NODE:
+		gaim_blist_alias_buddy(gaim_contact_get_priority_buddy((GaimContact*)node), arg2);
+		break;
+	case GAIM_BLIST_BUDDY_NODE:
+		gaim_blist_alias_buddy((GaimBuddy*)node, arg2);
+		break;
+	case GAIM_BLIST_GROUP_NODE:
+		gaim_blist_rename_group((GaimGroup*)node, arg2);
+		break;
+	case GAIM_BLIST_CHAT_NODE:
+		gaim_blist_alias_chat((GaimChat*)node, arg2);
+		break;
+	default:
+		break;
+	}
+}
+
+static void 
+gtk_blist_edit_starting(GtkCellRenderer *renderer,
+                        GtkCellEditable *editable,
+                        gchar *pathstr,
+                        gpointer user_data)
+{
+	GtkTreePath *path;
+	GtkTreeIter iter;
+	GaimBlistNode *node;
+	GValue val = {0,};
+	
+	path = gtk_tree_path_new_from_string (pathstr);
+	gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
+	gtk_tree_path_free (path);
+	gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
+	node = g_value_get_pointer(&val);
+	
+	switch (node->type) {
+	case GAIM_BLIST_BUDDY_NODE:
+		gtk_entry_set_text(GTK_ENTRY(editable), ((GaimBuddy*)node)->alias);
+		break;
+	case GAIM_BLIST_CONTACT_NODE:
+		gtk_entry_set_text(GTK_ENTRY(editable), (gaim_contact_get_priority_buddy((GaimContact*)node))->alias);
+		break;
+	case GAIM_BLIST_GROUP_NODE:
+		gtk_entry_set_text(GTK_ENTRY(editable), ((GaimGroup*)node)->name);
+		break;
+	case GAIM_BLIST_CHAT_NODE:
+		gtk_entry_set_text(GTK_ENTRY(editable), ((GaimChat*)node)->alias);
+		break;
+	default:
+		break;
+	}
+}
+
 static void gtk_blist_menu_alias_cb(GtkWidget *w, GaimBlistNode *node)
 {
-	if(GAIM_BLIST_NODE_IS_BUDDY(node))
-		gaim_gtkdialogs_alias_buddy((GaimBuddy*)node);
-	else if(GAIM_BLIST_NODE_IS_CONTACT(node))
-		gaim_gtkdialogs_alias_contact((GaimContact*)node);
-	else if(GAIM_BLIST_NODE_IS_CHAT(node))
-		gaim_gtkdialogs_alias_chat((GaimChat*)node);
+	GtkTreeIter iter;
+	GtkTreePath *path;
+	
+       	if (!(get_iter_from_node(node, &iter))) {
+		/* This is either a bug, or the buddy is in a collapsed contact */
+		node = node->parent;
+		if (!get_iter_from_node(node, &iter))
+			/* Now it's definitely a bug */
+			return;
+	}
+	path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter);
+	g_object_set(G_OBJECT(gtkblist->text_rend), "editable", TRUE, NULL);
+	gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), FALSE);
+	gtk_widget_grab_focus(gtkblist->treeview);
+	gtk_tree_view_set_cursor(GTK_TREE_VIEW(gtkblist->treeview), path, gtkblist->text_column, TRUE);
+	gtk_tree_path_free(path);
 }
 
 static void gtk_blist_menu_bp_cb(GtkWidget *w, GaimBuddy *b)
@@ -1254,7 +1332,7 @@
 	gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE,
 				 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
 	gaim_new_item_from_stock(menu, _("_Rename"), NULL,
-				 G_CALLBACK(show_rename_group), node, 0, 0, NULL);
+				 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL);
 
 	gaim_gtk_append_blist_node_extended_menu(menu, node);
 
@@ -2616,24 +2694,6 @@
 /*********************************************************
  * Private Utility functions                             *
  *********************************************************/
-static void
-rename_group_cb(GaimGroup *g, const char *new_name)
-{
-	gaim_blist_rename_group(g, new_name);
-}
-
-/*
- * Should disallow empty group names.
- */
-static void
-show_rename_group(GtkWidget *unused, GaimGroup *g)
-{
-	gaim_request_input(NULL, _("Rename Group"), _("New group name"),
-					   _("Please enter a new name for the selected group."),
-					   g->name, FALSE, FALSE, NULL,
-					   _("OK"), G_CALLBACK(rename_group_cb),
-					   _("Cancel"), NULL, g);
-}
 
 static char *gaim_get_tooltip_text(GaimBlistNode *node)
 {
@@ -3471,7 +3531,7 @@
 
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE);
 
-	column = gtk_tree_view_column_new ();
+	gtkblist->text_column = column = gtk_tree_view_column_new ();
 
 	rend = gtk_cell_renderer_pixbuf_new();
 	gtk_tree_view_column_pack_start(column, rend, FALSE);
@@ -3481,11 +3541,13 @@
 										NULL);
 	g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL);
 
-	rend = gtk_cell_renderer_text_new();
+	gtkblist->text_rend = rend = gtk_cell_renderer_text_new();
 	gtk_tree_view_column_pack_start (column, rend, TRUE);
 	gtk_tree_view_column_set_attributes(column, rend,
 										"markup", NAME_COLUMN,
 										NULL);
+	g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), NULL);
+	g_signal_connect(G_OBJECT(rend), "editing-started", G_CALLBACK(gtk_blist_edit_starting), NULL);
 	g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL);
 #if GTK_CHECK_VERSION(2,6,0)
 	gtk_tree_view_column_set_expand (column, TRUE);
@@ -3647,11 +3709,7 @@
 	struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data;
 	GtkTreePath *path;
 
-	/* XXX: why do we assume we have a buddy here? */
 	if (!gtknode) {
-#if 0
-		gaim_debug_error("gtkblist", "buddy %s has no ui_data\n", ((GaimBuddy *)node)->name);
-#endif
 		return FALSE;
 	}
 
@@ -3662,9 +3720,11 @@
 
 	if (!gtknode->row)
 		return FALSE;
+	
 
 	if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL)
 		return FALSE;
+
 	if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) {
 		gtk_tree_path_free(path);
 		return FALSE;
@@ -3758,6 +3818,7 @@
 	gtknode->row =
 		gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel),
 				newpath);
+	
 	gtk_tree_path_free(newpath);
 
 	gtk_tree_store_set(gtkblist->treemodel, iter,

mercurial