/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 79 - (show annotations)
Thu Jul 10 10:33:04 2008 UTC (15 years, 9 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 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 use Data::Dump qw/dump/;
20
21 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 has render_as => ( is => 'rw', isa => 'Str', required => 1, default => 'view' );
37
38 # Given a name generate a unique field ID
39 sub field_name {
40 my ($self, $name) = @_;
41 return $self->uuid . '-' . $name;
42 }
43
44 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 # 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 next if $name =~ /^_/;
70 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 #next if $name =~ /^_/;
93 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 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 }
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 my $out = $self->renderer->{ $self->render_as }->($self);
160 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