| Continuity-Widget documentation | Contained in the Continuity-Widget distribution. |
Continuity::Widget - Handy Moose-based Widget Thingie for Continuity Apps
use Continuity::Widget;
Don't quite know what this will be yet.
Continuity, http://continuity.tlt42.org/
awwaiid, <awwaiid@thelackthereof.org>, http://thelackthereof.org/
Copyright (C) 2008 by Brock Wilcox
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.0 or, at your option, any later version of Perl 5 you may have available.
| Continuity-Widget documentation | Contained in the Continuity-Widget distribution. |
package Continuity::Widget; our $VERSION = '0.01';
use Data::UUID; use Moose; with 'Continuity::Coro::Moose'; # List of callbacks, buttons for now has callback => ( is => 'rw', default => sub {{}} ); has renderer => ( is => 'rw', isa => 'HashRef', default => sub {{}}); has 'uuid' => ( is => 'ro', isa => 'Str', default => sub { Data::UUID->new->create_str } ); # Given a name generate a unique field ID sub field_name { my ($self, $name) = @_; return $self->uuid . '-' . $name; } # This renders an input form. Need to make the renderer selection dynamic sub render_edit { my ($self) = @_; my $out = '<div class="editform">'; my %attrmap = %{ $self->meta->get_attribute_map }; while( my ($name, $attr) = each %attrmap ) { my $reader = $attr->get_read_method; my $val = $self->$reader || ''; my $field_name = $self->field_name($name); $out .= qq| <div class=fieldholder> <div class=label> @{[$attr->label]} </div> <div class=field> <input type=text id="$field_name" name="$field_name" value="@{[$val]}"> </div> </div> |; } $out .= $self->render_buttons; $out .= '</div>'; return $out; } sub render_view { my ($self) = @_; my $out = '<div class="view">'; my %attrmap = %{ $self->meta->get_attribute_map }; while( my ($name, $attr) = each %attrmap ) { my $reader = $attr->get_read_method; my $val = $self->$reader || ''; my $field_name = $self->field_name($name); $out .= qq| <div class=fieldholder> <div class=label> @{[$attr->label]} </div> <div class=field> @{[$val]} </div> </div> |; } $out .= $self->render_buttons; $out .= '</div>'; return $out; } sub set_from_hash { my ($self, $f) = @_; my %attrmap = %{ $self->meta->get_attribute_map }; while( my ($name, $attr) = each %attrmap ) { my $field_name = $self->field_name($name); if(defined $f->{$field_name}) { my $writer = $attr->get_write_method; $self->$writer($f->{$field_name}); } } } sub add_button { my ($self, $name, $callback) = @_; $self->callback->{$name} = $callback; } sub render_buttons { my ($self) = @_; my $out = ''; foreach my $name (keys %{$self->callback}) { my $btn_name = $self->field_name($name); $out .= qq{ <br> <input type="submit" name="@{[$btn_name]}" value="$name"> }; } return $out; } sub exec_buttons { my ($self, $f) = @_; foreach my $name (keys %{$self->callback}) { my $btn_name = $self->field_name($name); if($f->{$btn_name}) { $self->callback->{$name}->($f); } } } sub main { my ($self) = @_; $self->renderer->{view} = \&render_view; $self->renderer->{edit} = \&render_edit; while(1) { my $out = $self->renderer->{view}->($self); my $f = $self->next($out); $self->set_from_hash($f); $self->exec_buttons($f); } }
1;