The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Tickit::Widget::Tree - tree widget implementation for Tickit

VERSION

version 0.103

SYNOPSIS

 use Tickit::Widget::Tree;
 my $tree = Tickit::Widget::Tree->new(root => Tree::DAG_Node->new);

DESCRIPTION

NOTE: Versions 0.003 and below used a custom graph management implementation which had various problems with rendering glitches and performance. This version has been rewritten from scratch to use Tree::DAG_Node to handle the tree structure, and as such is not backward compatible.

Tree widget in action

STYLES

The following style keys are recognised, in addition to base styling which will be applied to the tree lines:

  • line_style - which line type to use, default 'single', other options include 'thick' or 'double'

  • expand_style - 'boxed' is the only option for now, to select a Unicode +/- boxed icon

  • highlight_(fg|bg|b|rv) - highlight styling

  • highlight_full_row - if true, will apply highlighting to the entire width of the widget, rather than just the text

Tree widget styles

Key bindings are currently:

  • previous_row - move up a line, stepping into open nodes, default Up

  • next_row - move down a line, stepping into open nodes, default Down

  • up_tree - move to the parent, default Left

  • down_tree - move to the first child, opening the current node if necessary, default Right

  • open_node - opens the current node, default +

  • close_node - closes the current node, default -

  • activate - activates the current node, default Enter

  • first_row - jump to the first node in the tree, default Home

  • last_row - jump to the last node in the tree, default End

calculate_size

Calculate the minimum size needed to contain the full tree with all nodes expanded.

Used internally.

new

Instantiate. Takes the following named parameters:

  • root - the root Tree::DAG_Node

  • on_activate - coderef to call when a node has been activated (usually via 'enter' keypress)

root

Accessor for the root node. If given a parameter, will set the root node accordingly (and mark the tree for redraw), returning $self.

Otherwise, returns the root node - or undef if we do not have one.

window_gained

Work out our size, when we have a window to fit in.

set_scrolling_extents

Called by Tickit::Widget::ScrollBox or other scroll-capable containers to set up the extent objects which determine the drawable viewport offset.

scrolled

Called by Tickit::Widget::ScrollBox or other scroll-capable containers to indicate when scroll actions have occurred.

render_to_rb

Render method. Used internally.

reshape

Workaround to avoid warnings from Tickit::Window. This probably shouldn't be here, pretend you didn't see it.

on_mouse

Mouse callback. Used internally.

key_first_row

Jump to the first row. Normally bound to the Home key.

key_last_row

Jump to the last row. Normally bound to the End key.

key_previous_row

Go up a node.

key_next_row

Move down a node.

key_up_tree

Going "up" the tree means the parent of the current node.

key_down_tree

Going "down" the tree means the first child node, if we have one and we're open.

highlight_node

Change the currently highlighted node.

key_open_node

Open this node.

key_close_node

Close this node.

key_activate

Call the on_activate coderef if we have it.

TODO

Plenty of features and bugfixes left on the list, in no particular order:

  • Avoid full redraw when moving highlight or opening/closing nodes

  • Support nested widgets

  • Node reordering

  • Detect changes to the underlying Tree::DAG_Node structure

INHERITED METHODS

Tickit::Widget

get_style_pen, get_style_text, get_style_values, key_focus_next_after, key_focus_next_before, on_pen_changed, parent, pen, redraw, resized, set_parent, set_pen, set_style, set_style_tag, set_window, style_classes, take_focus, window, window_lost

Mixin::Event::Dispatch

add_handler_for_event, clear_event_handlers, event_handlers, invoke_event, subscribe_to_event, unsubscribe_from_event

AUTHOR

Tom Molesworth <cpan@entitymodel.com>

LICENSE

Copyright Tom Molesworth 2011-2013. Licensed under the same terms as Perl itself.