Mercurial > pidgin.yaz
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; |