Newer
Older
DungeonShooting / DungeonShooting_Godot / editor / src / CodeHintManager.cs
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);
        }
    }
}