/[Frey]/trunk/lib/Continuity/Widget.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Continuity/Widget.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 79 - (hide annotations)
Thu Jul 10 10:33:04 2008 UTC (15 years, 10 months ago) by dpavlin
File size: 4421 byte(s)
try to factor out rendering into render_iterator, but it doesn't
sit well with me
1 dpavlin 69 package Continuity::Widget;
2    
3     our $VERSION = '0.01';
4    
5     =head1 NAME
6    
7     Continuity::Widget - Handy Moose-based Widget Thingie for Continuity Apps
8    
9     =head1 SYNOPSIS
10    
11     use Continuity::Widget;
12    
13     =head1 DESCRIPTION
14    
15     Don't quite know what this will be yet.
16    
17     =cut
18    
19 dpavlin 70 use Data::Dump qw/dump/;
20    
21 dpavlin 69 use Data::UUID;
22     use Moose;
23     with 'Continuity::Coro::Moose';
24    
25     # List of callbacks, buttons for now
26     has callback => ( is => 'rw', default => sub {{}} );
27    
28     has renderer => ( is => 'rw', isa => 'HashRef', default => sub {{}});
29    
30     has 'uuid' => (
31     is => 'ro',
32     isa => 'Str',
33     default => sub { Data::UUID->new->create_str }
34     );
35    
36 dpavlin 73 has render_as => ( is => 'rw', isa => 'Str', required => 1, default => 'view' );
37    
38 dpavlin 69 # Given a name generate a unique field ID
39     sub field_name {
40     my ($self, $name) = @_;
41     return $self->uuid . '-' . $name;
42     }
43    
44 dpavlin 79 sub render_iterator {
45     my ($self, $before, $iterator, $after) = @_;
46     my %attrmap = %{ $self->meta->get_attribute_map };
47     my $middle;
48     while( my ($name, $attr) = each %attrmap ) {
49     my $reader = $attr->get_read_method;
50     my $val = $self->$reader || '';
51     my $field_name = $self->field_name($name);
52     $middle .= $iterator->( $name, $field_name, $attr->label, $val ) || '';
53     }
54     if ( $middle ) {
55     return $before . $middle . $self->render_buttons . $after;
56     } else {
57     warn "iterator didn't produce output, skipping";
58     return "<!-- empty -->";
59     }
60     }
61    
62    
63 dpavlin 69 # This renders an input form. Need to make the renderer selection dynamic
64     sub render_edit {
65     my ($self) = @_;
66     my $out = '<div class="editform">';
67     my %attrmap = %{ $self->meta->get_attribute_map };
68     while( my ($name, $attr) = each %attrmap ) {
69 dpavlin 70 next if $name =~ /^_/;
70 dpavlin 69 my $reader = $attr->get_read_method;
71     my $val = $self->$reader || '';
72     my $field_name = $self->field_name($name);
73     $out .= qq|
74     <div class=fieldholder>
75     <div class=label> @{[$attr->label]} </div>
76     <div class=field>
77     <input type=text id="$field_name" name="$field_name" value="@{[$val]}">
78     </div>
79     </div>
80     |;
81     }
82     $out .= $self->render_buttons;
83     $out .= '</div>';
84     return $out;
85     }
86    
87     sub render_view {
88     my ($self) = @_;
89     my $out = '<div class="view">';
90     my %attrmap = %{ $self->meta->get_attribute_map };
91     while( my ($name, $attr) = each %attrmap ) {
92 dpavlin 70 #next if $name =~ /^_/;
93 dpavlin 69 my $reader = $attr->get_read_method;
94     my $val = $self->$reader || '';
95     my $field_name = $self->field_name($name);
96     $out .= qq|
97     <div class=fieldholder>
98     <div class=label> @{[$attr->label]} </div>
99     <div class=field>
100     @{[$val]}
101     </div>
102     </div>
103     |;
104     }
105     $out .= $self->render_buttons;
106     $out .= '</div>';
107     return $out;
108     }
109    
110     sub set_from_hash {
111 dpavlin 70 my ($self, $f, $callback) = @_;
112     my %attrmap = %{ $self->meta->get_attribute_map };
113     my $hash;
114     while( my ($name, $attr) = each %attrmap ) {
115     my $field_name = $self->field_name($name);
116     if(defined $f->{$field_name}) {
117     my $writer = $attr->get_write_method;
118     $self->$writer($f->{$field_name});
119     $hash->{ $name } = $f->{$field_name};
120     }
121     }
122     warn "# hash = ",dump( $hash );
123     $callback->( $hash ) if defined $hash && defined $callback;
124 dpavlin 69 }
125    
126     sub add_button {
127     my ($self, $name, $callback) = @_;
128     $self->callback->{$name} = $callback;
129     }
130    
131     sub render_buttons {
132     my ($self) = @_;
133     my $out = '';
134     foreach my $name (keys %{$self->callback}) {
135     my $btn_name = $self->field_name($name);
136     $out .= qq{
137     <br>
138     <input type="submit" name="@{[$btn_name]}" value="$name">
139     };
140     }
141     return $out;
142     }
143    
144     sub exec_buttons {
145     my ($self, $f) = @_;
146     foreach my $name (keys %{$self->callback}) {
147     my $btn_name = $self->field_name($name);
148     if($f->{$btn_name}) {
149     $self->callback->{$name}->($f);
150     }
151     }
152     }
153    
154     sub main {
155     my ($self) = @_;
156     $self->renderer->{view} = \&render_view;
157     $self->renderer->{edit} = \&render_edit;
158     while(1) {
159 dpavlin 73 my $out = $self->renderer->{ $self->render_as }->($self);
160 dpavlin 69 my $f = $self->next($out);
161     $self->set_from_hash($f);
162     $self->exec_buttons($f);
163     }
164     }
165    
166     =head1 SEE ALSO
167    
168     L<Continuity>, http://continuity.tlt42.org/
169    
170     =head1 AUTHOR
171    
172     awwaiid, E<lt>awwaiid@thelackthereof.orgE<gt>, L<http://thelackthereof.org/>
173    
174     =head1 COPYRIGHT AND LICENSE
175    
176     Copyright (C) 2008 by Brock Wilcox
177    
178     This library is free software; you can redistribute it and/or modify
179     it under the same terms as Perl itself, either Perl version 5.10.0 or,
180     at your option, any later version of Perl 5 you may have available.
181    
182     =cut
183    
184     1;
185    

  ViewVC Help
Powered by ViewVC 1.1.26