comparison 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
comparison
equal deleted inserted replaced
13852:d95e5e0e29b9 13853:bbf0470cb348
19 }; 19 };
20 20
21 static GntWidgetClass *parent_class = NULL; 21 static GntWidgetClass *parent_class = NULL;
22 static guint signals[SIGS] = { 0 }; 22 static guint signals[SIGS] = { 0 };
23 23
24 /* XXX: This is ugly, but what can you do ... */ 24 static void
25 static void 25 redraw_tree(GntTree *tree)
26 gnt_tree_refresh(GntTree *tree) 26 {
27 { 27 int start;
28 GntWidget *widget = GNT_WIDGET(tree); 28 GntWidget *widget = GNT_WIDGET(tree);
29 GList *iter;
29 int pos; 30 int pos;
30 31
31 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) 32 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))
32 pos = 0; 33 pos = 0;
33 else 34 else
34 pos = 1; 35 pos = 1;
35 36
36 copywin(tree->scroll, widget->window, tree->top, 0,
37 pos, pos, widget->priv.height - pos - 1, widget->priv.width - pos - 1, FALSE);
38 wrefresh(widget->window);
39 }
40
41 static void
42 redraw_tree(GntTree *tree)
43 {
44 int start;
45 GntWidget *widget = GNT_WIDGET(tree);
46 GList *iter;
47
48 wbkgd(tree->scroll, COLOR_PAIR(GNT_COLOR_NORMAL)); 37 wbkgd(tree->scroll, COLOR_PAIR(GNT_COLOR_NORMAL));
49 38
50 for (start = tree->top, iter = g_list_nth(tree->list, tree->top); 39 for (start = tree->top, iter = g_list_nth(tree->list, tree->top);
51 iter && start < tree->bottom; start++, iter = iter->next) 40 iter && start < tree->bottom; start++, iter = iter->next)
52 { 41 {
53 char str[2096]; /* XXX: This should be safe for any terminal */ 42 char str[2096]; /* XXX: This should be safe for any terminal */
43 int wr;
54 GntTreeRow *row = g_hash_table_lookup(tree->hash, iter->data); 44 GntTreeRow *row = g_hash_table_lookup(tree->hash, iter->data);
55 45
56 if (snprintf(str, widget->priv.width, "%s\n", row->text) >= widget->priv.width) 46 if ((wr = snprintf(str, widget->priv.width, "%s", row->text)) >= widget->priv.width)
57 { 47 {
58 /* XXX: ellipsize */ 48 /* XXX: ellipsize */
59 str[widget->priv.width - 1] = 0; 49 str[widget->priv.width - 1] = 0;
60 } 50 }
51 else
52 {
53 while (wr < widget->priv.width - 1)
54 str[wr++] = ' ';
55 str[wr] = 0;
56 }
61 57
62 if (start == tree->current) 58 if (start == tree->current)
63 { 59 {
64 wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); 60 wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT));
65 mvwprintw(tree->scroll, start, 0, str); 61 mvwprintw(tree->scroll, start - tree->top + pos, pos, str);
66 wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); 62 wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL));
67 } 63 }
68 else 64 else
69 mvwprintw(tree->scroll, start, 0, str); 65 mvwprintw(tree->scroll, start - tree->top + pos, pos, str);
70 } 66 }
71 67
72 while (start < tree->bottom) 68 while (start < tree->bottom)
73 { 69 {
74 wmove(tree->scroll, start, 0); 70 wmove(tree->scroll, start - tree->top + pos, pos);
75 wclrtoeol(tree->scroll); 71 wclrtoeol(tree->scroll);
76 start++; 72 start++;
77 } 73 }
78 74
79 gnt_tree_refresh(tree); 75 wrefresh(widget->window);
80 } 76 }
81 77
82 static void 78 static void
83 gnt_tree_draw(GntWidget *widget) 79 gnt_tree_draw(GntWidget *widget)
84 { 80 {
88 * of 'large enough' size. We never wrefresh that hidden-window, instead we 84 * of 'large enough' size. We never wrefresh that hidden-window, instead we
89 * just copy stuff from it into the visible window */ 85 * just copy stuff from it into the visible window */
90 86
91 if (tree->scroll == NULL) 87 if (tree->scroll == NULL)
92 { 88 {
93 tree->scroll = newwin(SCROLL_HEIGHT, widget->priv.width, widget->priv.y, widget->priv.x); 89 tree->scroll = widget->window; /* newwin(SCROLL_HEIGHT, widget->priv.width, 0, 0); */
94 scrollok(tree->scroll, TRUE); 90 scrollok(tree->scroll, TRUE);
95 wsetscrreg(tree->scroll, 0, SCROLL_HEIGHT - 1); 91 /*wsetscrreg(tree->scroll, 0, SCROLL_HEIGHT - 1);*/
92 wsetscrreg(tree->scroll, 0, widget->priv.height - 1);
96 93
97 tree->top = 0; 94 tree->top = 0;
98 tree->bottom = widget->priv.height - 95 tree->bottom = widget->priv.height -
99 (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) ? 0 : 2); 96 (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) ? 0 : 2);
100 } 97 }
130 if (strcmp(text+1, GNT_KEY_DOWN) == 0 && tree->current < g_list_length(tree->list) - 1) 127 if (strcmp(text+1, GNT_KEY_DOWN) == 0 && tree->current < g_list_length(tree->list) - 1)
131 { 128 {
132 tree->current++; 129 tree->current++;
133 if (tree->current >= tree->bottom) 130 if (tree->current >= tree->bottom)
134 gnt_tree_scroll(tree, 1 + tree->current - tree->bottom); 131 gnt_tree_scroll(tree, 1 + tree->current - tree->bottom);
135 redraw_tree(tree); 132 else
133 redraw_tree(tree);
136 } 134 }
137 else if (strcmp(text+1, GNT_KEY_UP) == 0 && tree->current > 0) 135 else if (strcmp(text+1, GNT_KEY_UP) == 0 && tree->current > 0)
138 { 136 {
139 tree->current--; 137 tree->current--;
140 if (tree->current < tree->top) 138 if (tree->current < tree->top)
141 gnt_tree_scroll(tree, tree->current - tree->top); 139 gnt_tree_scroll(tree, tree->current - tree->top);
142 redraw_tree(tree); 140 else
141 redraw_tree(tree);
143 } 142 }
144 } 143 }
145 else if (text[0] == '\r') 144 else if (text[0] == '\r')
146 { 145 {
147 gnt_widget_activate(widget); 146 gnt_widget_activate(widget);
214 { 213 {
215 GntWidget *widget = g_object_new(GNT_TYPE_TREE, NULL); 214 GntWidget *widget = g_object_new(GNT_TYPE_TREE, NULL);
216 GntTree *tree = GNT_TREE(widget); 215 GntTree *tree = GNT_TREE(widget);
217 216
218 tree->hash = g_hash_table_new(g_direct_hash, g_direct_equal); 217 tree->hash = g_hash_table_new(g_direct_hash, g_direct_equal);
218 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW);
219 219
220 return widget; 220 return widget;
221 } 221 }
222 222
223 void gnt_tree_set_visible_rows(GntTree *tree, int rows) 223 void gnt_tree_set_visible_rows(GntTree *tree, int rows)
247 count = -tree->top; 247 count = -tree->top;
248 248
249 tree->top += count; 249 tree->top += count;
250 tree->bottom += count; 250 tree->bottom += count;
251 251
252 /*wscrl(tree->scroll, count);*/ 252 redraw_tree(tree);
253 gnt_tree_refresh(tree);
254 } 253 }
255 254
256 void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) 255 void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro)
257 { 256 {
258 GntTreeRow *row = g_new0(GntTreeRow, 1), *pr = NULL; 257 GntTreeRow *row = g_new0(GntTreeRow, 1), *pr = NULL;