comparison console/libgnt/gnttree.c @ 14343:0387a167f342

[gaim-migrate @ 17044] A WM can now act on keystrokes. As an example, the sample WM will toggle the buddylist on pressing Alt+b. Mouse clicking and scrolling is now supported in most/all widgets. To use a WM, you need to add "wm=/path/to/wm.so" under [general] in ~/.gntrc. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 26 Aug 2006 12:54:39 +0000
parents f3ef96e8428f
children 1bd09d355f9e
comparison
equal deleted inserted replaced
14342:12156328fb4f 14343:0387a167f342
461 { 461 {
462 gpointer key = g_list_nth_data(tree->list, n); 462 gpointer key = g_list_nth_data(tree->list, n);
463 return g_hash_table_lookup(tree->hash, key); 463 return g_hash_table_lookup(tree->hash, key);
464 } 464 }
465 465
466 static void
467 action_down(GntTree *tree)
468 {
469 int dist;
470 GntTreeRow *row = get_next(tree->current);
471 if (row == NULL)
472 return;
473 tree->current = row;
474 if ((dist = get_distance(tree->current, tree->bottom)) < 0)
475 gnt_tree_scroll(tree, -dist);
476 else
477 redraw_tree(tree);
478 }
479
480 static void
481 action_up(GntTree *tree)
482 {
483 int dist;
484 GntTreeRow *row = get_prev(tree->current);
485 if (!row)
486 return;
487 tree->current = row;
488 if ((dist = get_distance(tree->current, tree->top)) > 0)
489 gnt_tree_scroll(tree, -dist);
490 else
491 redraw_tree(tree);
492 }
493
466 static gboolean 494 static gboolean
467 gnt_tree_key_pressed(GntWidget *widget, const char *text) 495 gnt_tree_key_pressed(GntWidget *widget, const char *text)
468 { 496 {
469 GntTree *tree = GNT_TREE(widget); 497 GntTree *tree = GNT_TREE(widget);
470 GntTreeRow *old = tree->current; 498 GntTreeRow *old = tree->current;
471 GntTreeRow *row; 499 GntTreeRow *row;
472 int dist; 500 int dist;
473 501
474 if (text[0] == 27) 502 if (text[0] == 27)
475 { 503 {
476 if (strcmp(text+1, GNT_KEY_DOWN) == 0 && (row = get_next(tree->current)) != NULL) 504 if (strcmp(text+1, GNT_KEY_DOWN) == 0)
477 { 505 {
478 tree->current = row; 506 action_down(tree);
479 if ((dist = get_distance(tree->current, tree->bottom)) < 0) 507 }
480 gnt_tree_scroll(tree, -dist); 508 else if (strcmp(text+1, GNT_KEY_UP) == 0)
481 else 509 {
482 redraw_tree(tree); 510 action_up(tree);
483 }
484 else if (strcmp(text+1, GNT_KEY_UP) == 0 && (row = get_prev(tree->current)) != NULL)
485 {
486 tree->current = row;
487
488 if ((dist = get_distance(tree->current, tree->top)) > 0)
489 gnt_tree_scroll(tree, -dist);
490 else
491 redraw_tree(tree);
492 } 511 }
493 else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0) 512 else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0)
494 { 513 {
495 row = get_next(tree->bottom); 514 row = get_next(tree->bottom);
496 if (row) 515 if (row)
590 g_free(tree->columns[i].title); 609 g_free(tree->columns[i].title);
591 } 610 }
592 g_free(tree->columns); 611 g_free(tree->columns);
593 } 612 }
594 613
614 static gboolean
615 gnt_tree_clicked(GntWidget *widget, GntMouseEvent event, int x, int y)
616 {
617 if (event == GNT_MOUSE_SCROLL_UP) {
618 action_up(GNT_TREE(widget));
619 } else if (event == GNT_MOUSE_SCROLL_DOWN) {
620 action_down(GNT_TREE(widget));
621 } else if (event == GNT_LEFT_MOUSE_DOWN) {
622 GntTreeRow *row;
623 GntTree *tree = GNT_TREE(widget);
624 int pos = 1;
625 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))
626 pos = 0;
627 if (tree->show_title)
628 pos += 2;
629 pos = y - widget->priv.y - pos;
630 row = get_next_n(tree->top, pos);
631 if (row && tree->current != row) {
632 GntTreeRow *old = tree->current;
633 tree->current = row;
634 redraw_tree(tree);
635 tree_selection_changed(tree, old, tree->current);
636 } else if (row == tree->current && row->choice) {
637 row->isselected = !row->isselected;
638 g_signal_emit(tree, signals[SIG_TOGGLED], 0, row->key);
639 redraw_tree(tree);
640 }
641 } else {
642 return FALSE;
643 }
644 return TRUE;
645 }
646
595 static void 647 static void
596 gnt_tree_class_init(GntTreeClass *klass) 648 gnt_tree_class_init(GntTreeClass *klass)
597 { 649 {
598 parent_class = GNT_WIDGET_CLASS(klass); 650 parent_class = GNT_WIDGET_CLASS(klass);
599 parent_class->destroy = gnt_tree_destroy; 651 parent_class->destroy = gnt_tree_destroy;
600 parent_class->draw = gnt_tree_draw; 652 parent_class->draw = gnt_tree_draw;
601 parent_class->map = gnt_tree_map; 653 parent_class->map = gnt_tree_map;
602 parent_class->size_request = gnt_tree_size_request; 654 parent_class->size_request = gnt_tree_size_request;
603 parent_class->key_pressed = gnt_tree_key_pressed; 655 parent_class->key_pressed = gnt_tree_key_pressed;
656 parent_class->clicked = gnt_tree_clicked;
604 657
605 signals[SIG_SELECTION_CHANGED] = 658 signals[SIG_SELECTION_CHANGED] =
606 g_signal_new("selection-changed", 659 g_signal_new("selection-changed",
607 G_TYPE_FROM_CLASS(klass), 660 G_TYPE_FROM_CLASS(klass),
608 G_SIGNAL_RUN_LAST, 661 G_SIGNAL_RUN_LAST,