From 73c22b75ea2ce7a6d1583123592cae9ecc705cde Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Wed, 22 Dec 2021 10:55:42 +0100 Subject: [PATCH] Add Code Docs module for Editor tooltips --- .../CustomEditors/Dedicated/ScriptsEditor.cs | 6 +-- Source/Editor/Editor.cs | 8 ++- Source/Editor/GUI/EnumComboBox.cs | 10 ++-- Source/Editor/GUI/Popups/TypeSearchPopup.cs | 8 +-- .../SourceCodeEditing/CodeDocsModule.cs | 54 +++++++++++++++++++ Source/Editor/Surface/AnimGraphSurface.cs | 17 ++---- Source/Editor/Surface/Archetypes/Function.cs | 5 +- Source/Editor/Surface/SurfaceUtils.cs | 14 ++--- Source/Editor/Surface/VisualScriptSurface.cs | 22 ++------ .../Windows/Assets/VisualScriptWindow.cs | 5 +- 10 files changed, 81 insertions(+), 68 deletions(-) create mode 100644 Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs diff --git a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs index 08b44f46a..9d9024a7c 100644 --- a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs @@ -625,11 +625,7 @@ namespace FlaxEditor.CustomEditors.Dedicated group.Panel.Open(false); // Customize - var typeAttributes = scriptType.GetAttributes(false); - group.Panel.TooltipText = scriptType.TypeName; - var tooltip = (TooltipAttribute)typeAttributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltip != null) - group.Panel.TooltipText += '\n' + tooltip.Text; + group.Panel.TooltipText = Editor.Instance.CodeDocs.GetTooltip(scriptType); if (script.HasPrefabLink) group.Panel.HeaderTextColor = FlaxEngine.GUI.Style.Current.ProgressNormal; diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 21bebfd65..20c6a5464 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -142,10 +142,15 @@ namespace FlaxEditor public readonly ContentFindingModule ContentFinding; /// - /// The content editing + /// The scripts editing /// public readonly CodeEditingModule CodeEditing; + /// + /// The scripts documentation + /// + public readonly CodeDocsModule CodeDocs; + /// /// The editor state machine. /// @@ -237,6 +242,7 @@ namespace FlaxEditor RegisterModule(ContentDatabase = new ContentDatabaseModule(this)); RegisterModule(ContentImporting = new ContentImportingModule(this)); RegisterModule(CodeEditing = new CodeEditingModule(this)); + RegisterModule(CodeDocs = new CodeDocsModule(this)); RegisterModule(ProgressReporting = new ProgressReportingModule(this)); RegisterModule(ContentFinding = new ContentFindingModule(this)); diff --git a/Source/Editor/GUI/EnumComboBox.cs b/Source/Editor/GUI/EnumComboBox.cs index ed1c80cd6..96fd474de 100644 --- a/Source/Editor/GUI/EnumComboBox.cs +++ b/Source/Editor/GUI/EnumComboBox.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Reflection; using FlaxEditor.CustomEditors; using FlaxEditor.CustomEditors.Elements; +using FlaxEditor.Scripting; using FlaxEngine; namespace FlaxEditor.GUI @@ -245,7 +246,7 @@ namespace FlaxEditor.GUI if (field.Name.Equals("value__", StringComparison.Ordinal)) continue; - var attributes = (Attribute[])field.GetCustomAttributes(); + var attributes = field.GetCustomAttributes(false); if (attributes.Any(x => x is HideInEditorAttribute)) continue; @@ -269,12 +270,7 @@ namespace FlaxEditor.GUI } } - string tooltip = null; - var tooltipAttr = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttr != null) - { - tooltip = tooltipAttr.Text; - } + string tooltip = Editor.Instance.CodeDocs.GetTooltip(new ScriptMemberInfo(field), attributes); entries.Add(new Entry(name, Convert.ToInt64(field.GetRawConstantValue()), tooltip)); } diff --git a/Source/Editor/GUI/Popups/TypeSearchPopup.cs b/Source/Editor/GUI/Popups/TypeSearchPopup.cs index 71a97ed05..b79c1a503 100644 --- a/Source/Editor/GUI/Popups/TypeSearchPopup.cs +++ b/Source/Editor/GUI/Popups/TypeSearchPopup.cs @@ -46,14 +46,8 @@ namespace FlaxEditor.GUI _type = type; Name = type.Name; - TooltipText = type.TypeName; + TooltipText = Editor.Instance.CodeDocs.GetTooltip(type, attributes); Tag = type; - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - { - TooltipText += '\n'; - TooltipText += tooltipAttribute.Text; - } var categoryAttribute = (CategoryAttribute)attributes.FirstOrDefault(x => x is CategoryAttribute); if (categoryAttribute != null) { diff --git a/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs new file mode 100644 index 000000000..d8a5cc0a2 --- /dev/null +++ b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs @@ -0,0 +1,54 @@ +// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. + +using System.Linq; +using FlaxEditor.Scripting; +using FlaxEngine; + +namespace FlaxEditor.Modules.SourceCodeEditing +{ + /// + /// Source code documentation module. + /// + /// + public sealed class CodeDocsModule : EditorModule + { + internal CodeDocsModule(Editor editor) + : base(editor) + { + } + + /// + /// Gets the tooltip text for the type. + /// + /// The type. + /// The type attributes. Optional, if null type attributes will be used. + /// The documentation tooltip. + public string GetTooltip(ScriptType type, object[] attributes = null) + { + if (attributes == null) + attributes = type.GetAttributes(false); + var text = type.TypeName; + var tooltip = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); + if (tooltip != null) + text += '\n' + tooltip.Text; + return text; + } + + /// + /// Gets the tooltip text for the type. + /// + /// The type. + /// The type attributes. Optional, if null type attributes will be used. + /// The documentation tooltip. + public string GetTooltip(ScriptMemberInfo type, object[] attributes = null) + { + if (attributes == null) + attributes = type.GetAttributes(true); + string text = null; + var tooltip = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); + if (tooltip != null) + text = tooltip.Text; + return text; + } + } +} diff --git a/Source/Editor/Surface/AnimGraphSurface.cs b/Source/Editor/Surface/AnimGraphSurface.cs index c2339e515..b9b008ee6 100644 --- a/Source/Editor/Surface/AnimGraphSurface.cs +++ b/Source/Editor/Surface/AnimGraphSurface.cs @@ -164,11 +164,7 @@ namespace FlaxEditor.Surface node.DefaultValues[0] = Activator.CreateInstance(scriptType.Type); node.Flags &= ~NodeFlags.NoSpawnViaGUI; node.Title = scriptTypeName; - node.Description = scriptTypeTypeName; - var attributes = scriptType.GetAttributes(false); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - node.Description += "\n" + tooltipAttribute.Text; + node.Description = Editor.Instance.CodeDocs.GetTooltip(scriptType); // Create group archetype var groupKey = new KeyValuePair(scriptTypeName, 2); @@ -211,17 +207,14 @@ namespace FlaxEditor.Surface _cache.Add(groupKey, group); } - var attributes = scriptType.GetAttributes(false); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); + var tooltip = Editor.Instance.CodeDocs.GetTooltip(scriptType); // Create Pack node archetype var node = (NodeArchetype)Archetypes.Packing.Nodes[6].Clone(); node.DefaultValues[0] = scriptTypeTypeName; node.Flags &= ~NodeFlags.NoSpawnViaGUI; node.Title = "Pack " + scriptTypeName; - node.Description = scriptTypeTypeName; - if (tooltipAttribute != null) - node.Description += "\n" + tooltipAttribute.Text; + node.Description = tooltip; ((IList)group.Archetypes).Add(node); // Create Unpack node archetype @@ -229,9 +222,7 @@ namespace FlaxEditor.Surface node.DefaultValues[0] = scriptTypeTypeName; node.Flags &= ~NodeFlags.NoSpawnViaGUI; node.Title = "Unpack " + scriptTypeName; - node.Description = scriptTypeTypeName; - if (tooltipAttribute != null) - node.Description += "\n" + tooltipAttribute.Text; + node.Description = tooltip; ((IList)group.Archetypes).Add(node); } } diff --git a/Source/Editor/Surface/Archetypes/Function.cs b/Source/Editor/Surface/Archetypes/Function.cs index 1fd061dcc..3b393b1f4 100644 --- a/Source/Editor/Surface/Archetypes/Function.cs +++ b/Source/Editor/Surface/Archetypes/Function.cs @@ -537,10 +537,7 @@ namespace FlaxEditor.Surface.Archetypes if (methodInfo) { // Update tooltip - var attributes = methodInfo.GetAttributes(true); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - TooltipText = tooltipAttribute.Text; + TooltipText = Editor.Instance.CodeDocs.GetTooltip(methodInfo); // Generate signature from the method info MakeBox(0, string.Empty, typeof(void), true); diff --git a/Source/Editor/Surface/SurfaceUtils.cs b/Source/Editor/Surface/SurfaceUtils.cs index ead59f918..55e226bff 100644 --- a/Source/Editor/Surface/SurfaceUtils.cs +++ b/Source/Editor/Surface/SurfaceUtils.cs @@ -437,12 +437,7 @@ namespace FlaxEditor.Surface sb.Append("static "); else if (type.IsAbstract) sb.Append("abstract "); - sb.Append(type.TypeName); - - var attributes = type.GetAttributes(false); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - sb.Append("\n").Append(tooltipAttribute.Text); + sb.Append(Editor.Instance.CodeDocs.GetTooltip(type)); return sb.ToString(); } @@ -502,10 +497,9 @@ namespace FlaxEditor.Surface } // Tooltip - var attributes = member.GetAttributes(); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - sb.Append("\n").Append(tooltipAttribute.Text); + var tooltip = Editor.Instance.CodeDocs.GetTooltip(member); + if (!string.IsNullOrEmpty(tooltip)) + sb.Append("\n").Append(tooltip); return sb.ToString(); } diff --git a/Source/Editor/Surface/VisualScriptSurface.cs b/Source/Editor/Surface/VisualScriptSurface.cs index b919c7c37..1c4d6c9a7 100644 --- a/Source/Editor/Surface/VisualScriptSurface.cs +++ b/Source/Editor/Surface/VisualScriptSurface.cs @@ -132,11 +132,7 @@ namespace FlaxEditor.Surface node.DefaultValues[0] = Activator.CreateInstance(scriptType.Type); node.Flags &= ~NodeFlags.NoSpawnViaGUI; node.Title = scriptTypeName; - node.Description = scriptTypeTypeName; - var attributes = scriptType.GetAttributes(false); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - node.Description += "\n" + tooltipAttribute.Text; + node.Description = Editor.Instance.CodeDocs.GetTooltip(scriptType); // Create group archetype var groupKey = new KeyValuePair(scriptTypeName, 2); @@ -179,17 +175,14 @@ namespace FlaxEditor.Surface _cache.Add(groupKey, group); } - var attributes = scriptType.GetAttributes(false); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); + var tooltip = Editor.Instance.CodeDocs.GetTooltip(scriptType); // Create Pack node archetype var node = (NodeArchetype)Archetypes.Packing.Nodes[6].Clone(); node.DefaultValues[0] = scriptTypeTypeName; node.Flags &= ~NodeFlags.NoSpawnViaGUI; node.Title = "Pack " + scriptTypeName; - node.Description = scriptTypeTypeName; - if (tooltipAttribute != null) - node.Description += "\n" + tooltipAttribute.Text; + node.Description = tooltip; ((IList)group.Archetypes).Add(node); // Create Unpack node archetype @@ -197,9 +190,7 @@ namespace FlaxEditor.Surface node.DefaultValues[0] = scriptTypeTypeName; node.Flags &= ~NodeFlags.NoSpawnViaGUI; node.Title = "Unpack " + scriptTypeName; - node.Description = scriptTypeTypeName; - if (tooltipAttribute != null) - node.Description += "\n" + tooltipAttribute.Text; + node.Description = tooltip; ((IList)group.Archetypes).Add(node); } @@ -580,10 +571,7 @@ namespace FlaxEditor.Surface var node = (NodeArchetype)Archetypes.Function.Nodes[2].Clone(); node.Flags &= ~NodeFlags.NoSpawnViaGUI; - var attributes = member.GetAttributes(true); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - node.Description = tooltipAttribute.Text; + node.Description = Editor.Instance.CodeDocs.GetTooltip(member); node.DefaultValues[0] = name; node.DefaultValues[1] = parameters.Length; node.Title = "Override " + name; diff --git a/Source/Editor/Windows/Assets/VisualScriptWindow.cs b/Source/Editor/Windows/Assets/VisualScriptWindow.cs index 76e0b8797..4abb1e7b5 100644 --- a/Source/Editor/Windows/Assets/VisualScriptWindow.cs +++ b/Source/Editor/Windows/Assets/VisualScriptWindow.cs @@ -447,10 +447,7 @@ namespace FlaxEditor.Windows.Assets continue; var cmButton = cm.AddButton($"{name} (in {member.DeclaringType.Name})"); - var attributes = member.GetAttributes(true); - var tooltipAttribute = (TooltipAttribute)attributes.FirstOrDefault(x => x is TooltipAttribute); - if (tooltipAttribute != null) - cmButton.TooltipText = tooltipAttribute.Text; + cmButton.TooltipText = Editor.Instance.CodeDocs.GetTooltip(member); cmButton.Clicked += () => { var surface = ((VisualScriptWindow)Values[0]).Surface;