/[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 70 - (hide annotations)
Wed Jul 9 16:36:21 2008 UTC (15 years, 9 months ago) by dpavlin
File size: 3776 byte(s)
- skip fields which name begins with _ (private for class, not for user)
- set_from_hash now can receive callback with hash (ORM integration)
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     # Given a name generate a unique field ID
37     sub field_name {
38     my ($self, $name) = @_;
39     return $self->uuid . '-' . $name;
40     }
41    
42     # This renders an input form. Need to make the renderer selection dynamic
43     sub render_edit {
44     my ($self) = @_;
45     my $out = '<div class="editform">';
46     my %attrmap = %{ $self->meta->get_attribute_map };
47     while( my ($name, $attr) = each %attrmap ) {
48 dpavlin 70 next if $name =~ /^_/;
49 dpavlin 69 my $reader = $attr->get_read_method;
50     my $val = $self->$reader || '';
51     my $field_name = $self->field_name($name);
52     $out .= qq|
53     <div class=fieldholder>
54     <div class=label> @{[$attr->label]} </div>
55     <div class=field>
56     <input type=text id="$field_name" name="$field_name" value="@{[$val]}">
57     </div>
58     </div>
59     |;
60     }
61     $out .= $self->render_buttons;
62     $out .= '</div>';
63     return $out;
64     }
65    
66     sub render_view {
67     my ($self) = @_;
68     my $out = '<div class="view">';
69     my %attrmap = %{ $self->meta->get_attribute_map };
70     while( my ($name, $attr) = each %attrmap ) {
71 dpavlin 70 #next if $name =~ /^_/;
72 dpavlin 69 my $reader = $attr->get_read_method;
73     my $val = $self->$reader || '';
74     my $field_name = $self->field_name($name);
75     $out .= qq|
76     <div class=fieldholder>
77     <div class=label> @{[$attr->label]} </div>
78     <div class=field>
79     @{[$val]}
80     </div>
81     </div>
82     |;
83     }
84     $out .= $self->render_buttons;
85     $out .= '</div>';
86     return $out;
87     }
88    
89     sub set_from_hash {
90 dpavlin 70 my ($self, $f, $callback) = @_;
91     my %attrmap = %{ $self->meta->get_attribute_map };
92     my $hash;
93     while( my ($name, $attr) = each %attrmap ) {
94     my $field_name = $self->field_name($name);
95     if(defined $f->{$field_name}) {
96     my $writer = $attr->get_write_method;
97     $self->$writer($f->{$field_name});
98     $hash->{ $name } = $f->{$field_name};
99     }
100     }
101     warn "# hash = ",dump( $hash );
102     $callback->( $hash ) if defined $hash && defined $callback;
103 dpavlin 69 }
104    
105     sub add_button {
106     my ($self, $name, $callback) = @_;
107     $self->callback->{$name} = $callback;
108     }
109    
110     sub render_buttons {
111     my ($self) = @_;
112     my $out = '';
113     foreach my $name (keys %{$self->callback}) {
114     my $btn_name = $self->field_name($name);
115     $out .= qq{
116     <br>
117     <input type="submit" name="@{[$btn_name]}" value="$name">
118     };
119     }
120     return $out;
121     }
122    
123     sub exec_buttons {
124     my ($self, $f) = @_;
125     foreach my $name (keys %{$self->callback}) {
126     my $btn_name = $self->field_name($name);
127     if($f->{$btn_name}) {
128     $self->callback->{$name}->($f);
129     }
130     }
131     }
132    
133     sub main {
134     my ($self) = @_;
135     $self->renderer->{view} = \&render_view;
136     $self->renderer->{edit} = \&render_edit;
137     while(1) {
138     my $out = $self->renderer->{view}->($self);
139     my $f = $self->next($out);
140     $self->set_from_hash($f);
141     $self->exec_buttons($f);
142     }
143     }
144    
145     =head1 SEE ALSO
146    
147     L<Continuity>, http://continuity.tlt42.org/
148    
149     =head1 AUTHOR
150    
151     awwaiid, E<lt>awwaiid@thelackthereof.orgE<gt>, L<http://thelackthereof.org/>
152    
153     =head1 COPYRIGHT AND LICENSE
154    
155     Copyright (C) 2008 by Brock Wilcox
156    
157     This library is free software; you can redistribute it and/or modify
158     it under the same terms as Perl itself, either Perl version 5.10.0 or,
159     at your option, any later version of Perl 5 you may have available.
160    
161     =cut
162    
163     1;
164    

  ViewVC Help
Powered by ViewVC 1.1.26