Newer
Older
DungeonShooting / DungeonShooting_Godot / editor / src / CodeHintManager.cs
  1. using System.Text.RegularExpressions;
  2. using Godot;
  3.  
  4. namespace DScript.GodotEditor
  5. {
  6. /// <summary>
  7. /// 代码提示管理类
  8. /// </summary>
  9. public static class CodeHintManager
  10. {
  11. /// <summary>
  12. /// 是否使用 enter 输入过代码
  13. /// </summary>
  14. internal static bool EnterInput = false;
  15.  
  16. /// <summary>
  17. /// 按下快捷键 ctrl + / 触发显示提示面板
  18. /// </summary>
  19. [EditorShortcutKey(KeyList.Slash, Ctrl = true)]
  20. private static void TriggerInput()
  21. {
  22. var textEditor = CodeTextEdit.CurrentTextEdit;
  23. if (textEditor != null && textEditor.HasFocus())
  24. {
  25. RequestSyntaxTree(textEditor);
  26. }
  27. }
  28.  
  29. /// <summary>
  30. /// 触发编辑器输入
  31. /// </summary>
  32. /// <param name="textEdit">当前活动的编辑器</param>
  33. public static void TriggerInput(CodeTextEdit textEdit)
  34. {
  35. var column = textEdit.CursorGetColumn();
  36. if (column > 0)
  37. {
  38. var line = textEdit.CursorGetLine();
  39. var str = textEdit.GetTextInRange(line, column - 1, line, column);
  40. //判断前一个字符串是否能触发提示
  41. if (Regex.IsMatch(str, "[\\.\\w]"))
  42. {
  43. RequestSyntaxTree(textEdit);
  44. }
  45. }
  46. }
  47.  
  48. /// <summary>
  49. /// 结束输入, 关闭提示弹窗
  50. /// </summary>
  51. public static void OverInput()
  52. {
  53. CodeHintPanel.Instance.HidePanel();
  54. }
  55.  
  56. /// <summary>
  57. /// 返回提示面板是否显示
  58. /// </summary>
  59. public static bool IsShowPanel()
  60. {
  61. return CodeHintPanel.Instance.Visible;
  62. }
  63.  
  64. /// <summary>
  65. /// 显示提示面板
  66. /// </summary>
  67. private static void ShowPanel(CodeTextEdit textEdit)
  68. {
  69. //先确定面板位置
  70. var line = textEdit.CursorGetLine();
  71. var column = textEdit.CursorGetColumn();
  72.  
  73. Vector2 pos =
  74. textEdit.EditPainter.ToPainterPosition(
  75. textEdit.GetPosAtLineColumn(line, column == 0 ? 0 : (column - 1)));
  76. CodeHintPanel.Instance.ShowPanel(textEdit, pos);
  77. }
  78.  
  79. /// <summary>
  80. /// 请求语法树, 结合上下文, 判断是否能弹出
  81. /// </summary>
  82. private static void RequestSyntaxTree(CodeTextEdit textEdit)
  83. {
  84. ShowPanel(textEdit);
  85. }
  86. }
  87. }