comparison console/libgnt/gnttree.c @ 13971:df8183b7fa2c

[gaim-migrate @ 16529] Make multi-column trees look nice. Show the list of users in a chat-room after you join. Add some commands (eg. /me, /help etc., all Xeroxed from gtkconv.c) committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Thu, 20 Jul 2006 17:38:09 +0000
parents 0a0d2a1fd2bc
children a71678d2da16
comparison
equal deleted inserted replaced
13970:4a2e9c494bed 13971:df8183b7fa2c
183 { 183 {
184 GntTreeCol *col = iter->data; 184 GntTreeCol *col = iter->data;
185 char *text; 185 char *text;
186 int len = g_utf8_strlen(col->text, -1); 186 int len = g_utf8_strlen(col->text, -1);
187 int fl = 0; 187 int fl = 0;
188 gboolean ell = FALSE;
189 188
190 if (i == 0) 189 if (i == 0)
191 { 190 {
192 if (row->choice) 191 if (row->choice)
193 { 192 {
218 g_string_append_c(string, '|'); 217 g_string_append_c(string, '|');
219 218
220 if (len > tree->columns[i].width) 219 if (len > tree->columns[i].width)
221 { 220 {
222 len = tree->columns[i].width; 221 len = tree->columns[i].width;
223 ell = TRUE; 222 }
224 } 223
225 224 text = g_utf8_offset_to_pointer(col->text, len - fl);
226 text = g_utf8_offset_to_pointer(col->text, len - fl - ell);
227 string = g_string_append_len(string, col->text, text - col->text); 225 string = g_string_append_len(string, col->text, text - col->text);
228 if (len < tree->columns[i].width) 226 if (len < tree->columns[i].width)
229 g_string_append_printf(string, "%*s", tree->columns[i].width - len, ""); 227 g_string_append_printf(string, "%*s", tree->columns[i].width - len, "");
230 else if (ell)
231 {
232 g_string_append_unichar(string, (gunichar)2026);
233 }
234 } 228 }
235 return g_string_free(string, FALSE); 229 return g_string_free(string, FALSE);
230 }
231
232 static void
233 tree_mark_columns(GntTree *tree, int pos, int y, chtype type)
234 {
235 GntWidget *widget = GNT_WIDGET(tree);
236 int i;
237 int x = pos;
238
239 for (i = 0; i < tree->ncol - 1; i++)
240 {
241 x += tree->columns[i].width;
242 mvwaddch(widget->window, y, x + i, type);
243 }
236 } 244 }
237 245
238 static void 246 static void
239 redraw_tree(GntTree *tree) 247 redraw_tree(GntTree *tree)
240 { 248 {
253 if (tree->current == NULL) 261 if (tree->current == NULL)
254 tree->current = tree->root; 262 tree->current = tree->root;
255 263
256 wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); 264 wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL));
257 265
266 start = 0;
267 if (tree->show_title)
268 {
269 int i;
270 int x = pos;
271
272 mvwhline(widget->window, pos + 1, pos, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL),
273 widget->priv.width - pos - 1);
274
275 for (i = 0; i < tree->ncol; i++)
276 {
277 mvwprintw(widget->window, pos, x + i, tree->columns[i].title);
278 x += tree->columns[i].width;
279 }
280 if (pos)
281 tree_mark_columns(tree, pos, 0, ACS_TTEE | COLOR_PAIR(GNT_COLOR_NORMAL));
282 tree_mark_columns(tree, pos, pos + 1, ACS_PLUS | COLOR_PAIR(GNT_COLOR_NORMAL));
283 tree_mark_columns(tree, pos, pos, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL));
284 start = 2;
285 }
286
258 row = tree->top; 287 row = tree->top;
259 for (start = pos; row && start < widget->priv.height - pos; 288 for (start = start + pos; row && start < widget->priv.height - pos;
260 start++, row = get_next(row)) 289 start++, row = get_next(row))
261 { 290 {
262 char *str; 291 char *str;
263 int wr; 292 int wr;
264 293
301 wbkgdset(widget->window, '\0' | attr); 330 wbkgdset(widget->window, '\0' | attr);
302 mvwprintw(widget->window, start, pos, str); 331 mvwprintw(widget->window, start, pos, str);
303 whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); 332 whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1));
304 tree->bottom = row; 333 tree->bottom = row;
305 g_free(str); 334 g_free(str);
335 tree_mark_columns(tree, pos, start, ACS_VLINE | attr);
306 } 336 }
307 337
308 wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); 338 wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL));
309 while (start < widget->priv.height - pos) 339 while (start < widget->priv.height - pos)
310 { 340 {
311 mvwhline(widget->window, start, pos, ' ', 341 mvwhline(widget->window, start, pos, ' ',
312 widget->priv.width - pos * 2); 342 widget->priv.width - pos * 2);
343 tree_mark_columns(tree, pos, start, ACS_VLINE);
313 start++; 344 start++;
314 } 345 }
315 346
316 gnt_widget_queue_update(widget); 347 gnt_widget_queue_update(widget);
317 } 348 }
422 453
423 static void 454 static void
424 gnt_tree_destroy(GntWidget *widget) 455 gnt_tree_destroy(GntWidget *widget)
425 { 456 {
426 GntTree *tree = GNT_TREE(widget); 457 GntTree *tree = GNT_TREE(widget);
458 int i;
427 459
428 g_hash_table_destroy(tree->hash); 460 g_hash_table_destroy(tree->hash);
429 g_list_free(tree->list); 461 g_list_free(tree->list);
462
463 for (i = 0; i < tree->ncol; i++)
464 {
465 g_free(tree->columns[i].title);
466 }
467 g_free(tree->columns);
430 } 468 }
431 469
432 static void 470 static void
433 gnt_tree_class_init(GntTreeClass *klass) 471 gnt_tree_class_init(GntTreeClass *klass)
434 { 472 {
811 tree->columns = g_new0(struct _GntTreeColInfo, col); 849 tree->columns = g_new0(struct _GntTreeColInfo, col);
812 while (col--) 850 while (col--)
813 { 851 {
814 tree->columns[col].width = 15; 852 tree->columns[col].width = 15;
815 } 853 }
854 tree->show_title = FALSE;
816 855
817 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW); 856 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW);
818 gnt_widget_set_take_focus(widget, TRUE); 857 gnt_widget_set_take_focus(widget, TRUE);
819 858
820 return widget; 859 return widget;
834 col->span = 1; 873 col->span = 1;
835 col->text = g_strdup(va_arg(args, const char *)); 874 col->text = g_strdup(va_arg(args, const char *));
836 875
837 row->columns = g_list_append(row->columns, col); 876 row->columns = g_list_append(row->columns, col);
838 } 877 }
878 va_end(args);
839 879
840 return row; 880 return row;
841 } 881 }
842 882
843 void gnt_tree_set_col_width(GntTree *tree, int col, int width) 883 void gnt_tree_set_col_width(GntTree *tree, int col, int width)
845 g_return_if_fail(col < tree->ncol); 885 g_return_if_fail(col < tree->ncol);
846 886
847 tree->columns[col].width = width; 887 tree->columns[col].width = width;
848 } 888 }
849 889
890 void gnt_tree_set_column_titles(GntTree *tree, ...)
891 {
892 int i;
893 va_list args;
894
895 va_start(args, tree);
896 for (i = 0; i < tree->ncol; i++)
897 {
898 const char *title = va_arg(args, const char *);
899 tree->columns[i].title = g_strdup(title);
900 }
901 va_end(args);
902 }
903
904 void gnt_tree_set_show_title(GntTree *tree, gboolean set)
905 {
906 tree->show_title = set;
907 }
908