Skip to content

Commit 9849138

Browse files
author
Unity Technologies
committed
Unity 6000.0.5f1 C# reference source code
1 parent b44c4cc commit 9849138

File tree

45 files changed

+910
-195
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+910
-195
lines changed

Editor/Mono/EditorUtility.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using UnityEngine.Internal;
1616
using UnityEngine.SceneManagement;
1717
using Object = UnityEngine.Object;
18+
using UnityEditor.ShortcutManagement;
1819

1920
namespace UnityEditor
2021
{
@@ -409,6 +410,8 @@ internal static void ResetMouseDown()
409410
{
410411
Tools.s_ButtonDown = -1;
411412
GUIUtility.hotControl = 0;
413+
//Delay call because the freezing of the editor is affecting the active clutch shortcuts resetting properly
414+
EditorApplication.delayCall += () => ShortcutIntegration.instance.trigger.ResetActiveClutches();
412415
}
413416

414417
internal static void DisplayCustomMenu(Rect position, string[] options, int[] selected, SelectMenuItemFunction callback, object userData)

Editor/Mono/Inspector/DirectorEditor.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,13 @@ public override void OnInspectorGUI()
135135
CurrentTimeField();
136136
}
137137

138-
if (targets.Length == 1)
139-
DoDirectorBindingInspector();
140-
141138
if (serializedObject.ApplyModifiedProperties())
142139
{
143140
m_DirtySceneBindings = true;
144141
}
142+
143+
if (targets.Length == 1)
144+
DoDirectorBindingInspector();
145145
}
146146

147147
private bool PlayableAssetOutputsChanged()
@@ -175,6 +175,8 @@ private void DoDirectorBindingInspector()
175175
SynchronizeSceneBindings();
176176
}
177177

178+
serializedObject.Update();
179+
178180
EditorGUILayout.BeginHorizontal();
179181

180182
var rect = GUILayoutUtility.GetRect(EditorGUIUtility.fieldWidth, EditorGUIUtility.fieldWidth, EditorGUI.kSingleLineHeight, EditorGUI.kSingleLineHeight, EditorStyles.foldout);
@@ -201,6 +203,8 @@ private void DoDirectorBindingInspector()
201203
m_BindingList.DoLayoutList();
202204
EditorGUI.indentLevel--;
203205
}
206+
207+
serializedObject.ApplyModifiedProperties();
204208
}
205209

206210
PlayableBinding FindBinding(PlayableAsset source, UnityEngine.Object key)
@@ -308,8 +312,6 @@ private void UpdatePlayableBindingsIfRequired(PlayableAsset playableAsset, Playa
308312
else if (!director.HasGenericBinding(binding.sourceObject))
309313
director.SetGenericBinding(binding.sourceObject, null);
310314
}
311-
312-
serializedObject.Update();
313315
}
314316

315317
// To show the current time field in play mode

Editor/Mono/Inspector/EditorElementUpdater.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ public void CreateInspectorElementsForViewport(ScrollView viewport, VisualElemen
103103
element.CreateInspectorElement();
104104

105105
// If this element contributes to the layout, re-compute it immediately to determine how much of the viewport is occupied.
106-
if (null != element.editor && InternalEditorUtility.GetIsInspectorExpanded(element.editor.target))
106+
if (null != element.editor && InternalEditorUtility.GetIsInspectorExpanded(element.editor.target)&& contentContainer.childCount>0)
107107
{
108108
Panel?.UpdateWithoutRepaint();
109109

110-
if (contentContainer.ElementAt(m_Index - 1).layout.yMax - scroll > viewport.layout.height)
110+
if (contentContainer.ElementAt(contentContainer.childCount - 1).layout.yMax - scroll > viewport.layout.height)
111111
break;
112112
}
113113
}

Editor/Mono/Inspector/PlayerSettingsEditor/PlayerSettingsEditor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,7 +1271,7 @@ static private string GraphicsDeviceTypeToString(BuildTarget target, GraphicsDev
12711271

12721272
if (graphicsDeviceType == GraphicsDeviceType.WebGPU)
12731273
{
1274-
return "WebGPU";
1274+
return "WebGPU (Experimental)";
12751275
}
12761276
else if (target == BuildTarget.WebGL)
12771277
{
@@ -1528,7 +1528,7 @@ private bool CheckApplyGraphicsJobsModeChange()
15281528
else
15291529
{
15301530
doRestart = EditorUtility.DisplayDialog("Changing editor graphics jobs mode",
1531-
"You've changed the active graphics josb mode. This requires a restart of the Editor.",
1531+
"You've changed the active graphics jobs mode. This requires a restart of the Editor.",
15321532
"Restart Editor", "Not now");
15331533
}
15341534
return doRestart;

Editor/Mono/Overlays/OverlayCanvas.cs

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ internal static DockZone GetDockZone(OverlayContainer container)
264264
return (DockZone)i;
265265
return DockZone.Floating;
266266
}
267-
267+
268268
// used by tests
269269
[EditorBrowsable(EditorBrowsableState.Never)]
270270
internal OverlayContainer GetDockZoneContainer(DockZone zone)
@@ -442,21 +442,43 @@ void OnAttachedToPanel(AttachToPanelEvent evt)
442442
floatingContainer.RegisterCallback<GeometryChangedEvent>(GeometryChanged);
443443
rootVisualElement.RegisterCallback<MouseEnterEvent>(OnMouseEnter);
444444
rootVisualElement.RegisterCallback<MouseLeaveEvent>(OnMouseLeave);
445+
EditorWindow.windowFocusChanged += OnFocusedWindowChanged;
446+
445447
}
446448

447449
void OnDetachedFromPanel(DetachFromPanelEvent evt)
448450
{
449451
floatingContainer.UnregisterCallback<GeometryChangedEvent>(GeometryChanged);
450452
rootVisualElement.UnregisterCallback<MouseEnterEvent>(OnMouseEnter);
451453
rootVisualElement.UnregisterCallback<MouseLeaveEvent>(OnMouseLeave);
454+
EditorWindow.windowFocusChanged -= OnFocusedWindowChanged;
452455
}
453456

454457
internal void OnContainerWindowDisabled()
455458
{
459+
if (containerWindow != null)
460+
{
461+
var overlayCanvasesData = OverlayCanvasesData.instance;
462+
var containerTypeWindows = Resources.FindObjectsOfTypeAll(containerWindow.GetType());
463+
// This closing container is last instance of its type
464+
if (containerTypeWindows.Length <= 1)
465+
{
466+
// Ensures m_SaveData is refreshed.
467+
OnBeforeSerialize();
468+
overlayCanvasesData.AddAndSaveCanvasData(containerWindow, m_SaveData);
469+
}
470+
}
471+
456472
foreach (var overlay in m_Overlays)
457473
overlay.OnWillBeDestroyed();
458474
}
459475

476+
void OnFocusedWindowChanged()
477+
{
478+
if (EditorWindow.focusedWindow == containerWindow)
479+
OverlayCanvasesData.instance.SetLastActiveCanvasForWindowType(this);
480+
}
481+
460482
void OnMouseEnter(MouseEnterEvent evt)
461483
{
462484
m_MouseInCurrentCanvas = true;
@@ -551,14 +573,33 @@ internal void Initialize(EditorWindow window)
551573
// init all overlays
552574
foreach (var overlayType in overlayTypes)
553575
AddOverlay(OverlayUtilities.CreateOverlay(overlayType));
554-
576+
577+
// No save data deserialized from layout or this is a new instance
555578
if (m_SaveData == null || m_SaveData.Count < 1)
556579
{
557-
var preset = OverlayPresetManager.GetDefaultPreset(window.GetType());
558-
if(preset != null && preset.saveData != null)
559-
m_SaveData = new List<SaveData>(preset.saveData);
580+
var containerTypeWindows = Resources.FindObjectsOfTypeAll(containerWindow.GetType());
581+
var overlayCanvasesData = OverlayCanvasesData.instance;
582+
583+
// If our container is not the first instance of its type (i.e. container window is duplicate),
584+
// we want to "inherit" overlay save data from the last focused overlay canvas.
585+
if (containerTypeWindows.Length > 1 && overlayCanvasesData.TryGetLastActiveCanvasForWindowType(containerWindow, out var lastActiveCanvas))
586+
{
587+
lastActiveCanvas.CopySaveData(out var lastActiveCanvasData);
588+
m_SaveData = new List<SaveData>(lastActiveCanvasData);
589+
}
590+
// Otherwise check if SaveData's been serialized in OverlayCanvasesData asset during last window close of container type.
591+
else if (!overlayCanvasesData.GetCanvasSaveData(containerWindow, out m_SaveData))
592+
{
593+
var preset = OverlayPresetManager.GetDefaultPreset(window.GetType());
594+
if (preset != null && preset.saveData != null)
595+
m_SaveData = new List<SaveData>(preset.saveData);
596+
}
560597
}
561598

599+
// If save data is still null at this point, initialize it to empty list as code down the line is not expecting it to be null
600+
if (m_SaveData == null)
601+
m_SaveData = new List<SaveData>();
602+
562603
RestoreOverlays();
563604
Profiler.EndSample();
564605
}
@@ -757,7 +798,7 @@ void SetActiveOverlayPopup(OverlayPopup popup)
757798
m_PopupOverlay.Focus();
758799
}
759800

760-
bool ClosePopupOverlay()
801+
internal bool ClosePopupOverlay()
761802
{
762803
if (m_PopupOverlay == null)
763804
return false;
@@ -906,7 +947,7 @@ public void RestoreOverlay(Overlay overlay, SaveData data = null)
906947
{
907948
if(data == null)
908949
data = FindSaveData(overlay);
909-
950+
910951
EditorJsonUtility.FromJsonOverwrite(data.contents, overlay);
911952

912953
#pragma warning disable 618
@@ -925,7 +966,7 @@ public void RestoreOverlay(Overlay overlay, SaveData data = null)
925966

926967
// Overlays are sorted by their index in containers so we can directly add them to top or bottom without
927968
// thinking of order
928-
if (data.dockPosition == DockPosition.Top)
969+
if (data.dockPosition == DockPosition.Top || container is FloatingOverlayContainer)
929970
overlay.DockAt(container, OverlayContainerSection.BeforeSpacer, container.GetSectionCount(OverlayContainerSection.BeforeSpacer));
930971
else if (data.dockPosition == DockPosition.Bottom)
931972
overlay.DockAt(container, OverlayContainerSection.AfterSpacer, container.GetSectionCount(OverlayContainerSection.AfterSpacer));
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
// Unity C# reference source
2+
// Copyright (c) Unity Technologies. For terms of use, see
3+
// https://unity3d.com/legal/licenses/Unity_Reference_Only_License
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using UnityEngine;
8+
9+
namespace UnityEditor.Overlays
10+
{
11+
[FilePath("Overlays/CanvasesSaveData.asset", FilePathAttribute.Location.PreferencesFolder)]
12+
class OverlayCanvasesData : ScriptableSingleton<OverlayCanvasesData>, ISerializationCallbackReceiver
13+
{
14+
[Serializable]
15+
struct WindowToCanvasDataPair
16+
{
17+
public WindowToCanvasDataPair(string windowType, List<SaveData> canvasSaveData)
18+
{
19+
m_WindowType = windowType;
20+
m_CanvasSaveData = canvasSaveData;
21+
}
22+
23+
public string m_WindowType;
24+
public List<SaveData> m_CanvasSaveData = new();
25+
}
26+
27+
[SerializeField]
28+
List<WindowToCanvasDataPair> m_CanvasesSaveData = new();
29+
Dictionary<string, List<SaveData>> m_WindowToCanvasSaveData = new();
30+
31+
[Serializable]
32+
struct WindowToCanvasPair
33+
{
34+
public WindowToCanvasPair(string windowType, OverlayCanvas canvas)
35+
{
36+
m_WindowType = windowType;
37+
m_Canvas = canvas;
38+
}
39+
40+
public string m_WindowType;
41+
public OverlayCanvas m_Canvas;
42+
}
43+
44+
// [SerializeField] for the list below is intentionally omitted.
45+
// Since List is serializable, it will survive domain reload as a ScriptableSingleton field but not serialize to asset.
46+
// This allows to track last active canvas throughout a session and NOT have this data restored on next session.
47+
List<WindowToCanvasPair> m_WindowToLastActiveCanvasList = new();
48+
49+
Dictionary<string, OverlayCanvas> m_WindowToLastActiveCanvasMap = new();
50+
51+
public void OnBeforeSerialize()
52+
{
53+
// Output window to canvas SaveData map to a list
54+
if (m_CanvasesSaveData == null)
55+
m_CanvasesSaveData = new();
56+
else
57+
m_CanvasesSaveData.Clear();
58+
59+
foreach (var dataPair in m_WindowToCanvasSaveData)
60+
m_CanvasesSaveData.Add(new WindowToCanvasDataPair(dataPair.Key, dataPair.Value));
61+
62+
// Output window to last active canvas map to a list
63+
if (m_WindowToLastActiveCanvasList == null)
64+
m_WindowToLastActiveCanvasList = new();
65+
else
66+
m_WindowToLastActiveCanvasList.Clear();
67+
68+
foreach (var dataPair in m_WindowToLastActiveCanvasMap)
69+
m_WindowToLastActiveCanvasList.Add(new WindowToCanvasPair(dataPair.Key, dataPair.Value));
70+
}
71+
72+
public void OnAfterDeserialize()
73+
{
74+
// Restore window to canvas save datas map
75+
if (m_WindowToCanvasSaveData == null)
76+
m_WindowToCanvasSaveData = new();
77+
else
78+
m_WindowToCanvasSaveData.Clear();
79+
80+
if (m_CanvasesSaveData == null)
81+
{
82+
m_CanvasesSaveData = new();
83+
return;
84+
}
85+
86+
for (int i = 0; i < m_CanvasesSaveData.Count; ++i)
87+
{
88+
var dataPair = m_CanvasesSaveData[i];
89+
m_WindowToCanvasSaveData.Add(dataPair.m_WindowType, dataPair.m_CanvasSaveData);
90+
}
91+
92+
// Restore window to last active canvas map
93+
if (m_WindowToLastActiveCanvasMap == null)
94+
m_WindowToLastActiveCanvasMap = new();
95+
else
96+
m_WindowToLastActiveCanvasMap.Clear();
97+
98+
if (m_WindowToLastActiveCanvasList == null)
99+
{
100+
m_WindowToLastActiveCanvasList = new();
101+
return;
102+
}
103+
104+
for (int i = 0; i < m_WindowToLastActiveCanvasList.Count; ++i)
105+
{
106+
var dataPair = m_WindowToLastActiveCanvasList[i];
107+
m_WindowToLastActiveCanvasMap.Add(dataPair.m_WindowType, dataPair.m_Canvas);
108+
}
109+
}
110+
111+
void OnDisable()
112+
{
113+
Save();
114+
}
115+
116+
public void AddAndSaveCanvasData(EditorWindow containerWindow, List<SaveData> canvasSaveData)
117+
{
118+
var windowType = containerWindow.GetType().AssemblyQualifiedName;
119+
if (!m_WindowToCanvasSaveData.TryAdd(windowType, canvasSaveData))
120+
m_WindowToCanvasSaveData[windowType] = canvasSaveData;
121+
122+
Save();
123+
}
124+
125+
public bool GetCanvasSaveData(EditorWindow containerWindow, out List<SaveData> canvasSaveData)
126+
{
127+
if (m_WindowToCanvasSaveData.TryGetValue(containerWindow.GetType().AssemblyQualifiedName, out canvasSaveData) &&
128+
canvasSaveData != null)
129+
return true;
130+
131+
return false;
132+
}
133+
134+
void Save()
135+
{
136+
Save(true);
137+
}
138+
139+
public bool TryGetLastActiveCanvasForWindowType(EditorWindow window, out OverlayCanvas lastActiveCanvas)
140+
{
141+
return m_WindowToLastActiveCanvasMap.TryGetValue(window.GetType().AssemblyQualifiedName, out lastActiveCanvas);
142+
}
143+
144+
public void SetLastActiveCanvasForWindowType(OverlayCanvas canvas)
145+
{
146+
var windowType = canvas.containerWindow.GetType().AssemblyQualifiedName;
147+
if (!m_WindowToLastActiveCanvasMap.TryAdd(windowType, canvas))
148+
m_WindowToLastActiveCanvasMap[windowType] = canvas;
149+
}
150+
}
151+
}

0 commit comments

Comments
 (0)