From 4b62395d69543df32d4dfeb383bdc5b264d1a499 Mon Sep 17 00:00:00 2001 From: Saas Date: Wed, 10 Dec 2025 18:41:57 +0100 Subject: [PATCH 1/4] add script obsolete icon to script editor --- .../CustomEditors/Dedicated/ActorEditor.cs | 2 +- .../CustomEditors/Dedicated/ScriptsEditor.cs | 27 ++++++++++++++++--- .../Elements/Container/GroupElement.cs | 8 +++--- .../Windows/Assets/MaterialInstanceWindow.cs | 2 +- .../Windows/Assets/SkinnedModelWindow.cs | 2 +- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs b/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs index d312f64b2..46c4066f2 100644 --- a/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs @@ -115,7 +115,7 @@ namespace FlaxEditor.CustomEditors.Dedicated { if (actor != null) group.Panel.TooltipText = Surface.SurfaceUtils.GetVisualScriptTypeDescription(TypeUtils.GetObjectType(actor)); - var settingsButton = group.AddSettingsButton(); + var settingsButton = group.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); settingsButton.Clicked += OnSettingsButtonClicked; break; } diff --git a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs index 954599347..ef7a137f6 100644 --- a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs @@ -640,7 +640,7 @@ namespace FlaxEditor.CustomEditors.Dedicated var group = layout.Group("Missing script"); // Add settings button to the group - var settingsButton = group.AddSettingsButton(); + var settingsButton = group.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); settingsButton.Tag = index; settingsButton.Clicked += MissingSettingsButtonOnClicked; } @@ -739,6 +739,8 @@ namespace FlaxEditor.CustomEditors.Dedicated /// public override void Initialize(LayoutElementsContainer layout) { + var _style = FlaxEngine.GUI.Style.Current; + // Area for drag&drop scripts var dragArea = layout.CustomContainer(); dragArea.CustomControl.ScriptsEditor = this; @@ -905,11 +907,30 @@ namespace FlaxEditor.CustomEditors.Dedicated }; // Add settings button to the group - var settingsButton = group.AddSettingsButton(); + var settingsButton = group.AddHeaderButton("Settings.", 0.0f, _style.Settings); settingsButton.Tag = script; settingsButton.Clicked += OnSettingsButtonClicked; - group.Panel.HeaderTextMargin = new Margin(scriptDrag.Right - 12, 15, 2, 2); + // Add script obsolete icon to the group + if (scriptType.HasAttribute(typeof(ObsoleteAttribute), false)) + { + ObsoleteAttribute attribute = null; + foreach (var e in scriptType.GetAttributes(false)) + { + if (e is not ObsoleteAttribute obsoleteAttribute) + continue; + attribute = obsoleteAttribute; + break; + } + + string tooltip = "Script marked as obsolete." + + (string.IsNullOrEmpty(attribute.Message) ? "" : $"\n{attribute.Message}") + + (string.IsNullOrEmpty(attribute.DiagnosticId) ? "" : $"\n{attribute.DiagnosticId}"); + var obsoleteButton = group.AddHeaderButton(tooltip, settingsButton.Width + FlaxEditor.Utilities.Constants.UIMargin, Editor.Instance.Icons.Info32); + obsoleteButton.Color = Color.Orange; + } + + group.Panel.HeaderTextMargin = new Margin(scriptDrag.Right - 12, 35, 2, 2); group.Object(values, editor); // Remove drop down arrows and containment lines if no objects in the group if (group.Children.Count == 0) diff --git a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs index 64bc9080b..e2db8b69e 100644 --- a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs +++ b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs @@ -40,21 +40,21 @@ namespace FlaxEditor.CustomEditors.Elements /// Adds utility settings button to the group header. /// /// The created control. - public Image AddSettingsButton() + public Image AddHeaderButton(string tooltipText, float xOffset, SpriteHandle sprite) { var style = Style.Current; var settingsButtonSize = Panel.HeaderHeight; return new Image { - TooltipText = "Settings", + TooltipText = tooltipText, AutoFocus = true, AnchorPreset = AnchorPresets.TopRight, Parent = Panel, - Bounds = new Rectangle(Panel.Width - settingsButtonSize, 0, settingsButtonSize, settingsButtonSize), + Bounds = new Rectangle(Panel.Width - settingsButtonSize - xOffset, 0, settingsButtonSize, settingsButtonSize), IsScrollable = false, Color = style.ForegroundGrey, Margin = new Margin(1), - Brush = new SpriteBrush(style.Settings), + Brush = new SpriteBrush(sprite), }; } } diff --git a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs index cb39930f9..b6b67e191 100644 --- a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs +++ b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs @@ -249,7 +249,7 @@ namespace FlaxEditor.Windows.Assets return; var parametersGroup = SurfaceUtils.InitGraphParametersGroup(layout); - var settingButton = parametersGroup.AddSettingsButton(); + var settingButton = parametersGroup.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); settingButton.Clicked += (image, button) => OnSettingsButtonClicked(image, button, proxy.Window); var baseMaterial = materialInstance.BaseMaterial; var material = baseMaterial; diff --git a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs index 392cc896a..073cf7614 100644 --- a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs +++ b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs @@ -284,7 +284,7 @@ namespace FlaxEditor.Windows.Assets var setupGroup = layout.Group(Path.GetFileNameWithoutExtension(sourceAsset.Path)); setupGroup.Panel.Tag = sourceAsset; setupGroup.Panel.MouseButtonRightClicked += OnPanelHeaderRightClicked; - var settingsButton = setupGroup.AddSettingsButton(); + var settingsButton = setupGroup.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); settingsButton.Tag = sourceAsset; settingsButton.Clicked += OnShowSetupSettings; From 0d8ac5b7acef060d6c880c311972a2a69d9518c5 Mon Sep 17 00:00:00 2001 From: Saas Date: Thu, 18 Dec 2025 12:17:22 +0100 Subject: [PATCH 2/4] implement review - Remove trailing tooltip "." - Add `AddSettingsButton` method - Simplify loop into LINQ expression --- .../Editor/CustomEditors/Dedicated/ActorEditor.cs | 2 +- .../Editor/CustomEditors/Dedicated/ScriptsEditor.cs | 13 +++---------- .../Elements/Container/GroupElement.cs | 11 ++++++++++- .../Editor/Windows/Assets/MaterialInstanceWindow.cs | 2 +- Source/Editor/Windows/Assets/SkinnedModelWindow.cs | 2 +- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs b/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs index 46c4066f2..d312f64b2 100644 --- a/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs @@ -115,7 +115,7 @@ namespace FlaxEditor.CustomEditors.Dedicated { if (actor != null) group.Panel.TooltipText = Surface.SurfaceUtils.GetVisualScriptTypeDescription(TypeUtils.GetObjectType(actor)); - var settingsButton = group.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); + var settingsButton = group.AddSettingsButton(); settingsButton.Clicked += OnSettingsButtonClicked; break; } diff --git a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs index ef7a137f6..49fa5e564 100644 --- a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs @@ -640,7 +640,7 @@ namespace FlaxEditor.CustomEditors.Dedicated var group = layout.Group("Missing script"); // Add settings button to the group - var settingsButton = group.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); + var settingsButton = group.AddSettingsButton(); settingsButton.Tag = index; settingsButton.Clicked += MissingSettingsButtonOnClicked; } @@ -907,21 +907,14 @@ namespace FlaxEditor.CustomEditors.Dedicated }; // Add settings button to the group - var settingsButton = group.AddHeaderButton("Settings.", 0.0f, _style.Settings); + var settingsButton = group.AddSettingsButton(); settingsButton.Tag = script; settingsButton.Clicked += OnSettingsButtonClicked; // Add script obsolete icon to the group if (scriptType.HasAttribute(typeof(ObsoleteAttribute), false)) { - ObsoleteAttribute attribute = null; - foreach (var e in scriptType.GetAttributes(false)) - { - if (e is not ObsoleteAttribute obsoleteAttribute) - continue; - attribute = obsoleteAttribute; - break; - } + ObsoleteAttribute attribute = (ObsoleteAttribute)scriptType.GetAttributes(false).First(x => x is ObsoleteAttribute); string tooltip = "Script marked as obsolete." + (string.IsNullOrEmpty(attribute.Message) ? "" : $"\n{attribute.Message}") + diff --git a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs index e2db8b69e..4c307a903 100644 --- a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs +++ b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs @@ -37,7 +37,16 @@ namespace FlaxEditor.CustomEditors.Elements public override ContainerControl ContainerControl => Panel; /// - /// Adds utility settings button to the group header. + /// Add utility settings button to the group header. + /// + /// The created control. + public Image AddSettingsButton() + { + return AddHeaderButton("Settings", 0, Style.Current.Settings); + } + + /// + /// Adds a button to the group header. /// /// The created control. public Image AddHeaderButton(string tooltipText, float xOffset, SpriteHandle sprite) diff --git a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs index b6b67e191..cb39930f9 100644 --- a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs +++ b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs @@ -249,7 +249,7 @@ namespace FlaxEditor.Windows.Assets return; var parametersGroup = SurfaceUtils.InitGraphParametersGroup(layout); - var settingButton = parametersGroup.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); + var settingButton = parametersGroup.AddSettingsButton(); settingButton.Clicked += (image, button) => OnSettingsButtonClicked(image, button, proxy.Window); var baseMaterial = materialInstance.BaseMaterial; var material = baseMaterial; diff --git a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs index 073cf7614..392cc896a 100644 --- a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs +++ b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs @@ -284,7 +284,7 @@ namespace FlaxEditor.Windows.Assets var setupGroup = layout.Group(Path.GetFileNameWithoutExtension(sourceAsset.Path)); setupGroup.Panel.Tag = sourceAsset; setupGroup.Panel.MouseButtonRightClicked += OnPanelHeaderRightClicked; - var settingsButton = setupGroup.AddHeaderButton("Settings.", 0.0f, FlaxEngine.GUI.Style.Current.Settings); + var settingsButton = setupGroup.AddSettingsButton(); settingsButton.Tag = sourceAsset; settingsButton.Clicked += OnShowSetupSettings; From 5b1ca13225001a01b52e18aea16ac646426f27d3 Mon Sep 17 00:00:00 2001 From: Saas Date: Thu, 18 Dec 2025 12:22:24 +0100 Subject: [PATCH 3/4] choose darker mouse over color --- Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs index 49fa5e564..5b068eed8 100644 --- a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs @@ -921,6 +921,7 @@ namespace FlaxEditor.CustomEditors.Dedicated (string.IsNullOrEmpty(attribute.DiagnosticId) ? "" : $"\n{attribute.DiagnosticId}"); var obsoleteButton = group.AddHeaderButton(tooltip, settingsButton.Width + FlaxEditor.Utilities.Constants.UIMargin, Editor.Instance.Icons.Info32); obsoleteButton.Color = Color.Orange; + obsoleteButton.MouseOverColor = Color.DarkOrange; } group.Panel.HeaderTextMargin = new Margin(scriptDrag.Right - 12, 35, 2, 2); From d8c90184b9c7c218620563cec2d4c5f39900711e Mon Sep 17 00:00:00 2001 From: Saas Date: Thu, 18 Dec 2025 17:19:41 +0100 Subject: [PATCH 4/4] add script only on prefab instance header button - add some padding to `AddHeaderButton()` - Add visual indicator (Header button) if script is only in prefab instance and not part of the prefab --- .../CustomEditors/Dedicated/ScriptsEditor.cs | 21 +++++++++++++++---- .../Elements/Container/GroupElement.cs | 3 ++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs index 5b068eed8..f9a03468b 100644 --- a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs @@ -852,7 +852,7 @@ namespace FlaxEditor.CustomEditors.Dedicated var title = Utilities.Utils.GetPropertyNameUI(scriptType.Name); var group = layout.Group(title, editor); if (!hasAllRequirements) - group.Panel.HeaderTextColor = FlaxEngine.GUI.Style.Current.Statusbar.Failed; + group.Panel.HeaderTextColor = _style.Statusbar.Failed; if ((Presenter.Features & FeatureFlags.CacheExpandedGroups) != 0) { if (Editor.Instance.ProjectCache.IsGroupToggled(title)) @@ -865,9 +865,10 @@ namespace FlaxEditor.CustomEditors.Dedicated group.Panel.Open(); // Customize + float totalHeaderButtonsOffset = 0f; group.Panel.TooltipText = Editor.Instance.CodeDocs.GetTooltip(scriptType); if (script.HasPrefabLink) - group.Panel.HeaderTextColor = FlaxEngine.GUI.Style.Current.ProgressNormal; + group.Panel.HeaderTextColor = _style.ProgressNormal; // Add toggle button to the group var headerHeight = group.Panel.HeaderHeight; @@ -891,7 +892,7 @@ namespace FlaxEditor.CustomEditors.Dedicated TooltipText = "Script reference.", AutoFocus = true, IsScrollable = false, - Color = FlaxEngine.GUI.Style.Current.ForegroundGrey, + Color = _style.ForegroundGrey, Parent = group.Panel, Bounds = new Rectangle(scriptToggle.Right, 0.5f, headerHeight, headerHeight), Margin = new Margin(1), @@ -910,6 +911,7 @@ namespace FlaxEditor.CustomEditors.Dedicated var settingsButton = group.AddSettingsButton(); settingsButton.Tag = script; settingsButton.Clicked += OnSettingsButtonClicked; + totalHeaderButtonsOffset += settingsButton.Width + FlaxEditor.Utilities.Constants.UIMargin; // Add script obsolete icon to the group if (scriptType.HasAttribute(typeof(ObsoleteAttribute), false)) @@ -919,9 +921,20 @@ namespace FlaxEditor.CustomEditors.Dedicated string tooltip = "Script marked as obsolete." + (string.IsNullOrEmpty(attribute.Message) ? "" : $"\n{attribute.Message}") + (string.IsNullOrEmpty(attribute.DiagnosticId) ? "" : $"\n{attribute.DiagnosticId}"); - var obsoleteButton = group.AddHeaderButton(tooltip, settingsButton.Width + FlaxEditor.Utilities.Constants.UIMargin, Editor.Instance.Icons.Info32); + var obsoleteButton = group.AddHeaderButton(tooltip, totalHeaderButtonsOffset, Editor.Instance.Icons.Info32); obsoleteButton.Color = Color.Orange; obsoleteButton.MouseOverColor = Color.DarkOrange; + totalHeaderButtonsOffset += obsoleteButton.Width; + } + + // Show visual indicator if script only exists in prefab instance and is not part of the prefab + bool isPrefabActor = scripts.Any(s => s.Actor.HasPrefabLink); + if (isPrefabActor && script.PrefabID == Guid.Empty) + { + var prefabInstanceButton = group.AddHeaderButton("Script only exists in this prefab instance.", totalHeaderButtonsOffset, Editor.Instance.Icons.Add32); + prefabInstanceButton.Color = _style.ProgressNormal; + prefabInstanceButton.MouseOverColor = _style.ProgressNormal * 0.9f; + totalHeaderButtonsOffset += prefabInstanceButton.Width; } group.Panel.HeaderTextMargin = new Margin(scriptDrag.Right - 12, 35, 2, 2); diff --git a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs index 4c307a903..0c757c484 100644 --- a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs +++ b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs @@ -52,6 +52,7 @@ namespace FlaxEditor.CustomEditors.Elements public Image AddHeaderButton(string tooltipText, float xOffset, SpriteHandle sprite) { var style = Style.Current; + const float padding = 2.0f; var settingsButtonSize = Panel.HeaderHeight; return new Image { @@ -59,7 +60,7 @@ namespace FlaxEditor.CustomEditors.Elements AutoFocus = true, AnchorPreset = AnchorPresets.TopRight, Parent = Panel, - Bounds = new Rectangle(Panel.Width - settingsButtonSize - xOffset, 0, settingsButtonSize, settingsButtonSize), + Bounds = new Rectangle(Panel.Width - settingsButtonSize - xOffset, padding * 0.5f, settingsButtonSize - padding, settingsButtonSize - padding), IsScrollable = false, Color = style.ForegroundGrey, Margin = new Margin(1),