search spec components factored out of T365
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort.pm
index 989c7e0..06ffffa 100644 (file)
@@ -19,10 +19,12 @@ has focus_stack => (
 has _tangent_stacks => (
   isa => 'HashRef', is => 'ro', default => sub { {} }
 );
-has ctx => (isa => 'Catalyst', is => 'ro'); #, required => 1);
+has ctx => (isa => 'Catalyst', is => 'ro', weak_ref => 1); #, required => 1);
+
 sub _build_layout {
   '';
-};
+}
+
 sub create_tangent {
   my ($self, $name) = @_;
   my $t_map = $self->_tangent_stacks;
@@ -33,7 +35,8 @@ sub create_tangent {
   my $tangent = Reaction::UI::FocusStack->new(loc_prefix => $loc);
   $t_map->{$name} = $tangent;
   return $tangent;
-};
+}
+
 sub focus_tangent {
   my ($self, $name) = @_;
   if (my $tangent = $self->_tangent_stacks->{$name}) {
@@ -41,45 +44,49 @@ sub focus_tangent {
   } else {
     return;
   }
-};
+}
+
 sub focus_tangents {
   return keys %{shift->_tangent_stacks};
-};
+}
+
 sub child_event_sinks {
   my $self = shift;
   return values %{$self->_tangent_stacks};
-};
+}
+
 sub apply_events {
   my ($self, $events) = @_;
   return unless keys %$events;
   $self->apply_child_events($events);
   $self->apply_our_events($events);
-};
+}
+
 sub apply_child_events {
   my ($self, $events) = @_;
   return unless keys %$events;
   foreach my $child ($self->child_event_sinks) {
     confess blessed($child) ."($child) is not a valid object"
       unless blessed($child) && $child->can('apply_events');
-    $child->apply_events($events);
+    my $loc = $child->location;
+    my %child_events = map { $_ => delete $events->{$_} }
+      grep { /^${loc}[-:]/ } keys %$events;
+    $child->apply_events(\%child_events);
   }
-};
+}
+
 sub apply_our_events {
   my ($self, $events) = @_;
-  my @keys = keys %$events;
-  return unless @keys;
   my $loc = $self->location;
   my %our_events;
   foreach my $key (keys %$events) {
     if ($key =~ m/^${loc}:(.*)$/) {
-      $our_events{$1} = $events->{$key};
+      $our_events{$1} = delete $events->{$key};
     }
   }
-  if (keys %our_events) {
-    #warn "$self: events ".join(', ', %our_events)."\n";
-    $self->handle_events(\%our_events);
-  }
-};
+  $self->handle_events(\%our_events) if keys %our_events;
+}
+
 sub handle_events {
   my ($self, $events) = @_;
   my $exists = exists $events->{exists};
@@ -94,28 +101,30 @@ sub handle_events {
         my $name = join(' at ', $self, $self->location);
         print STDERR
           "Applying Event: $event on $name with value: "
-          .(defined $events->{$event} ? $events->{$event} : '<undef>');
+          .(defined $events->{$event} ? $events->{$event} : '<undef>')."\n";
       }
       $self->$event($events->{$event});
     }
   }
-};
-sub accept_events { () };
-sub force_events { () };
+}
+
+sub accept_events { () }
+
+sub force_events { () }
+
 sub event_id_for {
   my ($self, $name) = @_;
   return join(':', $self->location, $name);
-};
+}
+
 sub sort_by_spec {
   my ($self, $spec, $items) = @_;
-  return $items if not defined $spec;
+  return [sort @$items] unless $spec;
 
   my @order;
   if (ref $spec eq 'ARRAY') {
     @order = @$spec;
-  }
-  elsif (not ref $spec) {
-    return $items unless length $spec;
+  } elsif (not ref $spec) {
     @order = split /\s+/, $spec;
   }
 
@@ -125,7 +134,7 @@ sub sort_by_spec {
   }
 
   return [sort {$order_map{$b} <=> $order_map{$a}} @$items];
-};
+}
 
 __PACKAGE__->meta->make_immutable;