minor reflector changes and start of widget port
groditi [Thu, 20 Sep 2007 18:32:32 +0000 (18:32 +0000)]
13 files changed:
lib/Reaction/InterfaceModel/Reflector/DBIC.pm
lib/Reaction/UI/LayoutSet.pm
lib/Reaction/UI/View.pm
lib/Reaction/UI/ViewPort/ObjectView.pm
lib/Reaction/UI/Widget/DisplayField/Boolean.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/DisplayField/Collection.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/DisplayField/DateTime.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/DisplayField/List.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/DisplayField/Number.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/DisplayField/RelatedObject.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/DisplayField/String.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/DisplayField/Text.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/ObjectView.pm [new file with mode: 0644]

index 429ab4a..70b65b7 100644 (file)
@@ -34,13 +34,13 @@ class DBIC, which {
 
   implements build_builtin_object_actions => as {
     {
-      Update => { base => Update },
-      Delete => { base => Delete, attributes => [] },
+      Update => { name => 'Update', base => Update },
+      Delete => { name => 'Delete', base => Delete, attributes => [] },
     };
   };
 
   implements build_builtin_collection_actions => as {
-    { Create => {base => Create } };
+    { Create => {name => 'Create', base => Create } };
   };
 
   implements _all_object_actions => as {
@@ -407,6 +407,10 @@ class DBIC, which {
       for my $action (keys %$actions){
         my $action_opts = $self->merge_hashes
           ($all_actions->{$action} || {}, $actions->{$action} || {});
+
+        #NOTE: If the name of the action is not specified in the prototype then use it's
+        #hash key as the name. I think this is sane beahvior, but I've actually been thinking
+        #of making Action prototypes their own separate objects
         $self->reflect_source_action(
                                      name         => $action,
                                      object_class => $object,
@@ -557,6 +561,10 @@ class DBIC, which {
       for my $action (keys %$actions){
         my $action_opts = $self->merge_hashes
           ($all_actions->{$action} || {}, $actions->{$action} || {});
+
+        #NOTE: If the name of the action is not specified in the prototype then use it's
+        #hash key as the name. I think this is sane beahvior, but I've actually been thinking
+        #of making Action prototypes their own separate objects
         $self->reflect_source_action(
                                      name         => $action,
                                      object_class => $class,
index 793568f..60d68d9 100644 (file)
@@ -46,7 +46,7 @@ class LayoutSet which {
     my ($self) = @_;
     return join('', map { ucfirst($_) } split('_', $self->name));
   };
-      
+
 };
 
 1;
index 4fc40c6..fa98030 100644 (file)
@@ -24,6 +24,14 @@ class View which {
     return $class->new(%{$args||{}}, app => $app);
   };
 
+  sub BUILD{
+    my $self = shift;
+    my $skin_name = $self->skin_name;
+    my $skin_path = $app->path_to('share','skin',$skin_name);
+    confess("'${skin_path}' is not a valid path for skin '${skin_name}'")
+      unless -d $skin_path;
+  }
+
   implements 'render_window' => as {
     my ($self, $window) = @_;
     my $root_vp = $window->focus_stack->vp_head;
index fee0ff9..6aa21b1 100644 (file)
@@ -19,14 +19,16 @@ class ObjectView is 'Reaction::UI::ViewPort', which {
   has field_names => (isa => 'ArrayRef', is => 'rw', lazy_build => 1);
 
   has _field_map => (
-    isa => 'HashRef', is => 'rw', init_arg => 'fields',
-    predicate => '_has_field_map', set_or_lazy_build('field_map'),
+    isa => 'HashRef', is => 'rw', init_arg => 'fields', lazy_build => 1,
   );
 
   has exclude_fields =>
       ( is => 'rw', isa => 'ArrayRef', required => 1, default => sub{ [] } );
 
-  sub fields { shift->_field_map }
+  has ordered_fields => (is => 'rw', isa => 'ArrayRef', lazy_build => 1);
+
+
+  implements fields => as { shift->_field_map };
 
   implements BUILD => as {
     my ($self, $args) = @_;
@@ -94,10 +96,15 @@ class ObjectView is 'Reaction::UI::ViewPort', which {
     return @fields;
   };
 
-  implements build_field_map => as {
+  implements _build_field_map => as {
     confess "Lazy field map building not supported by default";
   };
 
+  implements build_ordered_fields => as {
+    my $self = shift;
+    [ map{ $self->_field_map->{$_} } $self->field_names ];
+  };
+
   implements build_simple_field => as {
     my ($self, $class, $attr, $args) = @_;
     my $attr_name = $attr->name;
diff --git a/lib/Reaction/UI/Widget/DisplayField/Boolean.pm b/lib/Reaction/UI/Widget/DisplayField/Boolean.pm
new file mode 100644 (file)
index 0000000..e1d9e9a
--- /dev/null
@@ -0,0 +1,28 @@
+package Reaction::UI::Widget::DisplayField::Boolean;
+
+use Reaction::UI::WidgetClass;
+
+class Boolean, which {
+  widget renders [ qw/label value/ => { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  value  renders [ string { $_{viewport}->value_string } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% content %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout value
+
+[% content %]
+
+=cut
+
diff --git a/lib/Reaction/UI/Widget/DisplayField/Collection.pm b/lib/Reaction/UI/Widget/DisplayField/Collection.pm
new file mode 100644 (file)
index 0000000..4e65331
--- /dev/null
@@ -0,0 +1,35 @@
+package Reaction::UI::Widget::DisplayField::Collection;
+
+use Reaction::UI::WidgetClass;
+
+class Collection, which {
+  widget renders [ qw/label list item/ =>  { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  list   renders [ item over func('viewport', 'value_names') ];
+  item   renders [ string { $_{_} } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% label %]
+[% list  %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout list
+
+<ul>
+[% item %]
+</ul>
+
+=for layout item
+
+<li>[% content %]</li>
+
+=cut
diff --git a/lib/Reaction/UI/Widget/DisplayField/DateTime.pm b/lib/Reaction/UI/Widget/DisplayField/DateTime.pm
new file mode 100644 (file)
index 0000000..d6d0446
--- /dev/null
@@ -0,0 +1,27 @@
+package Reaction::UI::Widget::DisplayField::DateTime;
+
+use Reaction::UI::WidgetClass;
+
+class DateTime, which {
+  widget renders [ qw/label value/ => { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  value  renders [ string { $_{viewport}->value_string } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% content %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout value
+
+[% content %]
+
+=cut
diff --git a/lib/Reaction/UI/Widget/DisplayField/List.pm b/lib/Reaction/UI/Widget/DisplayField/List.pm
new file mode 100644 (file)
index 0000000..06e7cb4
--- /dev/null
@@ -0,0 +1,35 @@
+package Reaction::UI::Widget::DisplayField::List;
+
+use Reaction::UI::WidgetClass;
+
+class List, which {
+  widget renders [ qw/label list item/ =>  { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  list   renders [ item over func('viewport', 'value_names') ];
+  item   renders [ string { $_{_} } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% label %]
+[% list  %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout list
+
+<ul>
+[% item %]
+</ul>
+
+=for layout item
+
+<li>[% content %]</li>
+
+=cut
diff --git a/lib/Reaction/UI/Widget/DisplayField/Number.pm b/lib/Reaction/UI/Widget/DisplayField/Number.pm
new file mode 100644 (file)
index 0000000..7f9d928
--- /dev/null
@@ -0,0 +1,27 @@
+package Reaction::UI::Widget::DisplayField::Number;
+
+use Reaction::UI::WidgetClass;
+
+class Number, which {
+  widget renders [ qw/label value/ => { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  value  renders [ string { $_{viewport}->value } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% content %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout value
+
+[% content %]
+
+=cut
diff --git a/lib/Reaction/UI/Widget/DisplayField/RelatedObject.pm b/lib/Reaction/UI/Widget/DisplayField/RelatedObject.pm
new file mode 100644 (file)
index 0000000..58f1b78
--- /dev/null
@@ -0,0 +1,27 @@
+package Reaction::UI::Widget::DisplayField::RelatedObject;
+
+use Reaction::UI::WidgetClass;
+
+class RelatedObject, which {
+  widget renders [ qw/label value/ => { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  value  renders [ string { $_{viewport}->value_string } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% content %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout value
+
+[% content %]
+
+=cut
diff --git a/lib/Reaction/UI/Widget/DisplayField/String.pm b/lib/Reaction/UI/Widget/DisplayField/String.pm
new file mode 100644 (file)
index 0000000..9530996
--- /dev/null
@@ -0,0 +1,27 @@
+package Reaction::UI::Widget::DisplayField::String;
+
+use Reaction::UI::WidgetClass;
+
+class String, which {
+  widget renders [ qw/label value/ => { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  value  renders [ string { $_{viewport}->value } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% content %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout value
+
+[% content %]
+
+=cut
diff --git a/lib/Reaction/UI/Widget/DisplayField/Text.pm b/lib/Reaction/UI/Widget/DisplayField/Text.pm
new file mode 100644 (file)
index 0000000..fd9c111
--- /dev/null
@@ -0,0 +1,27 @@
+package Reaction::UI::Widget::DisplayField::Text;
+
+use Reaction::UI::WidgetClass;
+
+class Text, which {
+  widget renders [ qw/label value/ => { viewport => func(self => 'viewport') } ];
+  label  renders [ string { $_{viewport}->label } ];
+  value  renders [ string { $_{viewport}->value } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+[% content %]
+
+=for layout label
+
+<strong > [ % content %]: </strong>
+
+=for layout value
+
+[% content %]
+
+=cut
diff --git a/lib/Reaction/UI/Widget/ObjectView.pm b/lib/Reaction/UI/Widget/ObjectView.pm
new file mode 100644 (file)
index 0000000..8b8a941
--- /dev/null
@@ -0,0 +1,22 @@
+package Reaction::UI::Widget::ObjectView;
+
+use Reaction::UI::WidgetClass;
+
+class ObjectView, which {
+  widget renders [ fields => { viewport   => func('self', 'viewport') } ];
+  field  renders [ viewport over func('viewport','ordered_fields')    } ];
+};
+
+1;
+
+__END__;
+
+=for layout widget
+
+  [% field %]
+
+=for layout field
+
+  [% content %]<br>
+
+=cut