Forge
csharpdeeb25a2
1using Avalonia.Input;
2
3namespace CascadeIDE.Features.Chat;
4
5/// <summary>Сопоставление нажатия с настройкой «отправить сообщение» (Enter / Ctrl+Enter / Shift+Enter).</summary>
6internal static class ChatSendKeyMatcher
7{
8 public static bool IsEnterPhysicalKey(Key key) => key is Key.Enter or Key.Return;
9
10 /// <summary>
11 /// Physical Enter без модификаторов. Для завершённого runnable slash (ADR 0150): коммитим на Enter,
12 /// даже если глобальная «отправить» — Ctrl+Enter / Shift+Enter (иначе в composer вставляется newline).
13 /// </summary>
14 public static bool IsBareEnterForSlashCommit(KeyEventArgs e)
15 {
16 if (!IsEnterPhysicalKey(e.Key))
17 return false;
18 return (e.KeyModifiers & (KeyModifiers.Control | KeyModifiers.Shift | KeyModifiers.Alt | KeyModifiers.Meta)) == 0;
19 }
20
21 public static bool Matches(KeyEventArgs e, string sendMessageKey)
22 {
23 var isEnter = IsEnterPhysicalKey(e.Key);
24 var ctrl = e.KeyModifiers.HasFlag(KeyModifiers.Control);
25 var shift = e.KeyModifiers.HasFlag(KeyModifiers.Shift);
26 return sendMessageKey switch
27 {
28 "Enter" => isEnter && !ctrl && !shift,
29 "Ctrl+Enter" => isEnter && ctrl && !shift,
30 "Shift+Enter" => isEnter && !ctrl && shift,
31 _ => false,
32 };
33 }
34}
35
View only · write via MCP/CIDE