X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FSet%2FPoint.pm;h=b45adaf41411a21415fcba9a9966bb977c1b940c;hb=c0c71aaf7da22da2c52cec635cb899a25599dad7;hp=58fb28c741a073b565512841ecba24a17a994abb;hpb=abde159aad84169c3dbf1aabd21c9d1bf81acf85;p=perl%2Fmodules%2FLaTeX-TikZ.git diff --git a/lib/LaTeX/TikZ/Set/Point.pm b/lib/LaTeX/TikZ/Set/Point.pm index 58fb28c..b45adaf 100644 --- a/lib/LaTeX/TikZ/Set/Point.pm +++ b/lib/LaTeX/TikZ/Set/Point.pm @@ -17,30 +17,98 @@ our $VERSION = '0.01'; use LaTeX::TikZ::Point; +use LaTeX::TikZ::Interface; +use LaTeX::TikZ::Functor; + use Any::Moose; +use Any::Moose 'Util::TypeConstraints'; with 'LaTeX::TikZ::Set::Op'; has 'point' => ( is => 'ro', - does => 'LaTeX::TikZ::Point::Autocoerce', + isa => 'LaTeX::TikZ::Point::Autocoerce', required => 1, coerce => 1, + handles => [ qw/x y/ ], +); + +has 'label' => ( + is => 'rw', + isa => 'Maybe[Str]', + default => undef, +); + +enum 'LaTeX::TikZ::Set::Point::Positions' => ( + 'below left', + 'below', + 'below right', + 'right', + 'above right', + 'above', + 'above left', + 'left', +); + +has 'pos' => ( + is => 'rw', + isa => 'Maybe[LaTeX::TikZ::Set::Point::Positions]', ); +coerce 'LaTeX::TikZ::Set::Point' + => from 'Any' + => via { __PACKAGE__->new(point => $_) }; + +coerce 'LaTeX::TikZ::Point::Autocoerce' + => from 'LaTeX::TikZ::Set::Point' + => via { $_->point }; + sub path { my ($set, $tikz) = @_; my $p = $set->point; - '(' . $tikz->len($p->x) . ',' . $tikz->len($p->y) . ')'; + my $path = '(' . $tikz->len($p->x) . ',' . $tikz->len($p->y) . ')'; + + my $label = $set->label; + if (defined $label) { + my $pos = $set->pos; + $pos = 'above' unless defined $pos; + + my $size = sprintf '%0.1fpt', 2 * $tikz->scale / 5; + $path .= " [fill] circle ($size) " . $tikz->label($label, $pos); + } + + $path; } -use LaTeX::TikZ::Interface point => sub { - shift; +LaTeX::TikZ::Interface->register( + point => sub { + shift; + + my $point; + if (@_ == 0) { + $point = 0; + } elsif (@_ % 2) { + $point = shift; + } else { # @_ even, @_ >= 2 + $point = [ shift, shift ]; + } + + __PACKAGE__->new(point => $point, @_); + }, +); - __PACKAGE__->new(point => $_[0]); -}; +LaTeX::TikZ::Functor->default_rule( + (__PACKAGE__) => sub { + my ($functor, $set, @args) = @_; + $set->new( + point => $set->point, + label => $set->label, + pos => $set->pos, + ); + } +); __PACKAGE__->meta->make_immutable;