/[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 82 - (show annotations)
Thu Jul 10 15:29:01 2008 UTC (15 years, 9 months ago) by dpavlin
File size: 4488 byte(s)
some cleanup CRUD works, version bump [0.06]
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 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 has render_as => ( is => 'rw', isa => 'Str', required => 1, default => 'view' );
36
37 # Given a name generate a unique field ID
38 sub field_name {
39 my ($self, $name) = @_;
40 return $self->uuid . '-' . $name;
41 }
42
43 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 # 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 next if $name =~ /^_/;
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 #next if $name =~ /^_/;
92 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 my ($self, $f) = @_;
111 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 warn "# set_from_hash ", $self->uuid," produced hash = ",dump( $hash ) if $hash;
122 return $hash;
123 }
124
125 sub add_button {
126 my ($self, $name, $callback) = @_;
127 $self->callback->{$name} = $callback;
128 }
129
130 sub remove_button {
131 my ( $self, $name ) = @_;
132 delete( $self->callback->{$name} );
133 }
134
135 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 my $out = $self->renderer->{ $self->render_as }->($self);
163 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