App::Guiio::setup::hooks::canonize_connections |
sub canonize_connections { my ($connections) = @_ ;
for my $connection (@{$connections})
{
if
(
ref $connection->{CONNECTED} eq 'App::Guiio::stripes::section_wirl_arrow'
&& $connection->{CONNECTED}->is_autoconnect_enabled()
)
{
reconnect_section_wirl_arrow($connection)
;
}
}
}
sub reconnect_section_wirl_arrow { my ($connection) = @_ ;
my ($connected, $connectee) = ($connection->{CONNECTED}, $connection->{CONNECTEE}) ;
my @connectors = $connected->get_all_points()
;
my ($start_name, $end_name) = ($connectors[0]{NAME}, $connectors[-1]{NAME}) ;
if($connection->{CONNECTOR}{NAME} eq $end_name) | |
{ | |
# end connector | |
my ($connectee_x, $connectee_y, $connectee_width, $connectee_hight) = | |
($connectee->{X}, $connectee->{Y}, $connectee->get_size()) ; |
my $connected_x = $connected->{X} + $connectors[-2]{X}; my $connected_y = $connected->{Y} + $connectors[-2]{Y}; if($connected_x < $connectee_x) { # arrow starts on left of the box if($connected->get_section_direction(-1) =~ /^right/) { if($connected_y < $connectee_y) { reconnect($connection, 'top_center', $end_name) ; } else { if($connected_y < $connectee_y + $connectee_hight) { reconnect($connection, 'left_center', $end_name) ; } else { # arrow below, right-up to bottom_center reconnect($connection, 'bottom_center', $end_name) ; } } } else { # arrow going up or down reconnect($connection, 'left_center', $end_name) ; } } elsif($connected_x < $connectee_x + $connectee_width) { # arrow starts within width of the box if($connected_y < $connectee_y) { #arrow above, right-down to top_center reconnect($connection, 'top_center', $end_name, 'right') ; } else { reconnect($connection, 'bottom_center', $end_name) ; } } else { # arrow starts on right of the box if($connected->get_section_direction(-1) =~ /^left/) { if($connected_y < $connectee_y) { reconnect($connection, 'top_center', $end_name) ; } else { if($connected_y < $connectee_y + $connectee_hight) { reconnect($connection, 'right_center', $end_name) ; } else { reconnect($connection, 'bottom_center', $end_name) ; } } } else { # arrow going up or down reconnect($connection, 'right_center', $end_name) ; } } } else { # start connector my ($connectee_x, $connectee_y, $connectee_width, $connectee_hight) = ($connectee->{X}, $connectee->{Y}, $connectee->get_size()) ;
my $end_connector_x = $connected->{X} + $connectors[1]{X}; my $end_connector_y = $connected->{Y} + $connectors[1]{Y} ;
if($end_connector_x < $connectee_x) { # arrow ends on left of the box if($connected->get_section_direction(0) !~ /^left/) { if($end_connector_y < $connectee_y) { reconnect($connection, 'top_center', $start_name) ; } else { if($end_connector_y < $connectee_y + $connectee_hight) { reconnect($connection, 'left_center', $start_name) ; } else { reconnect($connection, 'bottom_center', $start_name) ; } } } else { reconnect($connection, 'left_center', $start_name) ; } } elsif($end_connector_x < $connectee_x + $connectee_width) { # arrow starts within width of the box if($end_connector_y < $connectee_y) { reconnect($connection, 'top_center', $start_name) ; } else { reconnect($connection, 'bottom_center', $start_name) ; } } else { # arrow ends on right of the box if($connected->get_section_direction(0) !~ /^right/) { if($end_connector_y < $connectee_y) { reconnect($connection, 'top_center', $start_name) ; } else { if($end_connector_y < $connectee_y + $connectee_hight) { reconnect($connection, 'right_center', $start_name) ; } else { reconnect($connection, 'bottom_center', $start_name) ; } } } else { reconnect($connection, 'right_center', $start_name) ; } } } }
sub reconnect { my($guiio_connection, $connection_name, $connector_name, $hint) = @_ ;
if($guiio_connection->{CONNECTION}{NAME} ne $connection_name) | |
{ | |
my ($connected, $connectee) = ($guiio_connection->{CONNECTED}, $guiio_connection->{CONNECTEE}) ; |
my ($connection) = $connectee->get_named_connection($connection_name) ; my ($connector) = $connected->get_named_connection($connector_name) ;
my $x_offset_to_connection = ($connectee->{X} + $connection->{X}) - ($connected->{X} + $connector->{X}) ; my $y_offset_to_connection = ($connectee->{Y} + $connection->{Y}) - ($connected->{Y} + $connector->{Y}) ;
# move connector #~ print "reconnect: $connection_name $connector_name\n" ; my ($x_offset, $y_offset, $width, $height, $new_connector) = $connected->move_connector($connector_name, $x_offset_to_connection, $y_offset_to_connection, $hint) ; $connected->{X} += $x_offset ; $connected->{Y} += $y_offset ; $guiio_connection->{CONNECTOR} = $new_connector ; $guiio_connection->{CONNECTION} = $connection ; } }
App::Guiio::setup::hooks::canonize_connections |