csharpdeeb25a2 | 1 | using Avalonia.Input; |
| 2 | |
| 3 | namespace CascadeIDE.Features.Chat; |
| 4 | |
| 5 | /// <summary>Сопоставление нажатия с настройкой «отправить сообщение» (Enter / Ctrl+Enter / Shift+Enter).</summary> |
| 6 | internal 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