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;