diff options
author | matthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-07-24 01:42:34 +0000 |
---|---|---|
committer | matthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-07-24 01:42:34 +0000 |
commit | 8139388160b0a38002b22ff95c3fee3d8380f156 (patch) | |
tree | d7610c5db84c2c996107adb36bca1fe8a2b0b7cb /lib/Reaction/UI/ViewPort/Field/TimeRange.pm | |
parent | 2a4c89335368295f0fc55f79d2c8fd5e33afd212 (diff) | |
download | reaction-8139388160b0a38002b22ff95c3fee3d8380f156.tar.gz reaction-8139388160b0a38002b22ff95c3fee3d8380f156.zip |
rclass stuff ripped out of everything but widget classes
Diffstat (limited to 'lib/Reaction/UI/ViewPort/Field/TimeRange.pm')
-rw-r--r-- | lib/Reaction/UI/ViewPort/Field/TimeRange.pm | 155 |
1 files changed, 77 insertions, 78 deletions
diff --git a/lib/Reaction/UI/ViewPort/Field/TimeRange.pm b/lib/Reaction/UI/ViewPort/Field/TimeRange.pm index ccf6e65..f227203 100644 --- a/lib/Reaction/UI/ViewPort/Field/TimeRange.pm +++ b/lib/Reaction/UI/ViewPort/Field/TimeRange.pm @@ -6,89 +6,88 @@ use DateTime; use DateTime::SpanSet; use Time::ParseDate (); -class TimeRange is 'Reaction::UI::ViewPort::Field', which { - - has '+value' => (isa => SpanSet); - - #has '+layout' => (default => 'timerange'); - - has value_string => - (isa => 'Str', is => 'rw', lazy_fail => 1, trigger_adopt('value_string')); - - has delete_label => ( - isa => 'Str', is => 'rw', required => 1, default => sub { 'Delete' }, - ); - - has parent => ( - isa => 'Reaction::UI::ViewPort::TimeRangeCollection', - is => 'ro', - required => 1, - is_weak_ref => 1 - ); - - implements _build_value_string => as { - my $self = shift; - #return '' unless $self->has_value; - #return $self->value_string; - }; - - implements value_array => as { - my $self = shift; - return split(',', $self->value_string); - }; - - implements adopt_value_string => as { - my ($self) = @_; - my @values = $self->value_array; - for my $idx (0 .. 3) { # last value is repeat - if (length $values[$idx]) { - my ($epoch) = Time::ParseDate::parsedate($values[$idx], UK => 1); - $values[$idx] = DateTime->from_epoch( epoch => $epoch ); - } +use namespace::clean -except => [ qw(meta) ]; +extends 'Reaction::UI::ViewPort::Field'; + + + +has '+value' => (isa => SpanSet); + +#has '+layout' => (default => 'timerange'); + +has value_string => + (isa => 'Str', is => 'rw', lazy_fail => 1, trigger_adopt('value_string')); + +has delete_label => ( + isa => 'Str', is => 'rw', required => 1, default => sub { 'Delete' }, +); + +has parent => ( + isa => 'Reaction::UI::ViewPort::TimeRangeCollection', + is => 'ro', + required => 1, + is_weak_ref => 1 +); +sub _build_value_string { + my $self = shift; + #return '' unless $self->has_value; + #return $self->value_string; +}; +sub value_array { + my $self = shift; + return split(',', $self->value_string); +}; +sub adopt_value_string { + my ($self) = @_; + my @values = $self->value_array; + for my $idx (0 .. 3) { # last value is repeat + if (length $values[$idx]) { + my ($epoch) = Time::ParseDate::parsedate($values[$idx], UK => 1); + $values[$idx] = DateTime->from_epoch( epoch => $epoch ); } - $self->value($self->range_to_spanset(@values)); - }; - - implements range_to_spanset => as { - my ($self, $time_from, $time_to, $repeat_from, $repeat_to, $pattern) = @_; - my $spanset = DateTime::SpanSet->empty_set; - if (!$pattern || $pattern eq 'none') { - my $span = DateTime::Span->from_datetimes( - start => $time_from, end => $time_to - ); - $spanset = $spanset->union( $span ); - } else { - my $duration = $time_to - $time_from; - my %args = ( days => $time_from->day + 2, - hours => $time_from->hour, - minutes => $time_from->minute, - seconds => $time_from->second ); - - delete $args{'days'} if ($pattern eq 'daily'); - delete @args{qw/hours days/} if ($pattern eq 'hourly'); - $args{'days'} = $time_from->day if ($pattern eq 'monthly'); - my $start_set = DateTime::Event::Recurrence->$pattern( %args ); - my $iter = $start_set->iterator( start => $repeat_from, end => $repeat_to ); - while ( my $dt = $iter->next ) { - my $endtime = $dt + $duration; - my $new_span = DateTime::Span->from_datetimes( - start => $dt, - end => $endtime - ); - $spanset = $spanset->union( $new_span ); - } + } + $self->value($self->range_to_spanset(@values)); +}; +sub range_to_spanset { + my ($self, $time_from, $time_to, $repeat_from, $repeat_to, $pattern) = @_; + my $spanset = DateTime::SpanSet->empty_set; + if (!$pattern || $pattern eq 'none') { + my $span = DateTime::Span->from_datetimes( + start => $time_from, end => $time_to + ); + $spanset = $spanset->union( $span ); + } else { + my $duration = $time_to - $time_from; + my %args = ( days => $time_from->day + 2, + hours => $time_from->hour, + minutes => $time_from->minute, + seconds => $time_from->second ); + + delete $args{'days'} if ($pattern eq 'daily'); + delete @args{qw/hours days/} if ($pattern eq 'hourly'); + $args{'days'} = $time_from->day if ($pattern eq 'monthly'); + my $start_set = DateTime::Event::Recurrence->$pattern( %args ); + my $iter = $start_set->iterator( start => $repeat_from, end => $repeat_to ); + while ( my $dt = $iter->next ) { + my $endtime = $dt + $duration; + my $new_span = DateTime::Span->from_datetimes( + start => $dt, + end => $endtime + ); + $spanset = $spanset->union( $new_span ); } - return $spanset; - }; + } + return $spanset; +}; +sub delete { + my ($self) = @_; + $self->parent->remove_range_vp($self); +}; - implements delete => as { - my ($self) = @_; - $self->parent->remove_range_vp($self); - }; +override accept_events => sub { ('value_string', 'delete', super()) }; - override accept_events => sub { ('value_string', 'delete', super()) }; +__PACKAGE__->meta->make_immutable; -}; 1; |