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

  ViewVC Help
Powered by ViewVC 1.1.26