From 2b0db40c17ae69910c8c54faffb17c8ecaa7f971 Mon Sep 17 00:00:00 2001
From: Menotdan <32620310+Menotdan@users.noreply.github.com>
Date: Thu, 12 Oct 2023 01:22:59 -0400
Subject: [PATCH 1/5] Add basic replacement functionality- replacing adds
multiple copies on child actors, however.
---
.../Dedicated/MissingScriptEditor.cs | 157 +++++++++++++++++-
1 file changed, 155 insertions(+), 2 deletions(-)
diff --git a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
index a6c4e6623..0af811074 100644
--- a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
+++ b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
@@ -1,6 +1,13 @@
-using FlaxEditor.CustomEditors.Editors;
+using FlaxEditor.Actions;
+using FlaxEditor.CustomEditors.Editors;
+using FlaxEditor.CustomEditors.GUI;
+using FlaxEditor.GUI;
+using FlaxEditor.GUI.ContextMenu;
+using FlaxEditor.Scripting;
using FlaxEngine;
using FlaxEngine.GUI;
+using System;
+using System.Collections.Generic;
namespace FlaxEditor.CustomEditors.Dedicated;
@@ -10,6 +17,11 @@ namespace FlaxEditor.CustomEditors.Dedicated;
[CustomEditor(typeof(MissingScript)), DefaultEditor]
public class MissingScriptEditor : GenericEditor
{
+ DropPanel _dropPanel;
+ Button _replaceScriptButton;
+ CheckBox _shouldReplaceAllCheckbox;
+ CustomEditor _propertiesEditor;
+
///
public override void Initialize(LayoutElementsContainer layout)
{
@@ -18,9 +30,150 @@ public class MissingScriptEditor : GenericEditor
base.Initialize(layout);
return;
}
+ _dropPanel = dropPanel;
+ _dropPanel.HeaderTextColor = Color.OrangeRed;
- dropPanel.HeaderTextColor = Color.OrangeRed;
+ Panel replaceScriptPanel = new Panel
+ {
+ Parent = _dropPanel,
+ Height = 64,
+ };
+
+ _replaceScriptButton = new Button
+ {
+ Text = "Replace Script",
+ AnchorPreset = AnchorPresets.TopCenter,
+ Width = 240,
+ Height = 24,
+ X = -120,
+ Y = 0,
+ Parent = replaceScriptPanel,
+ };
+ _replaceScriptButton.Clicked += OnReplaceScriptButtonClicked;
+
+ Label replaceAllLabel = new Label
+ {
+ Text = "Replace All of Same Type",
+ AnchorPreset = AnchorPresets.BottomCenter,
+ Y = -34,
+ Parent = replaceScriptPanel,
+ };
+ replaceAllLabel.X -= FlaxEngine.GUI.Style.Current.FontSmall.MeasureText(replaceAllLabel.Text).X;
+
+ _shouldReplaceAllCheckbox = new CheckBox
+ {
+ TooltipText = "Wether or not to apply this script change to all scripts missing the same type.",
+ AnchorPreset = AnchorPresets.BottomCenter,
+ Y = -34,
+ Parent = replaceScriptPanel,
+ };
+
+ float centerDifference = (_shouldReplaceAllCheckbox.Right - replaceAllLabel.Left) / 2;
+ replaceAllLabel.X += centerDifference;
+ _shouldReplaceAllCheckbox.X += centerDifference;
base.Initialize(layout);
}
+
+ private List FindActorsWithMatchingMissingScript(Actor parent = null)
+ {
+ List missingScripts = new List();
+ if (parent != null)
+ {
+ for (int child = 0; child < parent.ChildrenCount; child++)
+ {
+ Actor actor = parent.Children[child];
+ for (int scriptIndex = 0; scriptIndex < actor.ScriptsCount; scriptIndex++)
+ {
+ Script actorScript = actor.Scripts[scriptIndex];
+ if (actorScript is not MissingScript missingActorScript)
+ {
+ continue;
+ }
+
+ MissingScript currentMissing = Values[0] as MissingScript;
+ if (missingActorScript.MissingTypeName != currentMissing.MissingTypeName)
+ {
+ continue;
+ }
+
+ Debug.Log("Found correct missing script.");
+
+ // Matching MissingScript.
+ missingScripts.Add(missingActorScript);
+ }
+
+ missingScripts.AddRange(FindActorsWithMatchingMissingScript(actor));
+ }
+ } else
+ {
+ foreach (Actor actor in Level.GetActors())
+ {
+ missingScripts.AddRange(FindActorsWithMatchingMissingScript(actor));
+ }
+ }
+
+ return missingScripts;
+ }
+
+ private void ReplaceScript(ScriptType script, bool replaceAllInScene)
+ {
+ var actions = new List(4);
+
+ List missingScripts = new List();
+ if (!replaceAllInScene)
+ {
+ missingScripts.Add(Values[0] as MissingScript);
+ } else
+ {
+ missingScripts.AddRange(FindActorsWithMatchingMissingScript());
+ }
+
+ foreach (MissingScript missingScript in missingScripts)
+ {
+ actions.Add(AddRemoveScript.Add(missingScript.Actor, script));
+ actions.Add(AddRemoveScript.Remove(missingScript));
+ }
+
+ if (actions.Count == 0)
+ {
+ Editor.LogWarning("Failed to replace scripts!");
+ return;
+ }
+
+ var multiAction = new MultiUndoAction(actions);
+ multiAction.Do();
+ var presenter = ParentEditor.Presenter;
+ if (presenter != null)
+ {
+ presenter.Undo.AddAction(multiAction);
+ presenter.Control.Focus();
+ }
+ }
+
+ private void OnReplaceScriptButtonClicked()
+ {
+ var scripts = Editor.Instance.CodeEditing.Scripts.Get();
+ if (scripts.Count == 0)
+ {
+ // No scripts
+ var cm1 = new ContextMenu();
+ cm1.AddButton("No scripts in project");
+ cm1.Show(_dropPanel, _replaceScriptButton.BottomLeft);
+ return;
+ }
+
+ // Show context menu with list of scripts to add
+ var cm = new ItemsListContextMenu(180);
+ for (int i = 0; i < scripts.Count; i++)
+ {
+ cm.AddItem(new TypeSearchPopup.TypeItemView(scripts[i]));
+ }
+ // Get the parent (actor properties editor) of the parent (Scripts Editor) of our editor.
+ _propertiesEditor = ParentEditor.ParentEditor;
+
+ cm.ItemClicked += item => ReplaceScript((ScriptType)item.Tag, _shouldReplaceAllCheckbox.Checked);
+ cm.SortItems();
+ cm.Show(_dropPanel, _replaceScriptButton.BottomLeft - new Float2((cm.Width - _replaceScriptButton.Width) / 2, 0));
+ }
}
From 7742f2d8d4b268537ce8a37698bcf23df4d7061a Mon Sep 17 00:00:00 2001
From: Menotdan <32620310+Menotdan@users.noreply.github.com>
Date: Thu, 12 Oct 2023 01:26:25 -0400
Subject: [PATCH 2/5] Add debugging logs.
---
Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
index 0af811074..3f9c9cf76 100644
--- a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
+++ b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
@@ -97,7 +97,7 @@ public class MissingScriptEditor : GenericEditor
continue;
}
- Debug.Log("Found correct missing script.");
+ Debug.Log($"Found correct missing script: {actor.Name}, {missingActorScript}, {missingScripts.Count}.");
// Matching MissingScript.
missingScripts.Add(missingActorScript);
From 318f9e5b774618074984d1d8346c574c48bfce2c Mon Sep 17 00:00:00 2001
From: Menotdan <32620310+Menotdan@users.noreply.github.com>
Date: Thu, 12 Oct 2023 01:33:22 -0400
Subject: [PATCH 3/5] Fix duplicated script replacement.
---
.../Dedicated/MissingScriptEditor.cs | 43 +++++++------------
1 file changed, 15 insertions(+), 28 deletions(-)
diff --git a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
index 3f9c9cf76..13569a891 100644
--- a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
+++ b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
@@ -75,41 +75,28 @@ public class MissingScriptEditor : GenericEditor
base.Initialize(layout);
}
- private List FindActorsWithMatchingMissingScript(Actor parent = null)
+ private List FindActorsWithMatchingMissingScript()
{
List missingScripts = new List();
- if (parent != null)
+
+ foreach (Actor actor in Level.GetActors())
{
- for (int child = 0; child < parent.ChildrenCount; child++)
+ for (int scriptIndex = 0; scriptIndex < actor.ScriptsCount; scriptIndex++)
{
- Actor actor = parent.Children[child];
- for (int scriptIndex = 0; scriptIndex < actor.ScriptsCount; scriptIndex++)
+ Script actorScript = actor.Scripts[scriptIndex];
+ if (actorScript is not MissingScript missingActorScript)
{
- Script actorScript = actor.Scripts[scriptIndex];
- if (actorScript is not MissingScript missingActorScript)
- {
- continue;
- }
-
- MissingScript currentMissing = Values[0] as MissingScript;
- if (missingActorScript.MissingTypeName != currentMissing.MissingTypeName)
- {
- continue;
- }
-
- Debug.Log($"Found correct missing script: {actor.Name}, {missingActorScript}, {missingScripts.Count}.");
-
- // Matching MissingScript.
- missingScripts.Add(missingActorScript);
+ continue;
}
- missingScripts.AddRange(FindActorsWithMatchingMissingScript(actor));
- }
- } else
- {
- foreach (Actor actor in Level.GetActors())
- {
- missingScripts.AddRange(FindActorsWithMatchingMissingScript(actor));
+ MissingScript currentMissing = Values[0] as MissingScript;
+ if (missingActorScript.MissingTypeName != currentMissing.MissingTypeName)
+ {
+ continue;
+ }
+
+ // Matching MissingScript.
+ missingScripts.Add(missingActorScript);
}
}
From a8260ed8b68ff5052972489b8046c4cf39ecc835 Mon Sep 17 00:00:00 2001
From: Menotdan <32620310+Menotdan@users.noreply.github.com>
Date: Thu, 12 Oct 2023 12:00:27 -0400
Subject: [PATCH 4/5] Fixed Serialization Transfer.
---
.../Dedicated/MissingScriptEditor.cs | 56 +++++++++++++------
.../Undo/Actions/AddRemoveScriptAction.cs | 6 ++
2 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
index 13569a891..3f62efae3 100644
--- a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
+++ b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
@@ -103,25 +103,8 @@ public class MissingScriptEditor : GenericEditor
return missingScripts;
}
- private void ReplaceScript(ScriptType script, bool replaceAllInScene)
+ private void RunReplacementMulticast(List actions)
{
- var actions = new List(4);
-
- List missingScripts = new List();
- if (!replaceAllInScene)
- {
- missingScripts.Add(Values[0] as MissingScript);
- } else
- {
- missingScripts.AddRange(FindActorsWithMatchingMissingScript());
- }
-
- foreach (MissingScript missingScript in missingScripts)
- {
- actions.Add(AddRemoveScript.Add(missingScript.Actor, script));
- actions.Add(AddRemoveScript.Remove(missingScript));
- }
-
if (actions.Count == 0)
{
Editor.LogWarning("Failed to replace scripts!");
@@ -138,6 +121,43 @@ public class MissingScriptEditor : GenericEditor
}
}
+ private void ReplaceScript(ScriptType script, bool replaceAllInScene)
+ {
+ var actions = new List(4);
+
+ List missingScripts = new List();
+ if (!replaceAllInScene)
+ {
+ missingScripts.Add(Values[0] as MissingScript);
+ } else
+ {
+ missingScripts = FindActorsWithMatchingMissingScript();
+ }
+
+ foreach (MissingScript missingScript in missingScripts)
+ {
+ AddRemoveScript addReplacementScriptAction = AddRemoveScript.Add(missingScript.Actor, script);
+ actions.Add(addReplacementScriptAction);
+ }
+ RunReplacementMulticast(actions);
+
+ for (int actionIdx = 0; actionIdx < actions.Count; actionIdx++)
+ {
+ AddRemoveScript addRemoveScriptAction = (AddRemoveScript) actions[actionIdx];
+ int orderInParent = addRemoveScriptAction.GetOrderInParent();
+
+ Script newScript = missingScripts[actionIdx].Actor.Scripts[orderInParent];
+ missingScripts[actionIdx].ReferenceScript = newScript;
+ }
+ actions.Clear();
+
+ foreach (MissingScript missingScript in missingScripts)
+ {
+ actions.Add(AddRemoveScript.Remove(missingScript));
+ }
+ RunReplacementMulticast(actions);
+ }
+
private void OnReplaceScriptButtonClicked()
{
var scripts = Editor.Instance.CodeEditing.Scripts.Get();
diff --git a/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs b/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs
index a5710494c..86afd4c0b 100644
--- a/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs
+++ b/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs
@@ -75,6 +75,11 @@ namespace FlaxEditor.Actions
_enabled = true;
}
+ public int GetOrderInParent()
+ {
+ return _orderInParent;
+ }
+
///
/// Creates a new added script undo action.
///
@@ -184,6 +189,7 @@ namespace FlaxEditor.Actions
script.Parent = parentActor;
if (_orderInParent != -1)
script.OrderInParent = _orderInParent;
+ _orderInParent = script.OrderInParent; // Ensure _orderInParent is correct for script that want to use it.
if (_prefabObjectId != Guid.Empty)
SceneObject.Internal_LinkPrefab(Object.GetUnmanagedPtr(script), ref _prefabId, ref _prefabObjectId);
Editor.Instance.Scene.MarkSceneEdited(parentActor.Scene);
From a7b2230ef4848e307f35772edef72a620301fdb4 Mon Sep 17 00:00:00 2001
From: Menotdan <32620310+Menotdan@users.noreply.github.com>
Date: Thu, 12 Oct 2023 12:23:18 -0400
Subject: [PATCH 5/5] Remove unneeded using
---
Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs | 2 --
1 file changed, 2 deletions(-)
diff --git a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
index 3f62efae3..8c8c76561 100644
--- a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
+++ b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs
@@ -1,12 +1,10 @@
using FlaxEditor.Actions;
using FlaxEditor.CustomEditors.Editors;
-using FlaxEditor.CustomEditors.GUI;
using FlaxEditor.GUI;
using FlaxEditor.GUI.ContextMenu;
using FlaxEditor.Scripting;
using FlaxEngine;
using FlaxEngine.GUI;
-using System;
using System.Collections.Generic;
namespace FlaxEditor.CustomEditors.Dedicated;