-module(etui@keys).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/keys.gleam").
-export([match/1, is_char/1, char_value/1, is_navigation/1, is_modifier/1]).
-export_type([key/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type key() :: {char, binary()} |
up |
down |
left |
right |
enter |
backspace |
delete |
tab |
back_tab |
home |
'end' |
page_up |
page_down |
escape |
insert |
{f, integer()} |
{ctrl, binary()} |
{alt, binary()} |
{unknown, binary()}.
-file("src/etui/keys.gleam", 69).
?DOC(
" Parse a raw key string (from `backend.KeyPress`) into a `Key`.\n"
"\n"
" Raw strings from the Erlang backend follow these conventions:\n"
" - Printable ASCII/Unicode: the character itself (e.g. `\"a\"`, `\"A\"`, `\"€\"`)\n"
" - Arrow keys: `\"up\"`, `\"down\"`, `\"left\"`, `\"right\"`\n"
" - Control keys: `\"enter\"`, `\"backspace\"`, `\"delete\"`, `\"tab\"`, `\"backtab\"`,\n"
" `\"home\"`, `\"end\"`, `\"pageup\"`, `\"pagedown\"`, `\"esc\"`, `\"insert\"`\n"
" - Function keys: `\"f1\"` … `\"f12\"`\n"
" - Ctrl combos: `\"ctrl+a\"` … `\"ctrl+z\"`, `\"ctrl+[\"`, etc.\n"
" - Alt combos: `\"alt+a\"` … `\"alt+z\"`, etc.\n"
).
-spec match(binary()) -> key().
match(Raw) ->
case Raw of
<<"up"/utf8>> ->
up;
<<"down"/utf8>> ->
down;
<<"left"/utf8>> ->
left;
<<"right"/utf8>> ->
right;
<<"enter"/utf8>> ->
enter;
<<"backspace"/utf8>> ->
backspace;
<<"delete"/utf8>> ->
delete;
<<"tab"/utf8>> ->
tab;
<<"backtab"/utf8>> ->
back_tab;
<<"home"/utf8>> ->
home;
<<"end"/utf8>> ->
'end';
<<"pageup"/utf8>> ->
page_up;
<<"pagedown"/utf8>> ->
page_down;
<<"esc"/utf8>> ->
escape;
<<"insert"/utf8>> ->
insert;
<<"f1"/utf8>> ->
{f, 1};
<<"f2"/utf8>> ->
{f, 2};
<<"f3"/utf8>> ->
{f, 3};
<<"f4"/utf8>> ->
{f, 4};
<<"f5"/utf8>> ->
{f, 5};
<<"f6"/utf8>> ->
{f, 6};
<<"f7"/utf8>> ->
{f, 7};
<<"f8"/utf8>> ->
{f, 8};
<<"f9"/utf8>> ->
{f, 9};
<<"f10"/utf8>> ->
{f, 10};
<<"f11"/utf8>> ->
{f, 11};
<<"f12"/utf8>> ->
{f, 12};
_ ->
case gleam_stdlib:string_starts_with(Raw, <<"ctrl+"/utf8>>) of
true ->
{ctrl, gleam@string:drop_start(Raw, 5)};
false ->
case gleam_stdlib:string_starts_with(Raw, <<"alt+"/utf8>>) of
true ->
{alt, gleam@string:drop_start(Raw, 4)};
false ->
case string:length(Raw) > 0 of
true ->
{char, Raw};
false ->
{unknown, Raw}
end
end
end
end.
-file("src/etui/keys.gleam", 118).
?DOC(" True if key is a printable character (not a control/special key).\n").
-spec is_char(key()) -> boolean().
is_char(K) ->
case K of
{char, _} ->
true;
_ ->
false
end.
-file("src/etui/keys.gleam", 126).
?DOC(" Extract the character string from a `Char` key. Returns `\"\"` for others.\n").
-spec char_value(key()) -> binary().
char_value(K) ->
case K of
{char, C} ->
C;
_ ->
<<""/utf8>>
end.
-file("src/etui/keys.gleam", 134).
?DOC(" True if the key is a navigation key (arrows, home, end, page up/down).\n").
-spec is_navigation(key()) -> boolean().
is_navigation(K) ->
case K of
up ->
true;
down ->
true;
left ->
true;
right ->
true;
home ->
true;
'end' ->
true;
page_up ->
true;
page_down ->
true;
_ ->
false
end.
-file("src/etui/keys.gleam", 142).
?DOC(" True if the key is a modifier combo (Ctrl or Alt).\n").
-spec is_modifier(key()) -> boolean().
is_modifier(K) ->
case K of
{ctrl, _} ->
true;
{alt, _} ->
true;
_ ->
false
end.