X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FSet%2FPoint.pm;h=b45adaf41411a21415fcba9a9966bb977c1b940c;hb=c0c71aaf7da22da2c52cec635cb899a25599dad7;hp=868fd5b1d7adfd355c9a360e414672a43e9a3d42;hpb=30f5ed56f488e23570b3ed768de0614c99dcd70e;p=perl%2Fmodules%2FLaTeX-TikZ.git diff --git a/lib/LaTeX/TikZ/Set/Point.pm b/lib/LaTeX/TikZ/Set/Point.pm index 868fd5b..b45adaf 100644 --- a/lib/LaTeX/TikZ/Set/Point.pm +++ b/lib/LaTeX/TikZ/Set/Point.pm @@ -17,6 +17,9 @@ our $VERSION = '0.01'; use LaTeX::TikZ::Point; +use LaTeX::TikZ::Interface; +use LaTeX::TikZ::Functor; + use Any::Moose; use Any::Moose 'Util::TypeConstraints'; @@ -27,6 +30,29 @@ has 'point' => ( 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' @@ -42,17 +68,47 @@ sub path { 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, @_); + }, +); - my $point = @_ == 0 ? 0 - : @_ == 1 ? $_[0] - : \@_; - __PACKAGE__->new(point => $point); -}; +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;