From 2b0171dd1edd1416bee39df2edc6b91fffee5529 Mon Sep 17 00:00:00 2001 From: Nadim Khemir Date: Tue, 7 Nov 2023 10:33:02 +0100 Subject: [PATCH] ADDED: bindings help --- Todo.txt | 7 +- documentation/mdbook_asciio/src/Bindings.md | 16 + .../mdbook_asciio/src/bindings_help.gif | Bin 0 -> 75670 bytes group_bindings.md | 378 +++++++++++++ lib/App/Asciio.pm | 3 + lib/App/Asciio/Actions.pm | 84 ++- lib/App/Asciio/GTK/Asciio.pm | 50 +- lib/App/Asciio/Setup.pm | 44 +- lib/App/Asciio/ZBuffer.pm | 28 + setup/Text/asciio_object/basic.pl | 1 + setup/actions/default_bindings.pl | 497 +++++++++++------- setup/asciio_object/basic.pl | 3 + 12 files changed, 904 insertions(+), 207 deletions(-) create mode 100644 documentation/mdbook_asciio/src/bindings_help.gif create mode 100644 group_bindings.md diff --git a/Todo.txt b/Todo.txt index b67ad66c..ca6ce2c2 100644 --- a/Todo.txt +++ b/Todo.txt @@ -1,6 +1,9 @@ -run script from asciio - insert boxes, ... +bindings overlay + on off + for top level + except movements + with movements constraints alignement diff --git a/documentation/mdbook_asciio/src/Bindings.md b/documentation/mdbook_asciio/src/Bindings.md index 9ae46996..dfae86ec 100644 --- a/documentation/mdbook_asciio/src/Bindings.md +++ b/documentation/mdbook_asciio/src/Bindings.md @@ -9,5 +9,21 @@ accessed with shortcuts that start with the same letter. The bindings can be changed in your user configuration, See configuration/user_bindings +# Bindings help + +***Binding:*** zb + +![bindings_help](bindings_help.gif) + +You can get a pop up showing the bindings (*?* in the top level) Or you can configure it: + +``` +USE_BINDINGS_COMPLETION => 1, +``` + +## Bindings map + +*bindings change truth is in the config not this snapshot* + ![bindings](asciio_bindings.png) diff --git a/documentation/mdbook_asciio/src/bindings_help.gif b/documentation/mdbook_asciio/src/bindings_help.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d1c4ed962055efa0126d0181bc385837bd72b9b GIT binary patch literal 75670 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
k|~S6X>&`H$xa^A{b&P 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 literal 0 HcmV?d00001 diff --git a/group_bindings.md b/group_bindings.md new file mode 100644 index 00000000..c2c9e244 --- /dev/null +++ b/group_bindings.md @@ -0,0 +1,378 @@ +Help +Add help box +Display keyboard mapping +Display commands +Display action files +Display man page +Open +Save +SaveAs +Insert +Quit +Quit no save + + +Add box +Add shrink box +Add text +Add arrow +Add angled arrow +Add connector +Add connector type2 +Add if +Add process +Add rhombus +Add ellipse +Add ascii line +Add ascii no-connectline +Add multiple texts +Add multiple boxes +use group unicode +use group box +use group ruler + + + +commands +Insert +align +arrow +movearrowends +clone +grouping +display +git +slides +stripes +debug +Clipboard +Insertfromclipboard +elementaction +Delete + + +| commands | 00S-colon | | | + +| Insert | 000-i | | | +| | use groupe type | **000-t | | +| | use groupe line | **000-l | | +| | use group unicode | 000-u | | +| | | **use group unicode line | 000-l | +| | use group box | 000-u | | +| | use group ruler | 000-r | | + +| align | 00S-A | | | +| arrow | 000-a | | | +| move arrow ends | 0A0-a | | | +| clone | 000-c | | | +| grouping | 000-g | | | +| display | 000-z | | | +| git | 00S-G | | | + +| slides | 00S-S | | | +| stripes | 0A0-g | | | +| debug | 00S-D | | | + +| **Clipboard | 000-y | | | +| **Insert from clipboard | 000-p, | | | + +| **element action | 000-e | | | +| **Delete | 000-d | | | + + +| leader | | | | +| ------------------------ | --------- | --- | - | +| commands | 00S-colon | | | +| | Help | 000-h | | +| | Add help box | 00S-H | | +| | Display keyboard mapping | 000-k | | +| | Display commands | 000-c | | +| | Display action files | 000-f | | +| | Display manpage | 000-m | | +| | Open | 000-e | | +| | Save | 000-w | | +| | SaveAs | 00S-W | | +| | Insert | 000-r | | +| | Quit | 000-q | | +| | Quit no save | 00S-Q | | + +| Insert | 000-i | | | +| | Add box | 000-b | | +| | Add shrink box | 00S-B | | +| | Add text | 000-t | | +| | Add arrow | 000-a | | +| | Add angled arrow | 00S-A | | +| | Add connector | 000-c | | +| | Add connector type 2 | 00S-C | | +| | Add if | 000-i | iti | +| | Add process | 000-p | itp | +| | Add rhombus | 0A0-r | itr | +| | Add ellipse | 000-e | ite | +| | **** Add triangle | **** | itt | +| | Add ascii line | 000-l | ill | +| | Add ascii no-connect line | 000-k | iln | +| | Add multiple texts | C00-t | imt | +| | Add multiple boxes | C00-b | imb | + +| | use group unicode | 000-u | | +| | | Add unicode box | 000-b | +| | | Add unicode arrow | 000-a | +| | | Add unicode angled arrow | 00S-A | + +| | ? sub group in unicode | Add unicode line | 000-l | +| | | Add unicode bold line | 00S-L | +| | | Add unicode double line | 0A0-l | +| | | Add unicode no-connect line | 000-k | +| | | Add unicode no-connect bold line | 00S-K | +| | | Add unicode no-connect double line | 0A0-K | + +| | use group box | 000-u | | +| | | Add exec box | C00-e | +| | | Add exec box verbatim | C00-v | +| | | Add exec box verbatim once | C00-o | +| | | Add line numbered box | C00-l | + +| | use group ruler | 000-r | | +| | | Add vertical ruler | 000-v | +| | | Add horizontal ruler | 000-h | +| | | delete rulers | 000-d | + +| align | 00S-A | | | +| | Align top | 000-ta | | +| | Align left | 000-la | | +| | Align bottom | 000-ba | | +| | Align right | 000-ra | | +| | Align vertically | 000-va | | +| | Align horizontally | 000-ha | | + +| arrow | 000-a | | | +| | Change arrow direction | 000-d | | +| | Flip arrow start and end | 000-f | | +| | Append multi_wirl section | 000-s | | +| | Insert multi_wirl section | 00S-S | | +| | Prepend multi_wirl section | 0A0-s | | +| | Remove last section from multi_wirl | C00-s | | +| | start no disconnect | C00-d | | +| | end no disconnect | C0S-D | | + +| display | 000-z | | | +| | Change elements foreground color | 000-c | | +| | Change elements background color | 00S-C | | +| | Change Asciio background color | 0A0-c | | +| | Change grid color | 0AS-C | | +| | Flip color scheme | 000-s | | +| | Flip transparent element background | 000-t | | +| | Flip grid display | 000-g | | +| | Flip hint lines | 000-h | | +| | Change font | 000-f | | +| | Edit inline | 000-i | | +| | show/hide connectors | 000-v | | +| | flip cross mode | 000-x | * zx | +| | Zoom in | 000-plus, C00-j, C00-scroll-up | * z+ | +| | Zoom out | 000-minus, C00-h, C00-scroll-down | * z- | + +| clone | 000-c | | | +| | clone escape | 000-Escape, | | +| | clone motion | 000-motion_notify | | +| | clone insert | 000-button-press-1 | | +| | clone insert2 | 000-Return, | | +| | clone arrow | 000-a, | | +| | clone angled arrow | 00S-A, | | +| | clone box | 000-b, | | +| | clone text | 000-t, | | +| | clone flip hint lines | 000-h, | | +| | //clone left | 00-Left, | | +| | //clone right | 00-Right, | | +| | //clone up | 00-Up, | | +| | //clone down | 00-Down, | | +| | //clone emulation left | 00-Left, | | +| | //clone emulation right | 00-Right, | | +| | //clone emulation up | 00-Up, | | +| | //clone emulation down | 00-Down, | | + +| debug | 00S-D | | | +| | Display undo stack statistics | 000-u | | +| | Dump self | 000-s | | +| | Dump all elements | 000-e | | +| | Dump selected elements | 000-E | | +| | Display numbered objects | 000-t | | +| | Test | 000-o | | +| | ZBuffer Test | 000-z | | + +| git | 00S-G | | | +| | Quick git | 000-button-press-3, 000-g], | | +| | Git add box | 000-b, | | +| | Git add text | 000-t, | | +| | Git add arrow | 000-a, | | +| | Git edit selected element | 000-2button-press-1, 000-Return | | +| | Git mouse left-click | 000-button-press-1, | | +| | Git change arrow direction | 000-d, | | +| | Git undo | 000-u, | | +| | Git delete elements | 000-Delete, 000-x], | | +| | Git mouse motion | 000-motion_notify, | | +| | Git move elements left | 000-Left, | | +| | Git move elements right | 000-Right, | | +| | Git move elements up | 000-Up, | | +| | Git move elements down | 000-Down, | | +| | Git mouse right-click | 0A0-button-press-3, | | +| | Git flip hint lines | 000-h, | | + +| grouping | 000-g | | | +| | Group selected elements | 000-g | | +| | Ungroup selected elements | 000-u | | +| | Move selected elements to the front | 000-f | | +| | Move selected elements to the back | 000-b | | +| | Temporary move to the front | 00S-F | | + +| move arrow ends | 0A0-a | | | +| | arrow start up | 000-Up, | | +| | arrow start down | 000-Down, | | +| | arrow start right | 000-Right | | +| | arrow start left | 000-Left, | | +| | arrow start up2 | 000-k, | | +| | arrow start down2 | 000-j, | | +| | arrow start right2 | 000-l, | | +| | arrow start left2 | 000-h, | | +| | arrow end up | 00S-Up, | | +| | arrow end down | 00S-Down, | | +| | arrow end right | 00S-Right | | +| | arrow end left | 00S-Left, | | +| | arrow end up2 | 00S-K, | | +| | arrow end down2 | 00S-J, | | +| | arrow end right2 | 00S-L, | | +| | arrow end left2 | 00S-H, | | + +| slides | 00S-S | | | +| | Load slides | 000-l | | +| | previous slide | 00S-N | | +| | next slide | 000-n | | +| | first slide | 000-g | | +| | show previous message | 000-m | | +| | show next message | 00S-M | | + +| stripes | 0A0-g | | | +| | create stripes group | 000-g | | +| | create one stripe group | 000-1 | | +| | ungroup stripes group | 000-u | | + +| -------------------------------- | --------------------------------- | -------------- | | +| clipboard | | | | +| --------------------------------------- | --------------------------------- | -------------- | | +| Copy to clipboard | C00-c, C00-Insert, y | yy | | +| Export to clipboard & primary as ascii | C00-e, 00S-Y, Y], | ya | | +| Export to clipboard & primary as markup | C0S-E, | ym | | +| Insert from clipboard | C00-v, 00S-Insert, p | pp | | +| Import from primary to box | C0S-V, 00S-P, P | ?? | | +| Import from primary to text | 0A0-p,A-P], | pcp | | +| Import from clipboard to box | 0AS-E , | | | +| Import from clipboard to text | 0AS-T , | | | + +| -------------------------------- | --------------------------------- | -------------- | | +| selection | | | | +| -------------------------------- | --------------------------------- | -------------- | | +| Deselect all elements | 000-Escape, | | | +| Select next element | 000-Tab, 000-n, | | | +| Select previous element | 00S-ISO_Left_Tab, 00S-N | | | +| Select next non arrow | C00-Tab, C00-n, | | | +| Select previous non arrow | C0S-ISO_Left_Tab, C0S-N | | | +| Select next arrow | CA0-Tab, C00-m, | | | +| Select previous arrow | CAS-ISO_Left_Tab, C0S-M | | | +| Select element by id | 0A0-Tab, | | | +| Select all elements | C00-a, 00S-V | | | +| Select connected elements | 000-v, | | | +| Select elements by word | C00-f, | | | +| Select elements by word no group | C0S-F, | | | + +| -------------------------------- | --------------------------------- | -------------- | | +| movement | | | | +| ---------------------------------- | --------------------------------- | -------------- | | +| Move selected elements left | 000-Left, | | | +| Move selected elements right | 000-Right, | | | +| Move selected elements up | 000-Up, | | | +| Move selected elements down | 000-Down, | | | +| | | | | +| Move selected elements left quick | 0A0-Left, | | | +| Move selected elements right quick | 0A0-Right, | | | +| Move selected elements up quick | 0A0-Up, | | | +| Move selected elements down quick | 0A0-Down, | | | +| | | | | +| Move selected elements left 2 | 000-h, h | | | +| Move selected elements right 2 | 000-l, l | | | +| Move selected elements up 2 | 000-k, k | | | +| Move selected elements down 2 | 000-j, j | | | + +| ---------------------------- | --------------------------------- | -------------- | | +| element modification | | | | +| ---------------------------- | --------------------------------- | -------------- | | +| Shrink box | 000-s | es | | +| | | | | +| Make element narrower | 000-1 | en | | +| Make element taller | 000-2 | et | | +| Make element shorter | 000-3 | es | | +| Make element wider | 000-4 | ew | | +| | | | | +| Make elements Unicode | C00-u | eu | | +| Make elements not Unicode | C0S-U | eU | | +| | | | | +| Delete selected elements | 000-Delete 000-d] | dd | | +| | | | | +| Edit selected element | 000-2button-press-1, 000-Return | ee | | +| Edit selected element inline | C00-2button-press-1, C00-Return | eE | | + +| -------------------------------- | --------------------------------- | -------------- | | +| mouse | | | | +| --------------------------- | --------------------------------- | -------------- | | +| Mouse right-click | 000-button-press-3 | | | +| | | | | +| Mouse left-click | 000-button-press-1 | | | +| Mouse expand selection | 00S-button-press-1 | | | +| Mouse selection flip | C00-button-press-1 | | | +| | | | | +| Mouse quick link | [0A0-button-press-1, 000-period | | | +| Mouse duplicate elements | 0AS-button-press-1, 000-comma | | | +| Mouse quick box | C0S-button-press-1 | | | +| | | | | +| Arrow to mouse | CA0-motion_notify | | | +| Arrow mouse change directio | CA0-2button-press-1 | | | +| Arrow change direction | CA0-d | | | +| Wirl arrow add section | CA0-button-press-1 | | | +| Wirl arrow insert flex poin | CA0-button-press-2 | | | +| | | | | +| Mouse motion | 000-motion_notify | | | +| Mouse motion 2 | 0AS-motion_notify | | | +| Mouse drag canvas | C00-motion_notify | | | +| Mouse on element id | 000-m | | | + +| -------------------------------- | --------------------------------- | -------------- | | +| mouse emulation | | | | +| -------------------------------- | --------------------------------- | -------------- | | +| Mouse emulation toggle | 000-apostrophe | | | +| | | | | +| Mouse emulation left-click | 000-odiaeresis | | | +| Mouse emulation expand selection | 00S-Odiaeresis | | | +| Mouse emulation selection flip | C00-odiaeresis | | | +| | | | | +| Mouse emulation right-click | 000-adiaeresis | | | +| | | | | +| Mouse emulation move left | C00-Left | | | +| Mouse emulation move right | C00-Right | | | +| Mouse emulation move up | C00-Up | | | +| Mouse emulation move down | C00-Down | | | +| | | | | +| Mouse emulation drag left | 00S-Left | | | +| Mouse emulation drag right | 00S-Right | | | +| Mouse emulation drag up | 00S-Up | | | +| Mouse emulation drag down | 00S-Down | | - | + + +| context menues | +| ------------------------- | +| Asciio context_menu | +| Box context_menu | +| Multi_wirl context_menu | +| Angled arrow context_menu | +| Ruler context_menu | +| Shapes context_menu | +| Undo | +| Redo | + diff --git a/lib/App/Asciio.pm b/lib/App/Asciio.pm index 875df319..d4b0ea81 100644 --- a/lib/App/Asciio.pm +++ b/lib/App/Asciio.pm @@ -800,6 +800,9 @@ my $modifiers = $event->{MODIFIERS} ; if($self->{PREVIOUS_X} != $x || $self->{PREVIOUS_Y} != $y) { + delete $self->{BINDINGS_COMPLETION} ; + $self->update_display ; + if($self->exists_action("${modifiers}motion_notify")) { $self->run_actions(["${modifiers}motion_notify", $event]) ; diff --git a/lib/App/Asciio/Actions.pm b/lib/App/Asciio/Actions.pm index 18438ee6..713f4270 100644 --- a/lib/App/Asciio/Actions.pm +++ b/lib/App/Asciio/Actions.pm @@ -1,6 +1,10 @@ package App::Asciio ; + +use strict ; use warnings ; + use Encode ; +use List::Util qw(max) ; #------------------------------------------------------------------------------------------------------ @@ -17,6 +21,65 @@ $self->run_actions($action) ; $self->{CROSS_ACTION_GROUP}++ ; } +sub create_binding_completions +{ +my ($self, $keep_visible) = @_ ; + +if($self->{USE_BINDINGS_COMPLETION}) + { + my $binding_max_length = + max map { length } + grep { + $_ ne 'IS_GROUP' + && $_ ne 'ENTER_GROUP' + && $_ ne 'ESCAPE_KEY' + && $_ ne 'NAME' + && $_ ne 'SHORTCUTS' + && $_ ne 'ORIGIN' + && $_ ne 'CODE' + } + keys $self->{CURRENT_ACTIONS}->%* ; + + my $max_length = 0 ; + + $self->{BINDINGS_COMPLETION} = + [ + map + { + my $completion = sprintf("%-${binding_max_length}s - %s", $_, $self->{CURRENT_ACTIONS}{$_}{NAME}) ; + my $length = length $completion ; + + $max_length = $length if $length > $max_length ; + $completion ; + } + sort grep { + $_ ne 'IS_GROUP' + && $_ ne 'ENTER_GROUP' + && $_ ne 'ESCAPE_KEY' + && $_ ne 'NAME' + && $_ ne 'SHORTCUTS' + && $_ ne 'ORIGIN' + && $_ ne 'CODE' + } + keys $self->{CURRENT_ACTIONS}->%* + ] ; + + $self->{BINDINGS_COMPLETION_LENGTH} = $max_length ; + + $self->update_display() ; + } +else + { + if(exists $self->{BINDINGS_COMPLETION}) + { + delete $self->{BINDINGS_COMPLETION} ; + $self->update_display() ; + } + } + +$_[0]->{KEEP_BINDINGS_COMPLETION}++ if $keep_visible ; +} + #------------------------------------------------------------------------------------------------------ sub run_actions @@ -92,9 +155,26 @@ for my $action (@actions) ] ; } - $self->{CURRENT_ACTIONS} = $self->{ACTIONS} unless $is_group || $in_capture || $self->{CROSS_ACTION_GROUP} ; + $is_group += $self->{CROSS_ACTION_GROUP} // 0 ; delete $self->{CROSS_ACTION_GROUP} ; + $self->{CURRENT_ACTIONS} = $self->{ACTIONS} unless $is_group || $in_capture ; + + if ($is_group) + { + $self->create_binding_completions() ; + } + else + { + unless ($self->{KEEP_BINDINGS_COMPLETION}) + { + delete $self->{BINDINGS_COMPLETION} ; + $self->update_display() ; + } + + delete $self->{KEEP_BINDINGS_COMPLETION} ; + } + if($is_group && defined $self->{CURRENT_ACTIONS}{ENTER_GROUP}) { $self->{CURRENT_ACTIONS}{ENTER_GROUP}->($self) ; @@ -131,9 +211,11 @@ for my $action (@actions) { $self->{ACTION_VERBOSE}->(sprintf "\e[31m%-30s\e[m", "$action") if $self->{ACTION_VERBOSE} ; $self->{CURRENT_ACTIONS} = $self->{ACTIONS} ; + } $self->update_display() ; + delete $self->{BINDINGS_COMPLETION} ; } } diff --git a/lib/App/Asciio/GTK/Asciio.pm b/lib/App/Asciio/GTK/Asciio.pm index 8822ae31..3a94134a 100644 --- a/lib/App/Asciio/GTK/Asciio.pm +++ b/lib/App/Asciio/GTK/Asciio.pm @@ -12,7 +12,7 @@ use Glib ':constants'; use Gtk3 -init; use Pango ; -use List::MoreUtils qw(all) ; +use List::Util qw(min) ; use App::Asciio::GTK::Asciio::stripes::editable_exec_box; use App::Asciio::GTK::Asciio::stripes::editable_box2; @@ -477,11 +477,59 @@ if($self->{DRAW_HINT_LINES}) $gc->stroke() ; } +$self->display_bindings_completion($gc, $character_width, $character_height) ; + return TRUE; } #----------------------------------------------------------------------------- +sub display_bindings_completion +{ +my ($self, $gc, $character_width, $character_height) = @_ ; + +if ($self->{USE_BINDINGS_COMPLETION} && defined $self->{BINDINGS_COMPLETION}) + { + $gc->set_source_rgb(@{$self->get_color('hint_background')}) ; + + my ($width, $height) = ($self->{BINDINGS_COMPLETION_LENGTH} * $character_width, $character_height * $self->{BINDINGS_COMPLETION}->@*) ; + + my ($window_width, $window_height) = $self->{root_window}->get_size() ; + + my $start_x ; + if ($window_width < (($self->{MOUSE_X} + 3) * $character_width) + $width) + { + $start_x = (($self->{MOUSE_X} - 3) * $character_width) - $width ; + } + else + { + $start_x = ($self->{MOUSE_X} + 3) * $character_width ; + } + + my $start_y = min($window_height - $height , ($self->{MOUSE_Y} + 1) * $character_height) ; + + $gc->rectangle($start_x, $start_y, $width, $height) ; + $gc->fill() ; + + my $surface = Cairo::ImageSurface->create('argb32', $width, $height) ; + my $gco = Cairo::Context->create($surface) ; + + my $layout = Pango::Cairo::create_layout($gco) ; + my $font_description = Pango::FontDescription->from_string($self->get_font_as_string()) ; + $layout->set_font_description($font_description) ; + + $layout->set_text(join "\n", $self->{BINDINGS_COMPLETION}->@*) ; + Pango::Cairo::show_layout($gco, $layout) ; + + $gc->set_source_surface($surface, $start_x, $start_y) ; + $gc->paint; + + $gc->stroke() ; + } +} + +#----------------------------------------------------------------------------- + sub draw_cross_overlays { my ($self, $gc, $widget_width, $widget_height, $character_width, $character_height) = @_ ; diff --git a/lib/App/Asciio/Setup.pm b/lib/App/Asciio/Setup.pm index fe24df51..437a0629 100644 --- a/lib/App/Asciio/Setup.pm +++ b/lib/App/Asciio/Setup.pm @@ -132,6 +132,8 @@ my $installed = find_installed('App::Asciio') ; my ($basename, $path, $ext) = File::Basename::fileparse($installed, ('\..*')) ; my $asciio_setup_path = $path . $basename . '/setup/' ; +my %first_level_group ; + for my $action_file (@{ $action_files }) { my $context = new Eval::Context() ; @@ -152,6 +154,7 @@ for my $action_file (@{ $action_files }) INSTALL_SUBS => { register_action_handlers => sub { %action_handlers = @_ ; }, register_action_handlers_remove_old_shortcuts => sub { %action_handlers = @_ ; $remove_old_shortcuts++ ; }, + register_first_level_group => sub { %first_level_group = (%first_level_group, @_) ; }, }, PRE_CODE => "use strict;\nuse warnings;\n", CODE_FROM_FILE => $location, @@ -265,6 +268,14 @@ for my $action_file (@{ $action_files }) } } } + +my $action_handler = $self->setup_first_level_group(\%first_level_group) ; +my $name = $action_handler->{SHORTCUTS}[0] ; + +if (defined $name) + { + $self->{ACTIONS}{$name} = $action_handler ; + } } #------------------------------------------------------------------------------------------------------ @@ -276,6 +287,7 @@ my $name = $action_handler->{NAME} ; if(exists $self->{ACTIONS_BY_NAME}{$name}) { + my $reused = '' ; print "\e[33mOverriding action: '$name', file: '$action_file', old_file: '" . ($self->{ACTIONS_BY_NAME}{ORIGINS}{$name}{ORIGIN} // 'unknown') ; my $old_handler = $self->{ACTIONS_BY_NAME}{$name} ; @@ -285,7 +297,6 @@ if(exists $self->{ACTIONS_BY_NAME}{$name}) die "\tno shortcuts in definition\n" ; } - my $reused = '' ; if(! defined $action_handler->{CODE} && defined $old_handler->{CODE}) { $reused .= ", reused code" ; @@ -316,6 +327,37 @@ if(exists $self->{ACTIONS_BY_NAME}{$name}) #------------------------------------------------------------------------------------------------------ +sub setup_first_level_group +{ +my ($self, $group_definition) = @_ ; + +my %handler ; + +for my $name ( grep { $_ ne 'SHORTCUT' } keys %{$group_definition} ) + { + die "Asciio: Group 'first_level' entry '$name' not defined\n" unless exists $self->{ACTIONS_BY_NAME}{$name} ; + my $handler = $self->{ACTIONS_BY_NAME}{$name} ; + + for my $shortcut ('ARRAY' eq ref $handler->{SHORTCUTS} ? $handler->{SHORTCUTS}->@* : $handler->{SHORTCUTS}) + { + $handler{$shortcut} = $handler + } + } + +@handler{'IS_GROUP', 'ENTER_GROUP', 'ESCAPE_KEY', 'SHORTCUTS', 'CODE', 'NAME', 'ORIGIN'} = + ( + 1, + $group_definition->{ENTER_GROUP}, + $group_definition->{ESCAPE_KEY}, + [ $group_definition->{SHORTCUT} ], + sub { $_[0]->{CURRENT_ACTIONS} = \%handler }, + 'first_level_group', + 'action_file' + ) ; + +return \%handler ; +} + sub get_group_action_handler { my ($self, $setup_path, $action_file, $group_name, $group_definition) = @_ ; diff --git a/lib/App/Asciio/ZBuffer.pm b/lib/App/Asciio/ZBuffer.pm index d34f7b5d..33704535 100644 --- a/lib/App/Asciio/ZBuffer.pm +++ b/lib/App/Asciio/ZBuffer.pm @@ -150,6 +150,34 @@ return ($x-1) .';'. ($y+1), $x .';'. ($y+1), ($x+1) .';'. ($y+1) } } +# ------------------------------------------------------------------------------ + +# sub get_cardinal_neighbors +# { +# my ($self, $coordinate) = @_ ; +# my ($x, $y) = split ';', $coordinate ; + +# return +# { +# map +# { +# exists $self->{coordinates}{$_} +# ? ( $self->{coordinates}{$_} ne ' ' ? ($_ => $self->{coordinates}{$_}) : undef) +# : undef +# } +# $x .';'. ($y-1), +# $x .';'. ($y+1), +# ($x+1) .';'. $y, +# ($x-1) .';'. $y, +# ($x+1) .';'. ($y-1), +# ($x+1) .';'. ($y+1), +# ($x-1) .';'. ($y+1), +# ($x-1) .';'. ($y-1) ; +# } +# } + + +# my ($up, $down, $left, $right, $char_45, $char_135, $char_225, $char_315) = $zbuffer->get_cardinal_neighbors() ; # ------------------------------------------------------------------------------ diff --git a/setup/Text/asciio_object/basic.pl b/setup/Text/asciio_object/basic.pl index 72913471..f584c6c5 100644 --- a/setup/Text/asciio_object/basic.pl +++ b/setup/Text/asciio_object/basic.pl @@ -9,6 +9,7 @@ }, TAB_AS_SPACES => ' ', +USE_BINDINGS_COMPLETION => 0, # use ANSI colors COLOR_SCHEMES => diff --git a/setup/actions/default_bindings.pl b/setup/actions/default_bindings.pl index 3b869b05..dc0832e9 100644 --- a/setup/actions/default_bindings.pl +++ b/setup/actions/default_bindings.pl @@ -1,4 +1,5 @@ +use App::Asciio::Actions ; use App::Asciio::Actions::Align ; use App::Asciio::Actions::Arrow ; use App::Asciio::Actions::Asciio ; @@ -24,116 +25,109 @@ register_action_handlers ( -'flip cross mode' => [ '000-x', sub { $_[0]->{USE_CROSS_MODE} ^= 1 ; $_[0]->update_display ; } ], - -'Undo' => [['C00-z', '000-u'], \&App::Asciio::Actions::Unsorted::undo ], -'Redo' => [['C00-y', 'C00-r'], \&App::Asciio::Actions::Unsorted::redo ], -'Zoom in' => [['000-plus', 'C00-j', 'C00-scroll-up'], \&App::Asciio::Actions::Unsorted::zoom, 1 ], -'Zoom out' => [['000-minus', 'C00-h', 'C00-scroll-down'],\&App::Asciio::Actions::Unsorted::zoom, -1 ], -'Copy to clipboard' => [['C00-c', 'C00-Insert', 'y'], \&App::Asciio::Actions::Clipboard::copy_to_clipboard ], -'Insert from clipboard' => [['C00-v', '00S-Insert', 'p'], \&App::Asciio::Actions::Clipboard::insert_from_clipboard ], -'Export to clipboard & primary as ascii' => [['C00-e', '00S-Y', 'Y'], \&App::Asciio::Actions::Clipboard::export_to_clipboard_as_ascii ], -'Export to clipboard & primary as markup'=> ['C0S-E', \&App::Asciio::Actions::Clipboard::export_to_clipboard_as_markup ], -'Import from primary to box' => [['C0S-V', '00S-P', 'P'], \&App::Asciio::Actions::Clipboard::import_from_primary_to_box ], -'Import from primary to text' => [['0A0-p','A-P'], \&App::Asciio::Actions::Clipboard::import_from_primary_to_text ], -'Import from clipboard to box' => [ '0AS-E' , \&App::Asciio::Actions::Clipboard::import_from_clipboard_to_box ], -'Import from clipboard to text' => [ '0AS-T' , \&App::Asciio::Actions::Clipboard::import_from_clipboard_to_text ], - -'Select next element' => [['000-Tab', '000-n'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [1, 0, 0] ], -'Select previous element' => [['00S-ISO_Left_Tab', '00S-N'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [0, 0, 0] ], -'Select next non arrow' => [['C00-Tab', 'C00-n'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [1, 0, 1] ], -'Select previous non arrow' => [['C0S-ISO_Left_Tab', 'C0S-N'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [0, 0, 1] ], -'Select next arrow' => [['CA0-Tab', 'C00-m'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [1, 0, 2] ], -'Select previous arrow' => [['CAS-ISO_Left_Tab', 'C0S-M'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [0, 0, 2] ], - -'Select element by id' => ['0A0-Tab', \&App::Asciio::Actions::ElementsManipulation::select_element_by_id ], - -'Select all elements' => [['C00-a', '00S-V'], \&App::Asciio::Actions::ElementsManipulation::select_all_elements ], -'Deselect all elements' => ['000-Escape', \&App::Asciio::Actions::ElementsManipulation::deselect_all_elements ], -'Select connected elements' => ['000-v', \&App::Asciio::Actions::ElementsManipulation::select_connected ], -'Select elements by word' => ['C00-f', \&App::Asciio::Actions::ElementsManipulation::select_all_elements_by_words ], -'Select elements by word no group' => ['C0S-F', \&App::Asciio::Actions::ElementsManipulation::select_all_elements_by_words_no_group ], - -'Delete selected elements' => [['000-Delete', '000-d'], \&App::Asciio::Actions::ElementsManipulation::delete_selected_elements ], - -'Edit selected element' => [['000-2button-press-1','000-Return'], \&App::Asciio::Actions::ElementsManipulation::edit_selected_element, 0 ], -'Edit selected element inline' => [['C00-2button-press-1','C00-Return'], \&App::Asciio::Actions::ElementsManipulation::edit_selected_element, 1 ], - -'Move selected elements left' => ['000-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], -'Move selected elements right' => ['000-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], -'Move selected elements up' => ['000-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], -'Move selected elements down' => ['000-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], - -'Move selected elements left quick' => ['0A0-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left, 10 ], -'Move selected elements right quick' => ['0A0-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right, 10 ], -'Move selected elements up quick' => ['0A0-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up, 10 ], -'Move selected elements down quick' => ['0A0-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down, 10 ], - -'Move selected elements left 2' => [['000-h', 'h'], \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], -'Move selected elements right 2' => [['000-l', 'l'], \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], -'Move selected elements up 2' => [['000-k', 'k'], \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], -'Move selected elements down 2' => [['000-j', 'j'], \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], - -'Shrink box' => ['000-s', \&App::Asciio::Actions::ElementsManipulation::shrink_box ], - -'Make element narrower' => ['000-1', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [-1, 0] ], -'Make element taller' => ['000-2', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [0, 1] ], -'Make element shorter' => ['000-3', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [0, -1] ], -'Make element wider' => ['000-4', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [1, 0] ], - -'Make elements Unicode' => ['C00-u', \&App::Asciio::Actions::Asciio::make_selection_unicode, 1 ], -'Make elements not Unicode' => ['C0S-U', \&App::Asciio::Actions::Asciio::make_selection_unicode, 0 ], +'Undo' => [['C00-z', '000-u'], \&App::Asciio::Actions::Unsorted::undo ], +'Redo' => [['C00-y', 'C00-r'], \&App::Asciio::Actions::Unsorted::redo ], +'Zoom in' => [['000-plus', 'C00-j', 'C00-scroll-up'], \&App::Asciio::Actions::Unsorted::zoom, 1 ], +'Zoom out' => [['000-minus', 'C00-h', 'C00-scroll-down'],\&App::Asciio::Actions::Unsorted::zoom, -1 ], + +'Select next element' => [['000-Tab', '000-n'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [1, 0, 0] ], +'Select previous element' => [['00S-ISO_Left_Tab', '00S-N'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [0, 0, 0] ], +'Select next non arrow' => [['C00-Tab', 'C00-n'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [1, 0, 1] ], +'Select previous non arrow' => [['C0S-ISO_Left_Tab', 'C0S-N'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [0, 0, 1] ], +'Select next arrow' => [['CA0-Tab', 'C00-m'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [1, 0, 2] ], +'Select previous arrow' => [['CAS-ISO_Left_Tab', 'C0S-M'], \&App::Asciio::Actions::ElementsManipulation::select_element_direction, [0, 0, 2] ], + +'Select all elements' => [['C00-a', '00S-V'], \&App::Asciio::Actions::ElementsManipulation::select_all_elements ], +'Deselect all elements' => ['000-Escape', \&App::Asciio::Actions::ElementsManipulation::deselect_all_elements ], +'Select connected elements' => ['000-v', \&App::Asciio::Actions::ElementsManipulation::select_connected ], +'Select elements by word' => ['C00-f', \&App::Asciio::Actions::ElementsManipulation::select_all_elements_by_words ], +'Select elements by word no group' => ['C0S-F', \&App::Asciio::Actions::ElementsManipulation::select_all_elements_by_words_no_group ], + +'Delete selected elements' => [['000-Delete', '000-d'], \&App::Asciio::Actions::ElementsManipulation::delete_selected_elements ], + +'Edit selected element' => [['000-2button-press-1','000-Return'], \&App::Asciio::Actions::ElementsManipulation::edit_selected_element, 0 ], +'Edit selected element inline' => [['C00-2button-press-1','C00-Return'], \&App::Asciio::Actions::ElementsManipulation::edit_selected_element, 1 ], + +'Move selected elements left' => ['000-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], +'Move selected elements right' => ['000-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], +'Move selected elements up' => ['000-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], +'Move selected elements down' => ['000-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], + +'Move selected elements left quick' => ['0A0-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left, 10 ], +'Move selected elements right quick' => ['0A0-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right, 10 ], +'Move selected elements up quick' => ['0A0-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up, 10 ], +'Move selected elements down quick' => ['0A0-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down, 10 ], + +'Move selected elements left 2' => [['000-h', 'h'], \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], +'Move selected elements right 2' => [['000-l', 'l'], \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], +'Move selected elements up 2' => [['000-k', 'k'], \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], +'Move selected elements down 2' => [['000-j', 'j'], \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], # mouse -'Mouse right-click' => ['000-button-press-3', \&App::Asciio::Actions::Mouse::mouse_right_click ], +'Mouse right-click' => ['000-button-press-3', \&App::Asciio::Actions::Mouse::mouse_right_click ], -'Mouse left-click' => ['000-button-press-1', \&App::Asciio::Actions::Mouse::mouse_left_click ], -'Mouse expand selection' => ['00S-button-press-1', \&App::Asciio::Actions::Mouse::expand_selection ], -'Mouse selection flip' => ['C00-button-press-1', \&App::Asciio::Actions::Mouse::mouse_element_selection_flip ], +'Mouse left-click' => ['000-button-press-1', \&App::Asciio::Actions::Mouse::mouse_left_click ], +'Mouse expand selection' => ['00S-button-press-1', \&App::Asciio::Actions::Mouse::expand_selection ], +'Mouse selection flip' => ['C00-button-press-1', \&App::Asciio::Actions::Mouse::mouse_element_selection_flip ], -'Mouse quick link' => [['0A0-button-press-1', '000-period'], \&App::Asciio::Actions::Mouse::quick_link ], -'Mouse duplicate elements' => [['0AS-button-press-1', '000-comma'], \&App::Asciio::Actions::Mouse::mouse_duplicate_element ], -'Mouse quick box' => [['C0S-button-press-1'], \&App::Asciio::Actions::Elements::add_element, ['Asciio/box', 0] ], +'Mouse quick link' => [['0A0-button-press-1', '000-period'], \&App::Asciio::Actions::Mouse::quick_link ], +'Mouse duplicate elements' => [['0AS-button-press-1', '000-comma'], \&App::Asciio::Actions::Mouse::mouse_duplicate_element ], +'Mouse quick box' => [['C0S-button-press-1'], \&App::Asciio::Actions::Elements::add_element, ['Asciio/box', 0] ], -'Arrow to mouse' => ['CA0-motion_notify', \&App::Asciio::Actions::Arrow::interactive_to_mouse ], -'Arrow mouse change direction' => ['CA0-2button-press-1', \&App::Asciio::Actions::Arrow::change_arrow_direction ], -'Arrow change direction' => ['CA0-d', \&App::Asciio::Actions::Arrow::interactive_change_arrow_direction ], -'Wirl arrow add section' => ['CA0-button-press-1', \&App::Asciio::Actions::Multiwirl::interactive_add_section ], -'Wirl arrow insert flex point' => ['CA0-button-press-2', \&App::Asciio::Actions::Multiwirl::insert_wirl_arrow_section ], +'Arrow to mouse' => ['CA0-motion_notify', \&App::Asciio::Actions::Arrow::interactive_to_mouse ], +'Arrow mouse change direction' => ['CA0-2button-press-1', \&App::Asciio::Actions::Arrow::change_arrow_direction ], +'Arrow change direction' => ['CA0-d', \&App::Asciio::Actions::Arrow::interactive_change_arrow_direction ], +'Wirl arrow add section' => ['CA0-button-press-1', \&App::Asciio::Actions::Multiwirl::interactive_add_section ], +'Wirl arrow insert flex point' => ['CA0-button-press-2', \&App::Asciio::Actions::Multiwirl::insert_wirl_arrow_section ], -'Mouse motion' => ['000-motion_notify', \&App::Asciio::Actions::Mouse::mouse_motion ], -'Mouse motion 2' => ['0AS-motion_notify', \&App::Asciio::Actions::Mouse::mouse_motion ], -'Mouse drag canvas' => ['C00-motion_notify', \&App::Asciio::Actions::Mouse::mouse_drag_canvas ], +'Mouse motion' => ['000-motion_notify', \&App::Asciio::Actions::Mouse::mouse_motion ], +'Mouse motion 2' => ['0AS-motion_notify', \&App::Asciio::Actions::Mouse::mouse_motion ], +'Mouse drag canvas' => ['C00-motion_notify', \&App::Asciio::Actions::Mouse::mouse_drag_canvas ], # mouse emulation -'Mouse emulation toggle' => [['000-apostrophe', "'"], \&App::Asciio::Actions::Mouse::toggle_mouse ], +'Mouse emulation toggle' => [['000-apostrophe', "'"], \&App::Asciio::Actions::Mouse::toggle_mouse ], -'Mouse emulation left-click' => ['000-odiaeresis', \&App::Asciio::Actions::Mouse::mouse_left_click ], -'Mouse emulation expand selection' => ['00S-Odiaeresis', \&App::Asciio::Actions::Mouse::expand_selection ], -'Mouse emulation selection flip' => ['C00-odiaeresis', \&App::Asciio::Actions::Mouse::mouse_element_selection_flip ], +'Mouse emulation left-click' => ['000-odiaeresis', \&App::Asciio::Actions::Mouse::mouse_left_click ], +'Mouse emulation expand selection' => ['00S-Odiaeresis', \&App::Asciio::Actions::Mouse::expand_selection ], +'Mouse emulation selection flip' => ['C00-odiaeresis', \&App::Asciio::Actions::Mouse::mouse_element_selection_flip ], -'Mouse emulation right-click' => ['000-adiaeresis', \&App::Asciio::Actions::Mouse::mouse_right_click ], +'Mouse emulation right-click' => ['000-adiaeresis', \&App::Asciio::Actions::Mouse::mouse_right_click ], -'Mouse emulation move left' => ['C00-Left', \&App::Asciio::Actions::Mouse::mouse_move, [-1, 0] ], -'Mouse emulation move right' => ['C00-Right', \&App::Asciio::Actions::Mouse::mouse_move, [ 1, 0] ], -'Mouse emulation move up' => ['C00-Up', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, -1] ], -'Mouse emulation move down' => ['C00-Down', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, 1] ], +'Mouse emulation move left' => ['C00-Left', \&App::Asciio::Actions::Mouse::mouse_move, [-1, 0] ], +'Mouse emulation move right' => ['C00-Right', \&App::Asciio::Actions::Mouse::mouse_move, [ 1, 0] ], +'Mouse emulation move up' => ['C00-Up', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, -1] ], +'Mouse emulation move down' => ['C00-Down', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, 1] ], -'Mouse emulation drag left' => ['00S-Left', \&App::Asciio::Actions::Mouse::mouse_drag_left ], -'Mouse emulation drag right' => ['00S-Right', \&App::Asciio::Actions::Mouse::mouse_drag_right ], -'Mouse emulation drag up' => ['00S-Up', \&App::Asciio::Actions::Mouse::mouse_drag_up ], -'Mouse emulation drag down' => ['00S-Down', \&App::Asciio::Actions::Mouse::mouse_drag_down ], +'Mouse emulation drag left' => ['00S-Left', \&App::Asciio::Actions::Mouse::mouse_drag_left ], +'Mouse emulation drag right' => ['00S-Right', \&App::Asciio::Actions::Mouse::mouse_drag_right ], +'Mouse emulation drag up' => ['00S-Up', \&App::Asciio::Actions::Mouse::mouse_drag_up ], +'Mouse emulation drag down' => ['00S-Down', \&App::Asciio::Actions::Mouse::mouse_drag_down ], -'Mouse on element id' => ['000-m', \&App::Asciio::Actions::Mouse::mouse_on_element_id ], +'Mouse on element id' => ['000-m', \&App::Asciio::Actions::Mouse::mouse_on_element_id ], -'Asciio context_menu' => ['as_context_menu', undef, undef, \&App::Asciio::Actions::Asciio::context_menu ], -'Box context_menu' => ['bo_context_menu', undef, undef, \&App::Asciio::Actions::Box::context_menu ] , -'Multi_wirl context_menu' => ['mw_context_menu', undef, undef, \&App::Asciio::Actions::Multiwirl::multi_wirl_context_menu ], -'Angled arrow context_menu' => ['aa_ontext menu', undef, undef, \&App::Asciio::Actions::Multiwirl::angled_arrow_context_menu ], -'Ruler context_menu' => ['ru_context_menu', undef, undef, \&App::Asciio::Actions::Ruler::context_menu ], -'Shapes context_menu' => ['sh_context_menu', undef, undef, \&App::Asciio::Actions::Shapes::context_menu ], +'Copy to clipboard' => [['C00-c', 'C00-Insert'], \&App::Asciio::Actions::Clipboard::copy_to_clipboard ], +'Insert from clipboard' => [['C00-v', '00S-Insert'], \&App::Asciio::Actions::Clipboard::insert_from_clipboard ], -'grouping leader' => +'<< yank leader >>' => + { + SHORTCUTS => '000-y', + + 'Copy to clipboard' => ['000-y', \&App::Asciio::Actions::Clipboard::copy_to_clipboard ], + 'Export to clipboard & primary as ascii' => ['00S-Y', \&App::Asciio::Actions::Clipboard::export_to_clipboard_as_ascii ], + 'Export to clipboard & primary as markup'=> ['000-m', \&App::Asciio::Actions::Clipboard::export_to_clipboard_as_markup], + }, + +'<< paste leader >>' => + { + SHORTCUTS => '000-p', + 'Insert from clipboard' => ['000-p', \&App::Asciio::Actions::Clipboard::insert_from_clipboard ], + 'Import from primary to box' => ['00S-P', \&App::Asciio::Actions::Clipboard::import_from_primary_to_box ], + 'Import from primary to text' => ['0A0-p', \&App::Asciio::Actions::Clipboard::import_from_primary_to_text ], + 'Import from clipboard to box' => ['000-b', \&App::Asciio::Actions::Clipboard::import_from_clipboard_to_box ], + 'Import from clipboard to text' => ['000-t', \&App::Asciio::Actions::Clipboard::import_from_clipboard_to_text], + }, + +'<< grouping leader >>' => { SHORTCUTS => '000-g', @@ -144,7 +138,7 @@ 'Temporary move to the front' => ['00S-F', \&App::Asciio::Actions::ElementsManipulation::temporary_move_selected_element_to_front], }, -'stripes leader' => +'<< stripes leader >>' => { SHORTCUTS => '0A0-g', @@ -153,7 +147,7 @@ 'ungroup stripes group' => ['000-u', \&App::Asciio::Actions::ElementsManipulation::ungroup_stripes_group ], }, -'align leader' => +'<< align leader >>' => { SHORTCUTS => '00S-A', @@ -165,26 +159,29 @@ 'Align horizontally' => ['000-h', \&App::Asciio::Actions::Align::align, 'horizontal'], }, -'change color/font leader'=> +'<< change color/font leader >>'=> { SHORTCUTS => '000-z', - 'Change elements foreground color' => ['000-c', \&App::Asciio::Actions::Colors::change_elements_colors, 0 ], - 'Change elements background color' => ['00S-C', \&App::Asciio::Actions::Colors::change_elements_colors, 1 ], - - 'Change Asciio background color' => ['0A0-c', \&App::Asciio::Actions::Colors::change_background_color ], - 'Change grid color' => ['0AS-C', \&App::Asciio::Actions::Colors::change_grid_color ], - 'Flip color scheme' => ['000-s', \&App::Asciio::Actions::Colors::flip_color_scheme ], - 'Flip transparent element background' => ['000-t', \&App::Asciio::Actions::Unsorted::transparent_elements ], - 'Flip grid display' => ['000-g', \&App::Asciio::Actions::Unsorted::flip_grid_display ], - 'Remove rulers' => ['000-r', \&App::Asciio::Actions::Ruler::remove_ruler ], - 'Flip hint lines' => ['000-h', \&App::Asciio::Actions::Unsorted::flip_hint_lines ], - 'Change font' => ['000-f', \&App::Asciio::Actions::Unsorted::change_font ], - 'Edit inline' => ['000-i', \&App::Asciio::GTK::Asciio::switch_gtk_popup_box_type ], - 'show/hide connectors' => ['000-v', \&App::Asciio::Actions::Unsorted::flip_connector_display ], + 'Show/hide binding completion' => ['000-b', sub { $_[0]->{USE_BINDINGS_COMPLETION} ^= 1 ; $_[0]->update_display() ;} ], + + 'flip cross mode' => [ '000-x', sub { $_[0]->{USE_CROSS_MODE} ^= 1 ; $_[0]->update_display ; } ], + + 'Change elements foreground color' => ['000-c', \&App::Asciio::Actions::Colors::change_elements_colors, 0 ], + 'Change elements background color' => ['00S-C', \&App::Asciio::Actions::Colors::change_elements_colors, 1 ], + + 'Change Asciio background color' => ['0A0-c', \&App::Asciio::Actions::Colors::change_background_color ], + 'Change grid color' => ['0AS-C', \&App::Asciio::Actions::Colors::change_grid_color ], + 'Flip color scheme' => ['000-s', \&App::Asciio::Actions::Colors::flip_color_scheme ], + 'Flip transparent element background' => ['000-t', \&App::Asciio::Actions::Unsorted::transparent_elements ], + 'Flip grid display' => ['000-g', \&App::Asciio::Actions::Unsorted::flip_grid_display ], + 'Flip hint lines' => ['000-h', \&App::Asciio::Actions::Unsorted::flip_hint_lines ], + 'Change font' => ['000-f', \&App::Asciio::Actions::Unsorted::change_font ], + 'Edit inline' => ['000-i', \&App::Asciio::GTK::Asciio::switch_gtk_popup_box_type ], + 'Show/hide connectors' => ['000-v', \&App::Asciio::Actions::Unsorted::flip_connector_display ], }, -'arrow leader' => +'<< arrow leader >>' => { SHORTCUTS => '000-a', @@ -198,7 +195,7 @@ 'end no disconnect' => ['C0S-D', \&App::Asciio::Actions::Multiwirl::disable_arrow_connector, 1 ], }, -'debug leader' => +'<< debug leader >>' => { SHORTCUTS => '00S-D', @@ -211,11 +208,13 @@ 'ZBuffer Test' => ['000-z', \&App::Asciio::Actions::ZBuffer::dump_crossings ], }, -'commands leader'=> +'<< commands leader >>'=> { SHORTCUTS => '00S-colon', 'Help' => ['000-h', \&App::Asciio::Actions::Unsorted::display_help ], + 'Add help box' => ['00S-H', \&App::Asciio::Actions::Elements::add_help_box, ], + 'Display keyboard mapping' => ['000-k', \&App::Asciio::Actions::Unsorted::display_keyboard_mapping_in_browser], 'Display commands' => ['000-c', \&App::Asciio::Actions::Unsorted::display_commands ], 'Display action files' => ['000-f', \&App::Asciio::Actions::Unsorted::display_action_files ], @@ -231,16 +230,10 @@ 'Quit no save' => ['00S-Q', \&App::Asciio::Actions::File::quit_no_save ], }, -'Insert leader' => +'<< Insert leader >>' => { SHORTCUTS => '000-i', - # 'Add from file' => [ 'f' ], ??? - - 'Add box' => ['000-b', \&App::Asciio::Actions::Elements::add_element, ['Asciio/box', 0] ], - 'Add unicode box' => ['0A0-b', \&App::Asciio::Actions::Elements::add_element, ['Asciio/box unicode', 0] ], - 'Add shrink box' => ['00S-B', \&App::Asciio::Actions::Elements::add_element, ['Asciio/shrink_box', 1] ], - 'Add text' => ['000-t', \&App::Asciio::Actions::Elements::add_element, ['Asciio/text', 1] ], 'Add arrow' => ['000-a', \&App::Asciio::Actions::Elements::add_element, ['Asciio/wirl_arrow', 0] ], @@ -252,130 +245,230 @@ # } # ] , - 'Add unicode arrow' => ['0A0-a', \&App::Asciio::Actions::Elements::add_element, ['Asciio/wirl_arrow unicode', 0] ], - 'Add angled arrow' => ['00S-A', \&App::Asciio::Actions::Elements::add_element, ['Asciio/angled arrow', 0] ], - 'Add unicode angled arrow' => ['0AS-A', \&App::Asciio::Actions::Elements::add_element, ['Asciio/angled arrow unicode', 0] ], + + 'Add ascii line' => ['000-l', \&App::Asciio::Actions::Elements::add_line, 0 ], + 'Add ascii no-connect line' => ['000-k', \&App::Asciio::Actions::Elements::add_non_connecting_line, 0 ], + + '<< Multiple >>' => ['000-m', sub { $_[0]->use_action_group('group_insert_multiple') ; } ] , + '<< Unicode >>' => ['000-u', sub { $_[0]->use_action_group('group_insert_unicode') ; } ] , + '<< Box >>' => ['000-b', sub { $_[0]->use_action_group('group_insert_box') ; } ] , + '<< Elements >>' => ['000-e', sub { $_[0]->use_action_group('group_insert_element') ; } ] , + '<< Ruler >>' => ['000-r', sub { $_[0]->use_action_group('group_insert_ruler') ; } ] , + }, + +'group_insert_multiple' => + { + SHORTCUTS => 'group_insert_multiple', + + 'Add multiple texts' => ['000-t', \&App::Asciio::Actions::Unsorted::insert_multiple_boxes_from_text_description, 0 ], + 'Add multiple boxes' => ['000-b', \&App::Asciio::Actions::Unsorted::insert_multiple_boxes_from_text_description, 1 ], + }, + +'group_insert_ruler' => + { + SHORTCUTS => 'group_insert_ruler', + + 'Add vertical ruler' => ['000-v', \&App::Asciio::Actions::Ruler::add_ruler, {TYPE => 'VERTICAL'} ], + 'Add horizontal ruler' => ['000-h', \&App::Asciio::Actions::Ruler::add_ruler, {TYPE => 'HORIZONTAL'} ], + 'delete rulers' => ['000-d', \&App::Asciio::Actions::Ruler::remove_ruler ], + }, + +'group_insert_element' => + { + SHORTCUTS => 'group_insert_element', 'Add connector' => ['000-c', \&App::Asciio::Actions::Elements::add_element, ['Asciio/connector', 0] ], 'Add connector type 2' => ['00S-C', \&App::Asciio::Actions::Elements::add_element, ['Asciio/connector2', 0] ], 'Add if' => ['000-i', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Boxes/if', 1] ], 'Add process' => ['000-p', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Boxes/process', 1] ], - 'Add rhombus' => ['000-r', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Shape/rhombus', 0] ], + 'Add rhombus' => ['0A0-r', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Shape/rhombus', 0] ], 'Add ellipse' => ['000-e', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Shape/ellipse', 0] ], + }, + +'group_insert_box' => + { + SHORTCUTS => 'group_insert_box', - 'Add ascii line' => ['000-l', \&App::Asciio::Actions::Elements::add_line, 0 ], - 'Add unicode line' => ['00S-L', \&App::Asciio::Actions::Elements::add_line, 1 ], - 'Add unicode bold line' => ['0A0-l', \&App::Asciio::Actions::Elements::add_line, 2 ], - 'Add unicode double line' => ['0AS-L', \&App::Asciio::Actions::Elements::add_line, 3 ], - - 'Add ascii no-connect line' => ['000-k', \&App::Asciio::Actions::Elements::add_non_connecting_line, 0 ], - 'Add unicode no-connect line' => ['00S-K', \&App::Asciio::Actions::Elements::add_non_connecting_line, 1 ], - 'Add unicode no-connect bold line' => ['0A0-k', \&App::Asciio::Actions::Elements::add_non_connecting_line, 2 ], - 'Add unicode no-connect double line' => ['0AS-K', \&App::Asciio::Actions::Elements::add_non_connecting_line, 3 ], - - 'Add multiple texts' => ['C00-t', \&App::Asciio::Actions::Unsorted::insert_multiple_boxes_from_text_description, 0 ], - 'Add multiple boxes' => ['C00-b', \&App::Asciio::Actions::Unsorted::insert_multiple_boxes_from_text_description, 1 ], + 'Add box' => ['000-b', \&App::Asciio::Actions::Elements::add_element, ['Asciio/box', 0] ], + 'Add shrink box' => ['000-s', \&App::Asciio::Actions::Elements::add_element, ['Asciio/shrink_box', 1] ], 'Add exec box' => ['C00-e', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Boxes/exec', 1] ], 'Add exec box verbatim' => ['C00-v', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Boxes/exec verbatim', 1] ], 'Add exec box verbatim once' => ['C00-o', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Boxes/exec verbatim once', 1] ], 'Add line numbered box' => ['C00-l', \&App::Asciio::Actions::Elements::add_element, ['Asciio/Boxes/exec add lines', 1] ], + }, + +'group_insert_unicode' => + { + SHORTCUTS => 'group_insert_unicode', + + 'Add unicode box' => ['000-b', \&App::Asciio::Actions::Elements::add_element, ['Asciio/box unicode', 0] ], + 'Add unicode arrow' => ['000-a', \&App::Asciio::Actions::Elements::add_element, ['Asciio/wirl_arrow unicode', 0] ], + 'Add unicode angled arrow' => ['00S-A', \&App::Asciio::Actions::Elements::add_element, ['Asciio/angled arrow unicode', 0] ], + 'Add unicode line' => ['000-l', \&App::Asciio::Actions::Elements::add_line, 1 ], + + 'Add unicode bold line' => ['00S-L', \&App::Asciio::Actions::Elements::add_line, 2 ], + 'Add unicode double line' => ['0A0-l', \&App::Asciio::Actions::Elements::add_line, 3 ], - 'Add vertical ruler' => ['C00-r', \&App::Asciio::Actions::Ruler::add_ruler, {TYPE => 'VERTICAL'} ], - 'Add horizontal ruler' => ['C0S-R', \&App::Asciio::Actions::Ruler::add_ruler, {TYPE => 'HORIZONTAL'} ], - 'Add help box' => ['C00-h', \&App::Asciio::Actions::Elements::add_help_box, ], + 'Add unicode no-connect line' => ['000-k', \&App::Asciio::Actions::Elements::add_non_connecting_line, 1 ], + 'Add unicode no-connect bold line' => ['00S-K', \&App::Asciio::Actions::Elements::add_non_connecting_line, 2 ], + 'Add unicode no-connect double line' => ['0A0-K', \&App::Asciio::Actions::Elements::add_non_connecting_line, 3 ], }, -'clone' => +'<< element leader >>' => + { + SHORTCUTS => '000-e', + + 'Shrink box' => ['000-s', \&App::Asciio::Actions::ElementsManipulation::shrink_box ], + + 'Make element narrower' => ['000-1', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [-1, 0] ], + 'Make element taller' => ['000-2', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [0, 1] ], + 'Make element shorter' => ['000-3', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [0, -1] ], + 'Make element wider' => ['000-4', \&App::Asciio::Actions::ElementsManipulation::resize_element_offset, [1, 0] ], + + 'Make elements Unicode' => ['C00-u', \&App::Asciio::Actions::Asciio::make_selection_unicode, 1 ], + 'Make elements not Unicode' => ['C0S-U', \&App::Asciio::Actions::Asciio::make_selection_unicode, 0 ], + }, + +'<< clone leader >>' => { SHORTCUTS => '000-c', ENTER_GROUP => \&App::Asciio::Actions::Clone::clone_enter, ESCAPE_KEY => '000-Escape', - 'clone escape' => [ '000-Escape', \&App::Asciio::Actions::Clone::clone_escape ], - 'clone motion' => [ '000-motion_notify', \&App::Asciio::Actions::Clone::clone_mouse_motion ], - - 'clone insert' => [ '000-button-press-1', \&App::Asciio::Actions::Clone::clone_add_element ], - 'clone insert2' => [ '000-Return', \&App::Asciio::Actions::Clone::clone_add_element ], - 'clone arrow' => [ '000-a', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/wirl_arrow', 0] ], - 'clone angled arrow' => [ '00S-A', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/angled_arrow', 0] ], - 'clone box' => [ '000-b', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/box', 0] ], - 'clone text' => [ '000-t', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/text', 0] ], - 'clone flip hint lines' => [ '000-h', \&App::Asciio::Actions::Unsorted::flip_hint_lines ], - - 'clone left' => ['000-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], - 'clone right' => ['000-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], - 'clone up' => ['000-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], - 'clone down' => ['000-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], - - 'clone emulation left' => ['C00-Left', \&App::Asciio::Actions::Mouse::mouse_move, [-1, 0] ], - 'clone emulation right' => ['C00-Right', \&App::Asciio::Actions::Mouse::mouse_move, [ 1, 0] ], - 'clone emulation up' => ['C00-Up', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, -1] ], - 'clone emulation down' => ['C00-Down', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, 1] ], + 'clone escape' => [ '000-Escape', \&App::Asciio::Actions::Clone::clone_escape ], + 'clone motion' => [ '000-motion_notify', \&App::Asciio::Actions::Clone::clone_mouse_motion ], + + 'clone insert' => [ '000-button-press-1', \&App::Asciio::Actions::Clone::clone_add_element ], + 'clone insert2' => [ '000-Return', \&App::Asciio::Actions::Clone::clone_add_element ], + 'clone arrow' => [ '000-a', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/wirl_arrow', 0] ], + 'clone angled arrow' => [ '00S-A', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/angled_arrow', 0] ], + 'clone box' => [ '000-b', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/box', 0] ], + 'clone text' => [ '000-t', \&App::Asciio::Actions::Clone::clone_set_overlay, ['Asciio/text', 0] ], + 'clone flip hint lines' => [ '000-h', \&App::Asciio::Actions::Unsorted::flip_hint_lines ], + + 'clone left' => ['000-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], + 'clone right' => ['000-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], + 'clone up' => ['000-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], + 'clone down' => ['000-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], + + 'clone emulation left' => ['C00-Left', \&App::Asciio::Actions::Mouse::mouse_move, [-1, 0] ], + 'clone emulation right' => ['C00-Right', \&App::Asciio::Actions::Mouse::mouse_move, [ 1, 0] ], + 'clone emulation up' => ['C00-Up', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, -1] ], + 'clone emulation down' => ['C00-Down', \&App::Asciio::Actions::Mouse::mouse_move, [ 0, 1] ], }, -'git' => +'<< git leader >>' => { SHORTCUTS => '00S-G', ESCAPE_KEY => '000-Escape', - 'Quick git' => [['000-button-press-3', '000-g'], \&App::Asciio::Actions::Git::quick_link ], + 'Show git bindings' => ['00S-question', sub { $_[0]->create_binding_completions(1) ; } ], - 'Git add box' => [ '000-b', \&App::Asciio::Actions::Elements::add_element, ['Asciio/box', 1] ], - 'Git add text' => [ '000-t', \&App::Asciio::Actions::Elements::add_element, ['Asciio/text', 1] ], - 'Git add arrow' => [ '000-a', \&App::Asciio::Actions::Elements::add_element, ['Asciio/wirl_arrow', 0]], - 'Git edit selected element' => [['000-2button-press-1', '000-Return'], \&App::Asciio::Actions::Git::edit_selected_element ], + 'Quick git' => [['000-button-press-3', '000-c'], \&App::Asciio::Actions::Git::quick_link ], - 'Git mouse left-click' => [ '000-button-press-1', \&App::Asciio::Actions::Mouse::mouse_left_click ], - 'Git change arrow direction' => [ '000-d', \&App::Asciio::Actions::Arrow::change_arrow_direction ], - 'Git undo' => [ '000-u', \&App::Asciio::Actions::Unsorted::undo ], - 'Git delete elements' => [['000-Delete', '000-x'], \&App::Asciio::Actions::ElementsManipulation::delete_selected_elements ], + 'Git add box' => [ '000-b', \&App::Asciio::Actions::Elements::add_element, ['Asciio/box', 1] ], + 'Git add text' => [ '000-t', \&App::Asciio::Actions::Elements::add_element, ['Asciio/text', 1] ], + 'Git add arrow' => [ '000-a', \&App::Asciio::Actions::Elements::add_element, ['Asciio/wirl_arrow', 0]], + 'Git edit selected element' => [['000-2button-press-1', '000-Return'], \&App::Asciio::Actions::Git::edit_selected_element ], - 'Git mouse motion' => [ '000-motion_notify', \&App::Asciio::Actions::Mouse::mouse_motion ], - 'Git move elements left' => [ '000-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], - 'Git move elements right' => [ '000-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], - 'Git move elements up' => [ '000-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], - 'Git move elements down' => [ '000-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], + 'Git mouse left-click' => [ '000-button-press-1', \&App::Asciio::Actions::Mouse::mouse_left_click ], + 'Git change arrow direction' => [ '000-d', \&App::Asciio::Actions::Arrow::change_arrow_direction ], + 'Git undo' => [ '000-u', \&App::Asciio::Actions::Unsorted::undo ], + 'Git delete elements' => [['000-Delete', '000-x'], \&App::Asciio::Actions::ElementsManipulation::delete_selected_elements ], - 'Git mouse right-click' => [ '0A0-button-press-3', \&App::Asciio::Actions::Mouse::mouse_right_click ], - 'Git flip hint lines' => [ '000-h', \&App::Asciio::Actions::Unsorted::flip_hint_lines ], + 'Git mouse motion' => [ '000-motion_notify', \&App::Asciio::Actions::Mouse::mouse_motion ], + 'Git move elements left' => [ '000-Left', \&App::Asciio::Actions::ElementsManipulation::move_selection_left ], + 'Git move elements right' => [ '000-Right', \&App::Asciio::Actions::ElementsManipulation::move_selection_right ], + 'Git move elements up' => [ '000-Up', \&App::Asciio::Actions::ElementsManipulation::move_selection_up ], + 'Git move elements down' => [ '000-Down', \&App::Asciio::Actions::ElementsManipulation::move_selection_down ], + + 'Git mouse right-click' => [ '0A0-button-press-3', \&App::Asciio::Actions::Mouse::mouse_right_click ], + 'Git flip hint lines' => [ '000-h', \&App::Asciio::Actions::Unsorted::flip_hint_lines ], }, -'slides leader' => +'<< slides leader >>' => { SHORTCUTS => '00S-S', - 'Load slides' => ['000-l', \&App::Asciio::Actions::Presentation::load_slides ] , - 'previous slide' => ['00S-N', \&App::Asciio::Actions::Presentation::previous_slide], - 'next slide' => ['000-n', \&App::Asciio::Actions::Presentation::next_slide ], - 'first slide' => ['000-g', \&App::Asciio::Actions::Presentation::first_slide ], - 'show previous message' => ['000-m', \&App::Asciio::Actions::Presentation::show_previous_message], - 'show next message' => ['00S-M', \&App::Asciio::Actions::Presentation::show_next_message], + 'Load slides' => ['000-l', \&App::Asciio::Actions::Presentation::load_slides ] , + 'previous slide' => ['00S-N', \&App::Asciio::Actions::Presentation::previous_slide], + 'next slide' => ['000-n', \&App::Asciio::Actions::Presentation::next_slide ], + 'first slide' => ['000-g', \&App::Asciio::Actions::Presentation::first_slide ], + 'show previous message' => ['000-m', \&App::Asciio::Actions::Presentation::show_previous_message], + 'show next message' => ['00S-M', \&App::Asciio::Actions::Presentation::show_next_message], }, -'move arrow ends' => +'<< move arrow ends leader >>' => { SHORTCUTS => '0A0-a', ESCAPE_KEY => '000-Escape', - 'arrow start up' => [ '000-Up', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, -1] ], - 'arrow start down' => [ '000-Down', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, 1] ], - 'arrow start right' => [ '000-Right', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 1, 0] ], - 'arrow start left' => [ '000-Left', \&App::Asciio::Actions::Arrow::move_arrow_start, [-1, 0] ], - 'arrow start up2' => [ '000-k', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, -1] ], - 'arrow start down2' => [ '000-j', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, 1] ], - 'arrow start right2' => [ '000-l', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 1, 0] ], - 'arrow start left2' => [ '000-h', \&App::Asciio::Actions::Arrow::move_arrow_start, [-1, 0] ], - 'arrow end up' => [ '00S-Up', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, -1] ], - 'arrow end down' => [ '00S-Down', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, 1] ], - 'arrow end right' => [ '00S-Right', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 1, 0] ], - 'arrow end left' => [ '00S-Left', \&App::Asciio::Actions::Arrow::move_arrow_end, [-1, 0] ], - 'arrow end up2' => [ '00S-K', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, -1] ], - 'arrow end down2' => [ '00S-J', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, 1] ], - 'arrow end right2' => [ '00S-L', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 1, 0] ], - 'arrow end left2' => [ '00S-H', \&App::Asciio::Actions::Arrow::move_arrow_end, [-1, 0] ], + 'arrow start up' => [ '000-Up', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, -1] ], + 'arrow start down' => [ '000-Down', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, 1] ], + 'arrow start right' => [ '000-Right', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 1, 0] ], + 'arrow start left' => [ '000-Left', \&App::Asciio::Actions::Arrow::move_arrow_start, [-1, 0] ], + 'arrow start up2' => [ '000-k', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, -1] ], + 'arrow start down2' => [ '000-j', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 0, 1] ], + 'arrow start right2' => [ '000-l', \&App::Asciio::Actions::Arrow::move_arrow_start, [ 1, 0] ], + 'arrow start left2' => [ '000-h', \&App::Asciio::Actions::Arrow::move_arrow_start, [-1, 0] ], + 'arrow end up' => [ '00S-Up', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, -1] ], + 'arrow end down' => [ '00S-Down', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, 1] ], + 'arrow end right' => [ '00S-Right', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 1, 0] ], + 'arrow end left' => [ '00S-Left', \&App::Asciio::Actions::Arrow::move_arrow_end, [-1, 0] ], + 'arrow end up2' => [ '00S-K', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, -1] ], + 'arrow end down2' => [ '00S-J', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 0, 1] ], + 'arrow end right2' => [ '00S-L', \&App::Asciio::Actions::Arrow::move_arrow_end, [ 1, 0] ], + 'arrow end left2' => [ '00S-H', \&App::Asciio::Actions::Arrow::move_arrow_end, [-1, 0] ], }, + +'Asciio context_menu' => ['as_context_menu', undef, undef, \&App::Asciio::Actions::Asciio::context_menu ], +'Box context_menu' => ['bo_context_menu', undef, undef, \&App::Asciio::Actions::Box::context_menu ] , +'Multi_wirl context_menu' => ['mw_context_menu', undef, undef, \&App::Asciio::Actions::Multiwirl::multi_wirl_context_menu ], +'Angled arrow context_menu' => ['aa_ontext menu', undef, undef, \&App::Asciio::Actions::Multiwirl::angled_arrow_context_menu ], +'Ruler context_menu' => ['ru_context_menu', undef, undef, \&App::Asciio::Actions::Ruler::context_menu ], +'Shapes context_menu' => ['sh_context_menu', undef, undef, \&App::Asciio::Actions::Shapes::context_menu ], ) ; +register_first_level_group +( +SHORTCUT => '00S-question', + +'<< Insert leader >>' => 1, +'<< yank leader >>' => 1, +'<< paste leader >>' => 1, +'<< grouping leader >>' => 1, +'<< stripes leader >>' => 1, +'<< align leader >>' => 1, +'<< change color/font leader >>' => 1, +'<< arrow leader >>' => 1, +'<< debug leader >>' => 1, +'<< commands leader >>' => 1, +'<< Insert leader >>' => 1, +'<< slides leader >>' => 1, +'<< element leader >>' => 1, +'<< clone leader >>' => 1, +'<< git leader >>' => 1, +'<< move arrow ends leader >>' => 1, + +'Select next non arrow' => 1, +'Select previous non arrow' => 1, +'Select next arrow' => 1, +'Select previous arrow' => 1, +'Select all elements' => 1, +'Select connected elements' => 1, + +'Edit selected element inline' => 1, + +'Mouse quick link' => 1, +'Mouse duplicate elements' => 1, +'Mouse quick box' => 1, + +'Arrow to mouse' => 1, +'Arrow mouse change direction' => 1, +'Arrow change direction' => 1, +'Wirl arrow add section' => 1, +'Wirl arrow insert flex point' => 1, +) ; diff --git a/setup/asciio_object/basic.pl b/setup/asciio_object/basic.pl index 3b5335b6..e40a2129 100644 --- a/setup/asciio_object/basic.pl +++ b/setup/asciio_object/basic.pl @@ -14,6 +14,7 @@ GIT_MODE_CONNECTOR_CHAR_LIST => ['*', 'o', '+', 'x', 'X', '┼', '╋', '╬'], TAB_AS_SPACES => ' ', +USE_BINDINGS_COMPLETION => 0, DISPLAY_GRID => 1, DISPLAY_GRID2 => 1, @@ -63,6 +64,7 @@ extra_point => [0.27, 0.53, 0.27], mouse_rectangle => [0.90, 0.20, 0.20], + hint_background => [0.20, 0.20, 0.20], }, 'system' => { @@ -94,6 +96,7 @@ extra_point => [0.27, 0.53, 0.27], mouse_rectangle => [0.90, 0.20, 0.20], + hint_background => [0.20, 0.20, 0.20], } },