You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
wiki-map/HexGrid/PopUp.pm

75 lines
2.8 KiB

package HexGrid::PopUp;
use v5.30;
use Moo;
use Text::Wrap::OO;
use Data::Dumper;
use feature "signatures";
no warnings "experimental::signatures";
has width => (is => 'rw', default => 600);
has height => (is => 'rw', default => 750);
has origin_x => (is => 'rw', default => 0);
has origin_y => (is => 'rw', default => 100);
has corner_radius => (is => 'rw', default => 20);
has gap_start => (is => 'rw', default => 40);
has gap_width => (is => 'rw', default => 40);
has name => (is => 'rw');
has link => (is => 'rw', alias => 'href');
has description => (is => 'rw', alias => 'desc');
has 'font-size' => (is => 'rw', default => '2.5em');
has margin => (is => 'rw', default => 20);
has 'stroke-width' => (is => 'rw', default => 2);
sub render($this, $scaler)
{
my %t = %$this;
my $gap_end = $t{gap_start} + $t{gap_width};
$scaler->{width} = $t{width};
$scaler->{height} = $t{height};
$scaler->{viewBox} = "0 0 $t{width} $t{height}";
my $box_height = $t{height} - $t{origin_y};
my $path_string = _M($t{gap_start},$box_height);
$path_string .= _L($t{origin_x},$t{height});
$path_string .= _L($gap_end,$box_height);
$path_string .= _l($t{width} - $gap_end - $t{corner_radius}, 0);
$path_string .= _a($t{corner_radius}, $t{corner_radius}, 0, 0, 0, $t{corner_radius}, -$t{corner_radius});
$path_string .= _l(0, -($box_height - 2*$t{corner_radius}));
$path_string .= _a($t{corner_radius}, $t{corner_radius}, 0, 0, 0, -$t{corner_radius}, -$t{corner_radius});
$path_string .= _l(-($t{width} - 2*$t{corner_radius}),0);
$path_string .= _a($t{corner_radius}, $t{corner_radius}, 0, 0, 0, -$t{corner_radius}, $t{corner_radius});
$path_string .= _l(0, ($box_height - 2*$t{corner_radius}));
$path_string .= _a($t{corner_radius}, $t{corner_radius}, 0, 0, 0, $t{corner_radius}, $t{corner_radius});
$path_string .= " Z";
my $path = $scaler->path(d => $path_string, stroke => 'black', fill => 'white', 'stroke-width' => $t{'stroke-width'});
my $content_container = $scaler->g(transform => "translate($t{margin},$t{margin})");
my $obj = $content_container->foreignObject(width => ($t{width} - 2*$t{margin}), height => $box_height - 2*$t{margin});
basic_popup($obj, $t{name}, $t{description}, $t{link}, $t{'font-size'});
return $scaler;
}
sub _M { " M " . join(",", @_); }
sub _L { " L " . join(",", @_); }
sub _l { " l " . join(",", @_); }
sub _a { " a $_[0],$_[1] $_[2] $_[3] $_[4] $_[5],$_[6]"; }
# Split this out
sub basic_popup($obj, $name, $description, $link, $font_size)
{
my $div = $obj->tag('div', style => "font-size: $font_size;", xmlns => "http://www.w3.org/1999/xhtml");
$div->tag('h3', style => 'margin-top: 0; margin-left: 0;')->tag('a', href => $link)->cdata($name);
foreach (split /\n/, $description)
{
/^\s*$/
? $div->tag('br')->cdata
: $div->tag('span')->cdata($_);
}
}
1;