diff console/libgnt/gnttree.c @ 13853:bbf0470cb348

[gaim-migrate @ 16312] Improvement/fixing of GntTree. Do the scrolling and stuff without 'reliably'. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Fri, 23 Jun 2006 00:45:45 +0000
parents 41753203a94d
children a4c30c1d9de8
line wrap: on
line diff
--- a/console/libgnt/gnttree.c	Thu Jun 22 23:08:05 2006 +0000
+++ b/console/libgnt/gnttree.c	Fri Jun 23 00:45:45 2006 +0000
@@ -21,11 +21,12 @@
 static GntWidgetClass *parent_class = NULL;
 static guint signals[SIGS] = { 0 };
 
-/* XXX: This is ugly, but what can you do ... */
 static void
-gnt_tree_refresh(GntTree *tree)
+redraw_tree(GntTree *tree)
 {
+	int start;
 	GntWidget *widget = GNT_WIDGET(tree);
+	GList *iter;
 	int pos;
 
 	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))
@@ -33,50 +34,45 @@
 	else
 		pos = 1;
 
-	copywin(tree->scroll, widget->window, tree->top, 0,
-			pos, pos, widget->priv.height - pos - 1, widget->priv.width - pos - 1, FALSE);
-	wrefresh(widget->window);
-}
-
-static void
-redraw_tree(GntTree *tree)
-{
-	int start;
-	GntWidget *widget = GNT_WIDGET(tree);
-	GList *iter;
-
 	wbkgd(tree->scroll, COLOR_PAIR(GNT_COLOR_NORMAL));
 
 	for (start = tree->top, iter = g_list_nth(tree->list, tree->top);
 				iter && start < tree->bottom; start++, iter = iter->next)
 	{
 		char str[2096];	/* XXX: This should be safe for any terminal */
+		int wr;
 		GntTreeRow *row = g_hash_table_lookup(tree->hash, iter->data);
 
-		if (snprintf(str, widget->priv.width, "%s\n", row->text) >= widget->priv.width)
+		if ((wr = snprintf(str, widget->priv.width, "%s", row->text)) >= widget->priv.width)
 		{
 			/* XXX: ellipsize */
 			str[widget->priv.width - 1] = 0;
 		}
+		else
+		{
+			while (wr < widget->priv.width - 1)
+				str[wr++] = ' ';
+			str[wr] = 0;
+		}
 		
 		if (start == tree->current)
 		{
 			wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT));
-			mvwprintw(tree->scroll, start, 0, str);
+			mvwprintw(tree->scroll, start - tree->top + pos, pos, str);
 			wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL));
 		}
 		else
-			mvwprintw(tree->scroll, start, 0, str);
+			mvwprintw(tree->scroll, start - tree->top + pos, pos, str);
 	}
 
 	while (start < tree->bottom)
 	{
-		wmove(tree->scroll, start, 0);
+		wmove(tree->scroll, start - tree->top + pos, pos);
 		wclrtoeol(tree->scroll);
 		start++;
 	}
 
-	gnt_tree_refresh(tree);
+	wrefresh(widget->window);
 }
 
 static void
@@ -90,9 +86,10 @@
 
 	if (tree->scroll == NULL)
 	{
-		tree->scroll = newwin(SCROLL_HEIGHT, widget->priv.width, widget->priv.y, widget->priv.x);
+		tree->scroll = widget->window; /* newwin(SCROLL_HEIGHT, widget->priv.width, 0, 0); */
 		scrollok(tree->scroll, TRUE);
-		wsetscrreg(tree->scroll, 0, SCROLL_HEIGHT - 1);
+		/*wsetscrreg(tree->scroll, 0, SCROLL_HEIGHT - 1);*/
+		wsetscrreg(tree->scroll, 0, widget->priv.height - 1);
 
 		tree->top = 0;
 		tree->bottom = widget->priv.height -
@@ -132,14 +129,16 @@
 			tree->current++;
 			if (tree->current >= tree->bottom)
 				gnt_tree_scroll(tree, 1 + tree->current - tree->bottom);
-			redraw_tree(tree);
+			else
+				redraw_tree(tree);
 		}
 		else if (strcmp(text+1, GNT_KEY_UP) == 0 && tree->current > 0)
 		{
 			tree->current--;
 			if (tree->current < tree->top)
 				gnt_tree_scroll(tree, tree->current - tree->top);
-			redraw_tree(tree);
+			else
+				redraw_tree(tree);
 		}
 	}
 	else if (text[0] == '\r')
@@ -216,6 +215,7 @@
 	GntTree *tree = GNT_TREE(widget);
 
 	tree->hash = g_hash_table_new(g_direct_hash, g_direct_equal);
+	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW);
 
 	return widget;
 }
@@ -249,8 +249,7 @@
 	tree->top += count;
 	tree->bottom += count;
 
-	/*wscrl(tree->scroll, count);*/
-	gnt_tree_refresh(tree);
+	redraw_tree(tree);
 }
 
 void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro)