diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs index 63d6675..e5b0ee9 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs @@ -54,10 +54,19 @@ public partial class SharpIdeCodeEdit : CodeEdit [Inject] private readonly IdeCodeActionService _ideCodeActionService = null!; [Inject] private readonly FileChangedService _fileChangedService = null!; [Inject] private readonly IdeApplyCompletionService _ideApplyCompletionService = null!; - + + private readonly List _codeCompletionTriggers = + [ + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "_", "<", ".", "#" + ]; + public override void _Ready() { - CodeCompletionPrefixes = ["."]; + // _filter_code_completion_candidates_impl uses these prefixes to determine where the completions menu is allowed to show. + // It is quite annoying as we cannot override it via _FilterCodeCompletionCandidates, as we would lose the filtering as well. + // Currently, it is not possible to show completions on a new line at col 0 + CodeCompletionPrefixes = [.._codeCompletionTriggers, "(", ",", "=", "\t"]; SyntaxHighlighter = _syntaxHighlighter; _popupMenu = GetNode("CodeFixesMenu"); _popupMenu.IdPressed += OnCodeFixSelected; @@ -319,6 +328,22 @@ public partial class SharpIdeCodeEdit : CodeEdit } } + // public override Array _FilterCodeCompletionCandidates(Array candidates) + // { + // return base._FilterCodeCompletionCandidates(candidates); + // } + + // public override void _GuiInput(InputEvent @event) + // { + // if (@event.IsActionPressed("ui_text_completion_query")) + // { + // GD.Print("Entering CompletionQueryBuiltin _GuiInput"); + // AcceptEvent(); + // //GetViewport().SetInputAsHandled(); + // Callable.From(() => RequestCodeCompletion(true)).CallDeferred(); + // } + // } + public override void _UnhandledKeyInput(InputEvent @event) { CloseSymbolHoverWindow(); diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_CustomHandleUnicodeInput.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_CustomHandleUnicodeInput.cs new file mode 100644 index 0000000..82042b0 --- /dev/null +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_CustomHandleUnicodeInput.cs @@ -0,0 +1,35 @@ +using Godot; + +namespace SharpIDE.Godot.Features.CodeEditor; + +public partial class SharpIdeCodeEdit +{ + // public override void _Backspace(int caretIndex) + // { + // //base._Backspace(caretIndex); + // var caretLine = GetCaretLine(caretIndex); + // var caretCol = GetCaretColumn(caretIndex); + // RemoveText(caretLine, caretCol - 1, caretLine, caretCol); + // } + + public override void _HandleUnicodeInput(int unicodeChar, int caretIndex) + { + StartAction(EditAction.Typing); + string charStr = char.ConvertFromUtf32(unicodeChar); + InsertTextAtCaret(charStr, caretIndex); + var codeCompletionSelectedIndex = GetCodeCompletionSelectedIndex(); + var isCodeCompletionPopupOpen = codeCompletionSelectedIndex is not -1; + if (isCodeCompletionPopupOpen && charStr == " ") + { + //CancelCodeCompletion(); + Callable.From(() => CancelCodeCompletion()).CallDeferred(); + } + else if (isCodeCompletionPopupOpen is false && _codeCompletionTriggers.Contains(charStr, StringComparer.OrdinalIgnoreCase)) + { + // This is hopes and prayers that OnTextChanged has finished updating the document in the workspace... + //Callable.From(() => EmitSignalCodeCompletionRequested()).CallDeferred(); + Callable.From(() => RequestCodeCompletion(true)).CallDeferred(); + } + EndAction(); + } + diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_CustomHandleUnicodeInput.cs.uid b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_CustomHandleUnicodeInput.cs.uid new file mode 100644 index 0000000..9841bd5 --- /dev/null +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_CustomHandleUnicodeInput.cs.uid @@ -0,0 +1 @@ +uid://b4g2e2ug7fr7g