#---------------------------------------------------------------------------------------------- register_action_handlers ( 'Select next element' => ['000-Tab', \&select_next_element], 'Select previous element' => ['00S-ISO_Left_Tab', \&select_previous_element], 'Select all elements' => ['C00-a', \&select_all_elements], 'Delete selected elements' => ['000-Delete', \&delete_selected_elements], 'Group selected elements' => ['C00-g', \&group_selected_elements], 'Ungroup selected elements' => ['C00-u', \&ungroup_selected_elements], 'Move selected elements to the front' => ['C00-f', \&move_selected_elements_to_front], 'Move selected elements to the back' => ['C00-b', \&move_selected_elements_to_back], 'Edit selected element' => ['000-Return', \&edit_selected_element], 'Move selected elements left' => ['000-Left', \&move_selection_left], 'Move selected elements right' => ['000-Right', \&move_selection_right], 'Move selected elements up' => ['000-Up', \&move_selection_up], 'Move selected elements down' => ['000-Down', \&move_selection_down], 'Change arrow direction' => ['000-d', \&change_arrow_direction], 'Flip arrow start and end' => ['000-f', \&flip_arrow_ends], ) ; #---------------------------------------------------------------------------------------------- sub edit_selected_element { my ($self) = @_ ; my @selected_elements = $self->get_selected_elements(1) ; if(@selected_elements == 1) { $self->create_undo_snapshot() ; $self->edit_element($selected_elements[0]) ; $self->update_display(); } } #---------------------------------------------------------------------------------------------- sub change_arrow_direction { my ($self) = @_ ; my @elements_to_redirect = grep {ref $_ eq 'App::Asciio::stripes::section_wirl_arrow'} $self->get_selected_elements(1) ; if(@elements_to_redirect) { $self->create_undo_snapshot() ; for (@elements_to_redirect) { $_->change_section_direction($self->{MOUSE_X} - $_->{X}, $self->{MOUSE_Y} - $_->{Y}) ; } $self->update_display() ; } } #---------------------------------------------------------------------------------------------- sub flip_arrow_ends { my ($self) = @_ ; my @elements_to_flip = grep { my @connectors = $_->get_connector_points() ; ref $_ eq 'App::Asciio::stripes::section_wirl_arrow' && $_->get_number_of_sections() == 1 && @connectors > 0 ; } $self->get_selected_elements(1) ; if(@elements_to_flip) { $self->create_undo_snapshot() ; my %reverse_direction = ( 'up', => 'down', 'right' => 'left', 'down' => 'up', 'left' => 'right' ) ; for (@elements_to_flip) { # create one with ends swapped my $new_direction = $_->get_section_direction(0) ; if($new_direction =~ /(.*)-(.*)/) { my ($start_direction, $end_direction) = ($1, $2) ; $new_direction = $reverse_direction{$end_direction} . '-' . $reverse_direction{$start_direction} ; } else { $new_direction = $reverse_direction{$new_direction} ; } my ($start_connector, $end_connector) = $_->get_connector_points() ; my $arrow = new App::Asciio::stripes::section_wirl_arrow ({ %{$_}, POINTS => [ [ - $end_connector->{X}, - $end_connector->{Y}, $new_direction, ] ], DIRECTION => $new_direction, }) ; #add new element, connects automatically $self->add_element_at($arrow, $_->{X} + $end_connector->{X}, $_->{Y} + $end_connector->{Y}) ; # remove element $self->delete_elements($_) ; # keep the element selected $self->select_elements(1, $arrow) ; } $self->update_display() ; } } #---------------------------------------------------------------------------------------------- sub select_next_element { my ($self) = @_ ; return unless exists $self->{ELEMENTS}[0] ; $self->create_undo_snapshot() ; my @selected_elements = $self->get_selected_elements(1) ; if(@selected_elements) { my $last_selected_element = $selected_elements[-1] ; my ($seen_selected, $next_element) ; for my $element (@{$self->{ELEMENTS}}) { if(! $self->is_element_selected($element) && $seen_selected) { $next_element = $element ; last ; } $seen_selected =$element == $last_selected_element ; } $self->select_elements(0, @{$self->{ELEMENTS}}) ; if($next_element) { $self->select_elements(1, $next_element) ; } else { $self->select_elements(1, $self->{ELEMENTS}[0]); } } else { $self->select_elements(1, $self->{ELEMENTS}[0]); } $self->update_display() ; } #---------------------------------------------------------------------------------------------- sub select_previous_element { my ($self) = @_ ; return unless exists $self->{ELEMENTS}[0] ; $self->create_undo_snapshot() ; my @selected_elements = $self->get_selected_elements(1) ; if(@selected_elements) { my $last_selected_element = $selected_elements[0] ; my ($seen_selected, $next_element) ; for my $element (reverse @{$self->{ELEMENTS}}) { if(! $self->is_element_selected($element) && $seen_selected) { $next_element = $element ; last ; } $seen_selected =$element == $last_selected_element ; } $self->select_elements(0, @{$self->{ELEMENTS}}) ; if(defined $next_element) { $self->select_elements(1, $next_element) ; } else { $self->select_elements(1, $self->{ELEMENTS}[-1]); } } else { $self->select_elements(1, $self->{ELEMENTS}[-1]); } $self->update_display() ; } #---------------------------------------------------------------------------------------------- sub select_all_elements { my ($self) = @_ ; $self->select_elements(1, @{$self->{ELEMENTS}}) ; $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub delete_selected_elements { my ($self) = @_ ; $self->create_undo_snapshot() ; $self->delete_elements($self->get_selected_elements(1)) ; $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub move_selection_left { my ($self, $offset) = @_ ; $offset = 1 unless defined $offset ; $self->create_undo_snapshot() ; $self->move_elements(-$offset, 0, $self->get_selected_elements(1)) ; $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub move_selection_right { my ($self, $offset) = @_ ; $offset = 1 unless defined $offset ; $self->create_undo_snapshot() ; $self->move_elements($offset, 0, $self->get_selected_elements(1)) ; $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub move_selection_up { my ($self, $offset) = @_ ; $offset = 1 unless defined $offset ; $self->create_undo_snapshot() ; $self->move_elements(0, -$offset, $self->get_selected_elements(1)) ; $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub move_selection_down { my ($self, $offset) = @_ ; $offset = 1 unless defined $offset ; $self->create_undo_snapshot() ; $self->move_elements(0, $offset, $self->get_selected_elements(1)) ; $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub group_selected_elements { my ($self) = @_ ; my @selected_elements = $self->get_selected_elements(1) ; if(@selected_elements >= 2) { $self->create_undo_snapshot() ; my $group = {'GROUP_COLOR' => $self->get_group_color()} ; for my $element (@selected_elements) { push @{$element->{'GROUP'}}, $group ; } } $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub ungroup_selected_elements { my ($self) = @_ ; my @selected_elements = $self->get_selected_elements(1) ; for my $grouped (grep {exists $_->{GROUP} } @selected_elements) { pop @{$grouped->{GROUP}} ; } $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub move_selected_elements_to_front { my ($self) = @_ ; my @selected_elements = $self->get_selected_elements(1) ; if(@selected_elements) { $self->create_undo_snapshot() ; $self->move_elements_to_front(@selected_elements) ; } $self->update_display() ; } ; #---------------------------------------------------------------------------------------------- sub move_selected_elements_to_back { my ($self) = @_ ; my @selected_elements = $self->get_selected_elements(1) ; if(@selected_elements) { $self->create_undo_snapshot() ; $self->move_elements_to_back(@selected_elements) ; } $self->update_display() ; } ;