use strict;
use parent qw(SL::Layout::Base);
+use Carp;
+use Scalar::Util qw(blessed);
+use SL::Layout::ActionBar::Action;
+use SL::Layout::ActionBar::ComboBox;
+use SL::Layout::ActionBar::Link;
+use SL::Layout::ActionBar::Separator;
+
use constant HTML_CLASS => 'layout-actionbar';
use Rose::Object::MakeMethods::Generic (
'scalar --get_set_init' => [ qw(actions) ],
);
+my %class_descriptors = (
+ action => { class => 'SL::Layout::ActionBar::Action', num_params => 1, },
+ combobox => { class => 'SL::Layout::ActionBar::ComboBox', num_params => 1, },
+ link => { class => 'SL::Layout::ActionBar::Link', num_params => 1, },
+ separator => { class => 'SL::Layout::ActionBar::Separator', num_params => 0, },
+);
###### Layout overrides
sub pre_content {
- $::request->presenter->html_tag('div', '', class => HTML_CLASS);
+ my ($self) = @_;
+
+ my $content = join '', map { $_->render } @{ $self->actions };
+ return if !$content;
+ $::request->presenter->html_tag('div', $content, class => HTML_CLASS);
}
-sub inline_javascript {
- # data for bar
+sub javascripts_inline {
+ join '', map { $_->script } @{ $_[0]->actions };
}
sub javascripts {
-
+ 'kivi.ActionBar.js'
}
###### interface
-sub add_actions {
+sub add {
my ($self, @actions) = @_;
- push @{ $self->actions }, @actions;
-}
-sub init_actions {
- []
+ push @{ $self->actions }, $self->parse_actions(@actions);
+
+ return $self->actions->[-1];
}
+sub parse_actions {
+ my ($self_or_class, @actions) = @_;
+
+ my @parsed;
+
+ while (my $type = shift(@actions)) {
+ if (blessed($type) && $type->isa('SL::Layout::ActionBar::Action')) {
+ push @parsed, $type;
+ continue;
+ }
+ my $descriptor = $class_descriptors{lc $type} || croak("Unknown action type '${type}'");
+ my @params = splice(@actions, 0, $descriptor->{num_params});
+ push @parsed, $descriptor->{class}->from_params(@params);
+ }
+
+ return @parsed;
+}
+
+sub init_actions {
+ []
+}
1;
=over 4
-=item C<add_actions LIST>
-
-Dispatches each each argument to C<add_action>
-
-=item C<add_action>
-
-
-=item C<add_separator>
+=item C<add LIST>
-=item C<add_
+to be documented
=head1 ACCESS FROM CODE
This is accessable through
- $::request->layout->actionbar
+ $::request->layout->get('actionbar')
=head1 DOM MODEL