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

  ViewVC Help
Powered by ViewVC 1.1.26