using System.Text.RegularExpressions; using Godot; namespace DScript.GodotEditor { /// <summary> /// 代码提示管理类 /// </summary> public static class CodeHintManager { /// <summary> /// 是否使用 enter 输入过代码 /// </summary> internal static bool EnterInput = false; /// <summary> /// 按下快捷键 ctrl + / 触发显示提示面板 /// </summary> [EditorShortcutKey(KeyList.Slash, Ctrl = true)] private static void TriggerInput() { var textEditor = CodeTextEdit.CurrentTextEdit; if (textEditor != null && textEditor.HasFocus()) { RequestSyntaxTree(textEditor); } } /// <summary> /// 触发编辑器输入 /// </summary> /// <param name="textEdit">当前活动的编辑器</param> public static void TriggerInput(CodeTextEdit textEdit) { var column = textEdit.CursorGetColumn(); if (column > 0) { var line = textEdit.CursorGetLine(); var str = textEdit.GetTextInRange(line, column - 1, line, column); //判断前一个字符串是否能触发提示 if (Regex.IsMatch(str, "[\\.\\w]")) { RequestSyntaxTree(textEdit); } } } /// <summary> /// 结束输入, 关闭提示弹窗 /// </summary> public static void OverInput() { CodeHintPanel.Instance.HidePanel(); } /// <summary> /// 返回提示面板是否显示 /// </summary> public static bool IsShowPanel() { return CodeHintPanel.Instance.Visible; } /// <summary> /// 显示提示面板 /// </summary> private static void ShowPanel(CodeTextEdit textEdit) { //先确定面板位置 var line = textEdit.CursorGetLine(); var column = textEdit.CursorGetColumn(); Vector2 pos = textEdit.EditPainter.ToPainterPosition( textEdit.GetPosAtLineColumn(line, column == 0 ? 0 : (column - 1))); CodeHintPanel.Instance.ShowPanel(textEdit, pos); } /// <summary> /// 请求语法树, 结合上下文, 判断是否能弹出 /// </summary> private static void RequestSyntaxTree(CodeTextEdit textEdit) { ShowPanel(textEdit); } } }