# We define custom widgets in pure Perl and XUL, then use them!
# a button, but with a bold blue label, self increasing -----------------------
package MyCustomButton;
use XUL::Node;
use base 'XUL::Node';
# this widget is represented by the XUL Button element
# the name of its factory method is just the package name (default)
# it takes no special construction params (default)
sub my_tag { 'Button' }
sub init {
my $self = shift;
$self->style('color:blue; font-weight:bold');
add_listener $self, Click => sub
{ my $me = shift->source; $me->label( $me->label + 1 ) }
}
# a group box of custom buttons -----------------------------------------------
package MyCustomButtonBox;
use XUL::Node::MVC qw(MyCustomButton);
use base 'XUL::Node';
# this widget is represented by the XUL GroupBox
# the name of its factory method is ButtonBox
# it takes a parameter 'number' in its constructor
sub my_tag { 'GroupBox' }
sub my_name { 'ButtonBox' }
sub my_keys { qw(number) }
sub init {
my ($self, %params) = @_;
local $_;
my $label: Value = 0;
$self->add_child( MyCustomButton(label => $label) )
for 1..$params{number};
}
# the application -------------------------------------------------------------
package XUL::Node::Application::CustomWidgetsExample;
use strict;
use warnings;
# custom widgets need to be imported through XUL::Node or XUL::Node::MVC
use XUL::Node::MVC qw(MyCustomButton MyCustomButtonBox);
use base 'XUL::Node::Application';
sub start {
my $label: Value = 0;
Window(SIZE_TO_CONTENT, VBox(
MyCustomButton(label => $label),
ButtonBox(number => 5),
));
}
1;