diff console/libgnt/gnttree.c @ 13860:c1e3f7c75c3f

[gaim-migrate @ 16321] Sean suggested displaying a tooltip in the buddylist (http://gaim.sourceforge.net/sean/gntmock.png). This (http://img157.imageshack.us/img157/1793/q4jb.png) is close. You can press Escape to hide the tooltip. I haven't yet managed to refresh widgets when other widgets covering it are destroyed. So some parts of the border around the buddylist gets erased. I am going to try to fix it. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Fri, 23 Jun 2006 19:41:31 +0000
parents aa1c97f5e6eb
children 55fb5cd9bac9
line wrap: on
line diff
--- a/console/libgnt/gnttree.c	Fri Jun 23 16:59:12 2006 +0000
+++ b/console/libgnt/gnttree.c	Fri Jun 23 19:41:31 2006 +0000
@@ -1,8 +1,10 @@
 #include "gnttree.h"
+#include "gntutils.h"
 
 enum
 {
-	SIGS = 1,
+	SIG_SELECTION_CHANGED,
+	SIGS,
 };
 
 #define	TAB_SIZE 3
@@ -113,10 +115,18 @@
 	DEBUG;
 }
 
+static void
+tree_selection_changed(GntTree *tree, int old, int current)
+{
+	g_signal_emit(tree, signals[SIG_SELECTION_CHANGED], 0, old, current);
+}
+
 static gboolean
 gnt_tree_key_pressed(GntWidget *widget, const char *text)
 {
 	GntTree *tree = GNT_TREE(widget);
+	int old = tree->current;
+
 	if (text[0] == 27)
 	{
 		if (strcmp(text+1, GNT_KEY_DOWN) == 0 && tree->current < g_list_length(tree->list) - 1)
@@ -141,6 +151,9 @@
 		gnt_widget_activate(widget);
 	}
 
+	if (old != tree->current)
+		tree_selection_changed(tree, old, tree->current);
+
 	return FALSE;
 }
 
@@ -154,7 +167,7 @@
 }
 
 static void
-gnt_tree_class_init(GntWidgetClass *klass)
+gnt_tree_class_init(GntTreeClass *klass)
 {
 	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
 
@@ -165,6 +178,15 @@
 	parent_class->size_request = gnt_tree_size_request;
 	parent_class->key_pressed = gnt_tree_key_pressed;
 
+	signals[SIG_SELECTION_CHANGED] = 
+		g_signal_new("selection-changed",
+					 G_TYPE_FROM_CLASS(klass),
+					 G_SIGNAL_RUN_LAST,
+					 G_STRUCT_OFFSET(GntTreeClass, selection_changed),
+					 NULL, NULL,
+					 gnt_closure_marshal_VOID__INT_INT,
+					 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
+
 	DEBUG;
 }
 
@@ -271,7 +293,7 @@
 	return dep;
 }
 
-void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro)
+GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro)
 {
 	GntTreeRow *row = g_new0(GntTreeRow, 1), *pr = NULL;
 
@@ -335,11 +357,13 @@
 
 	if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED))
 		redraw_tree(tree);
+
+	return row;
 }
 
 gpointer gnt_tree_get_selection_data(GntTree *tree)
 {
-	return g_list_nth(tree->list, tree->current);
+	return g_list_nth_data(tree->list, tree->current);
 }
 
 int gnt_tree_get_selection_index(GntTree *tree)
@@ -355,9 +379,6 @@
 	{
 		int len, pos;
 
-		g_free(row->text);
-		g_free(row);
-
 		pos = g_list_index(tree->list, key);
 
 		g_hash_table_remove(tree->hash, key);
@@ -367,6 +388,13 @@
 		{
 			redraw_tree(tree);
 		}
+		g_hash_table_replace(tree->hash, key, NULL);
 	}
 }
 
+int gnt_tree_get_selection_visible_line(GntTree *tree)
+{
+	return (tree->current - tree->top) +
+			!!(GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_NO_BORDER));
+}
+