NAME
Curses::Toolkit - a modern Curses toolkit
VERSION
version 0.211
SYNOPSIS
use POE::Component::Curses;
use Curses::Toolkit::Widget::Window;
use Curses::Toolkit::Widget::Button;
# spawn a root window
my $root = POE::Component::Curses->spawn();
# adds some widget
$root->add_window(
my $window = Curses::Toolkit::Widget::Window
->new()
->set_name('main_window')
->add_widget(
my $button = Curses::Toolkit::Widget::Button
->new_with_label('Click Me to quit')
->set_name('my_button')
->signal_connect(clicked => sub { exit(0); })
)
->set_coordinates( x1 => '20%', y1 => '20%',
x2 => '80%', y2 => '80%', )
);
POE::Kernel->run();
DESCRIPTION
This module tries to be a modern curses toolkit, based on the Curses module, to build "semi-graphical" user interfaces easily.
Curses::Toolkit is meant to be used with a mainloop, which is not part of this module. I recommend you POE::Component::Curses, which is probably what you want. POE::Component::Curses uses Curses::Toolkit, but provides a mainloop and handles keyboard, mouse, timer and other events, whereas Curses::Toolkit is just the drawing library. See the example above. the spawn
method returns a Curses::Toolkit object, which you can call methods on.
If you already have a mainloop or if you don't need it, you might want to use Curses::Toolkit directly. But again, it's probably not what you want to use. In this case you would do something like :
use Curses::Toolkit;
# using Curses::Toolkit without any event loop
my $root = Curses::Toolkit->init_root_window();
my $window = Curses::Toolkit::Widget::Window->new();
$root->add($window);
...
$root->render
TUTORIAL
If you are new with Curses::Toolkit
, I suggest you go through the tutorial. You can find it here:
Curses::Toolkit::Tutorial (not yet done!)
WIDGETS
Curses::Toolkit is based on a widget model, inspired by Gtk. I suggest you read the POD of the following widgets :
- Curses::Toolkit::Widget::Window
-
Use this widget to create a window. It's the first thing to do once you have a root_window
- Curses::Toolkit::Widget
-
Useful to read, it contains the common methods of all the widgets
- Curses::Toolkit::Widget::Label
-
To display simple text, with text colors and attributes
- Curses::Toolkit::Widget::Button
-
Simple text button widget to interact with the user
- Curses::Toolkit::Widget::GenericButton
-
A button widget that can contain anything, not just a label
- Curses::Toolkit::Widget::Entry
-
To input text from the user
- Curses::Toolkit::Widget::VBox
-
To pack widgets vertically, thus building complex layouts
- Curses::Toolkit::Widget::HBox
-
To pack widgets horizontally, thus building complex layouts
- Curses::Toolkit::Widget::Border
-
Add a simple border around any widget
- Curses::Toolkit::Widget::HPaned
-
To pack 2 widgets horizontally with a flexible gutter
- Curses::Toolkit::Widget::VPaned
-
To pack 2 widgets vertically with a flexible gutter
- Curses::Toolkit::Widget::HScrollBar
-
Not yet implemented
- Curses::Toolkit::Widget::VScrollBar.pm
-
Not yet implemented
- Curses::Toolkit::Widget::HProgressBar
-
An horizontal progress bar widget
- Curses::Toolkit::Widget::HProgressBar
-
A vertical progress bar widget
For reference, here are the various hierarchy of the objects/concepts of the toolkit you might have to use :
WIDGETS HIERARCHY
This is the inheritance hierarchy of the widgets of the toolkit :
Curses::Toolkit::Widget
|
+-- Curses::Toolkit::Widget::Window
| |
| +-- Curses::Toolkit::Widget::Window::Dialog
| |
| + Curses::Toolkit::Widget::Window::Dialog::About
|
+-- Curses::Toolkit::Widget::Label
|
+-- Curses::Toolkit::Widget::Entry
|
+-- Curses::Toolkit::Widget::Scrollbar
| |
| +-- Curses::Toolkit::Widget::HScrollbar
| |
| +-- Curses::Toolkit::Widget::VScrollbar
|
+-- Curses::Toolkit::Widget::Container
|
+-- Curses::Toolkit::Widget::HBox
|
+-- Curses::Toolkit::Widget::VBox
|
+-- Curses::Toolkit::Widget::Paned
| |
| +-- Curses::Toolkit::Widget::HPaned
| |
| +-- Curses::Toolkit::Widget::VPaned
|
+-- Curses::Toolkit::Widget::Bin
|
+-- Curses::Toolkit::Widget::Border
|
+-- Curses::Toolkit::Widget::Button
|
+-- Curses::Toolkit::Widget::GenericButton
|
+-- Curses::Toolkit::Widget::ProgressBar
|
+-- Curses::Toolkit::Widget::HProgressBar
|
+-- Curses::Toolkit::Widget::VProgressBar
SIGNALS HIERARCHY
This is the inheritance hierarchy of the signals :
Curses::Toolkit::Signal
|
+-- Curses::Toolkit::Signal::Clicked
|
+-- Curses::Toolkit::Signal::Content
| |
| +-- Curses::Toolkit::Signal::Content::Changed
|
+-- Curses::Toolkit::Signal::Focused
|
+-- Curses::Toolkit::Signal::Focused::In
|
+-- Curses::Toolkit::Signal::Focused::Out
THEMES HIERARCHY
This is the inheritance hierarchy of the themes :
Curses::Toolkit::Theme
|
+-- Curses::Toolkit::Theme::Default
|
+-- Curses::Toolkit::Theme::Default::Color
|
+-- Curses::Toolkit::Theme::Default::Color::Pink
|
+-- Curses::Toolkit::Theme::Default::Color::Yellow
OBJECTS HIERARCHY
This is the list of objects of the toolkit :
Curses::Toolkit::Object
|
+-- Curses::Toolkit::Object::Coordinates
|
+-- Curses::Toolkit::Object::MarkupString
|
+-- Curses::Toolkit::Object::Shape
ROLES HIERARCHY
For now there is only one role
Curses::Toolkit::Role::Focusable
TYPES HIERARCHY
For now there is only one types class :
Curses::Toolkit::Types
CLASS METHODS
init_root_window
my $root = Curses::Toolkit->init_root_window();
Initialize the Curses environment, and return an object representing it. This is not really a constructor, because you can't have more than one Curses::Toolkit object for one Curses environment. Think of it more like a service.
input : theme_name : optional, the name of the theme to use as default display theme
mainloop : optional, the mainloop object that will be used for event handling
quit_key : the key used to quit the whole application. Default to 'q'. If set to undef, it's disabled
switch_key : the key used to switch between windows. Default to 'r'. If set to undef, it's disabled
test_environment : optional, a hashref, if set, Curses::Toolkit will be in test mode
output : a Curses::Toolkit object
METHODS
get_theme_name
my $theme_name = $root_window->get_theme_name();
Return the theme associated with the root window. Typically used to get a usable default theme name. Use that instead of hard-coding 'Curses::Toolkit::Theme::Default'
add_event_listener
$root->add_event_listener($event_listener);
Adds an event listener to the root window. That allows the root window to respond to some events
input : a Curses::Toolkit::EventListener
output : the root window
get_event_listeners
my @listeners = $root->get_event_listener();
Returns the list of listeners connected to the root window.
input : none
output : an ARRAY of Curses::Toolkit::EventListener
get_focused_widget
my $widget = $root->get_focused_widget();
Returns the widget currently focused. Warning, the returned widget could well be a window.
input : none
output : a Curses::Toolkit::Widget or void
get_focused_window
my $window = $root->get_focused_window();
Returns the window currently focused.
input : none
output : a Curses::Toolkit::Widget::Window or void
get_focused_window
my $window = $root->get_nexd_window();
Returns the next window.
input : none
output : a Curses::Toolkit::Widget::Window or void
set_mainloop
$root->set_mainloop($mainloop)
Sets the mainloop object to be used by the Curses::Toolkit root object. The mainloop object will be called when a new event has to be registered. The mainloop object is in charge to listen to the events and call $root->dispatch_event()
input : a mainloop object
output : the Curses::Toolkit object
get_mainloop
my $mainloop = $root->get_mainloop()
Return the mainloop object associated to the root object. Might be undef if no mainloop were associated.
input : none
output : the mainloop object, or undef
get_shape
my $coordinate = $root->get_shape();
Returns a coordinate object that represents the size of the root window.
input : none
output : a Curses::Toolkit::Object::Coordinates object
add_window
my $window = Curses::Toolkit::Widget::Window->new();
$root->add_window($window);
Adds a window on the root window. Returns the root window
input : a Curses::Toolkit::Widget::Window object
output : the root window
bring_window_to_front()
$root_window->bring_window_to_front($window)
Brings the window to front
input : a Curses::Toolkit::Widget::Window
output : the root window
needs_redraw
$root->needs_redraw()
When called, signify to the root window that a redraw is needed. Has an effect only if a mainloop is active ( see POE::Component::Curses )
input : none
output : the root window
get_windows
my @windows = $root->get_windows();
Returns the list of windows loaded
input : none
output : ARRAY of Curses::Toolkit::Widget::Window
set_modal_widget
Set a widget to be modal
input : a widget
output : the root window
unset_modal_widget
Unset the widget to be modal
input : none
output : the root window
get_modal_widget
returns the modal widget, or void
input : none
output : the modal widget or void
show_all
$root->show_all();
Set visibility property to true for every element. Returns the root windows
input : none
output : the root window
render
$root->render();
Build everything in the buffer. You need to call 'display' after that to display it
input : none
output : the root window
display
$root->display();
Refresh the screen.
input : none
output : the root window
dispatch_event
my $event = Curses::Toolkit::Event::SomeEvent->new(...)
$root->dispatch_event($event);
Given an event, dispatch it to the appropriate widgets / windows, or to the root window. You probably don't want to use this method directly. Use Signals instead.
input : a Curses::Toolkit::Event
optional, a widget. if given, the event dispatching will start with this wisget (and not the focused one)
output : true if the event were handled, false if not
fire_event
$widget->fire_event($event, $widget);
Sends an event to the mainloop so it gets dispatched. You probably don't want to use this method.
input : a Curses::Toolkit::Event
optional, a widget. if given, the event dispatching will start with this widget (and not the focused one)
output : the root_window
add_delay
Has an effect only if a mainloop is active ( see POE::Component::Curses )
$root_window->add_delay($seconds, \&code, @args)
$root_window->add_delay(5, sub { print "wow, 5 seconds wasted, dear $_[0]\n"; }, $name);
Add a timer that will execute the \&code once, in $seconds seconds. $seconds can be a fraction. @args will be passed to the code reference
input : number of seconds
a code reference
an optional list of arguments to be passed to the code reference
output : a timer unique identifier or void
BUGS
Please report any bugs or feature requests to bug-curses-toolkit at rt.cpan.org
, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Curses-Toolkit. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Curses::Toolkit
You can also look for information at:
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
RT: CPAN's request tracker
Search CPAN
AUTHOR
Damien "dams" Krotkine
COPYRIGHT AND LICENSE
This software is copyright (c) 2011 by Damien "dams" Krotkine.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.