- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using Godot;
- namespace DScript.GodotEditor
- {
- /// <summary>
- /// 编辑器类
- /// </summary>
- public class Editor : Control
- {
- private class ShortcutKeyData
- {
- public int key;
- public bool ctrl;
- public bool shift;
- public bool alt;
- public MethodInfo methodInfo;
- public bool isPressed;
- }
- /// <summary>
- /// 获取编辑器实例
- /// </summary>
- public static Editor Instance => _instance;
- private static Editor _instance;
- private List<ShortcutKeyData> _shortcutKeyMethods = new List<ShortcutKeyData>();
- public Editor()
- {
- _instance = this;
- }
- public override void _Ready()
- {
- ScannerAssembly();
- }
- public override void _Process(float delta)
- {
- if (Input.IsKeyPressed((int)KeyList.Control))
- {
- }
- }
- public override void _Input(InputEvent @event)
- {
- if (!Visible)
- {
- return;
- }
- if (@event is InputEventKey eventKey)
- {
- uint key = eventKey.Scancode;
- //检测快捷键
- if (key != (int)KeyList.Control && key != (int)KeyList.Shift && key != (int)KeyList.Alt)
- {
- for (int i = 0; i < _shortcutKeyMethods.Count; i++)
- {
- var item = _shortcutKeyMethods[i];
- var flag = key == item.key && eventKey.Pressed && item.ctrl == eventKey.Control &&
- item.shift == eventKey.Shift && item.alt == eventKey.Alt;
- if (flag)
- {
- //触发快捷键调用
- if (!item.isPressed)
- {
- item.isPressed = true;
- item.methodInfo.Invoke(null, new object[0]);
- }
- }
- else
- {
- item.isPressed = false;
- }
- }
- }
- }
- }
- /// <summary>
- /// 扫描程序集, 并完成注册标记
- /// </summary>
- private void ScannerAssembly()
- {
- var types = GetType().Assembly.GetTypes();
- foreach (var type in types)
- {
- if (type.Namespace == null || !type.Namespace.StartsWith("DScript.GodotEditor")) continue;
- MethodInfo[] methods =
- type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
- foreach (var method in methods)
- {
- Attribute mAttribute;
- //快捷键注册
- if ((mAttribute = Attribute.GetCustomAttribute(method, typeof(EditorShortcutKey), false)) !=
- null)
- {
- var att = (EditorShortcutKey)mAttribute;
- var data = new ShortcutKeyData();
- data.key = (int)att.Key;
- data.methodInfo = method;
- data.shift = att.Shift;
- data.ctrl = att.Ctrl;
- data.alt = att.Alt;
- _shortcutKeyMethods.Add(data);
- }
- }
- }
- }
- }
- }