use aliased 'Reaction::UI::View';
use aliased 'Reaction::UI::LayoutSet';
+sub DEBUG_FRAGMENTS () { $ENV{REACTION_UI_WIDGET_DEBUG_FRAGMENTS} }
+sub DEBUG_LAYOUTS () { $ENV{REACTION_UI_WIDGET_DEBUG_LAYOUTS} }
+
class Widget which {
has 'view' => (isa => View, is => 'ro', required => 1);
implements 'render' => as {
my ($self, $fragment_name, $rctx, $passed_args) = @_;
confess "\$passed_args not hashref" unless ref($passed_args) eq 'HASH';
-#warn "Render: ${fragment_name} for ${self}";
+ if (DEBUG_FRAGMENTS) {
+ my $vp = $passed_args->{viewport};
+ $self->view->app->log->debug(
+ "Rendering fragment ${fragment_name} for ".ref($self)
+ ." for VP ${vp} at ".$vp->location
+ );
+ }
my $args = { self => $self, %$passed_args };
my $new_args = { %$args };
my $render_tree = $self->_render_dispatch_order(
$rctx->dispatch($render_tree, $new_args);
};
+ implements '_method_for_fragment_name' => as {
+ my ($self, $fragment_name) = @_;
+ return $self->can("_fragment_${fragment_name}");
+ };
+
implements '_render_dispatch_order' => as {
my ($self, $fragment_name, $args, $new_args) = @_;
my @render_stack = (my $render_deep = (my $render_curr = []));
my @layout_order = $self->layout_set->widget_order_for($fragment_name);
- if (my $f_meth = $self->can("_fragment_${fragment_name}")) {
+ if (my $f_meth = $self->_method_for_fragment_name($fragment_name)) {
my @wclass_stack;
my $do_render = sub {
my $package = shift;
|| $layout_order[0][0]->isa($package)) {
my $new_curr = [];
my @l = @{shift(@layout_order)};
+ if (DEBUG_LAYOUTS) {
+ $self->view->app->log->debug(
+ "Layout ${fragment_name} in ${\$l[1]->name} from ${\$l[1]->source_file}"
+ );
+ }
push(@$render_curr, [ -layout, $l[1], $fragment_name, $new_curr ]);
push(@render_stack, $new_curr);
push(@wclass_stack, $l[0]);
# if we had no fragment method or if we still have layouts left
if (@layout_order) {
while (my $l = shift(@layout_order)) {
+ if (DEBUG_LAYOUTS) {
+ $self->view->app->log->debug(
+ "Layout ${fragment_name} in ${\$l->[1]->name} from ${\$l->[1]->source_file}"
+ );
+ }
push(@$render_deep, [
-layout => $l->[1], $fragment_name, ($render_deep = [])
]);
my ($self, $do_render, $args, $new_args) = @_;
my $vp = $args->{'_'};
my ($widget, $merge_args) = $self->view->render_viewport_args($vp);
+ $merge_args->{outer} = { %$new_args };
+ delete @{$new_args}{keys %$new_args}; # fresh start
@{$new_args}{keys %$merge_args} = values %$merge_args;
$do_render->(Widget, $widget, 'widget');
};
implements '_fragment_widget' => as {
my ($self, $do_render, $args, $new_args) = @_;
my $merge = $self->basic_layout_args;
+#warn "Merge: ".join(', ', keys %$merge)." into: ".join(', ', keys %$new_args);
delete @{$merge}{keys %$new_args}; # nuke 'self' and 'viewport'
@{$new_args}{keys %$merge} = values %$merge;
};