Skip to content

Commit fa6eca4

Browse files
committed
Make sure MultiSelectWindow for different purposes are unique.
EditorWindow.GetWindow() only create a new window or return an existing one per type. As a result, when CreateMultiSelectWindow() is called for different purposes at the same time, the same window instance can be filled with data from the different code path, and causes error. This change make sure the MultiSelectWindow created for different purposes are unique. Change-Id: I7dafdb49ef714def221afcc359561ec5cff886ed
1 parent 1b491b8 commit fa6eca4

File tree

5 files changed

+40
-5
lines changed

5 files changed

+40
-5
lines changed

source/PackageManagerResolver/src/PackageManagerResolver.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ namespace Google {
2424

2525
[InitializeOnLoad]
2626
public class PackageManagerResolver : AssetPostprocessor {
27+
/// <summary>
28+
/// A unique class to create the multi-select window to add registries.
29+
/// </summary>
30+
class PackageManagerResolverWindow : MultiSelectWindow {}
2731

2832
/// <summary>
2933
/// Name of the plugin.
@@ -406,7 +410,9 @@ internal static void UpdateManifest(ManifestModificationMode mode,
406410
}
407411

408412
// Optional when prompting is enabled or forced.
409-
var window = MultiSelectWindow.CreateMultiSelectWindow(PLUGIN_NAME);
413+
var window =
414+
MultiSelectWindow.CreateMultiSelectWindow<PackageManagerResolverWindow>(
415+
PLUGIN_NAME);
410416
window.minSize = new Vector2(1024, 500);
411417
window.AvailableItems = registryItems;
412418
window.Sort(1);

source/PackageManagerResolver/src/PackageMigrator.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ namespace Google {
2929
/// </summary>
3030
[InitializeOnLoad]
3131
internal class PackageMigrator {
32+
/// <summary>
33+
/// A unique class to create the multi-select window to migrate packages.
34+
/// </summary>
35+
private class PackageMigratorWindow : MultiSelectWindow {}
3236

3337
/// <summary>
3438
/// Map of Version Handler determined package to Package Manager Package ID and version.
@@ -943,7 +947,7 @@ public static void DisplaySelectionWindow(ICollection<PackageMap> packageMaps,
943947
pkg.PackageManagerPackageId)));
944948
}
945949

946-
var window = MultiSelectWindow.CreateMultiSelectWindow(WindowTitle);
950+
var window = MultiSelectWindow.CreateMultiSelectWindow<PackageMigratorWindow>(WindowTitle);
947951
window.minSize = new UnityEngine.Vector2(800, 400);
948952
window.SelectedItems = new HashSet<string>(packageMapsByPackageId.Keys);
949953
window.AvailableItems = items;

source/VersionHandlerImpl/src/MultiSelectWindow.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,26 @@ protected virtual void OnGUI() {
263263
/// </summary>
264264
/// <param name="title">Title to display on the window.</param>
265265
/// <returns>Reference to this class</returns>
266+
[Obsolete("This method deprecated. Please use CreateMultiSelectWindow<T>() instead.")]
266267
public static MultiSelectWindow CreateMultiSelectWindow(string title) {
267268
MultiSelectWindow window = (MultiSelectWindow)EditorWindow.GetWindow(
268269
typeof(MultiSelectWindow), true, title, true);
269270
window.Initialize();
270271
return window;
271272
}
273+
274+
/// <summary>
275+
/// Get the existing multi-select window or create a new one.
276+
/// To create an unique MultiSelectWindow, pass a type derived from MultiSelectWindow
277+
/// as the type parameter.
278+
/// </summary>
279+
/// <typeparam name="T">A type that inherits from the MultiSelectWindow.</typeparam>
280+
/// <param name="title">Title to display on the window.</param>
281+
/// <returns>Reference to this class</returns>
282+
public static T CreateMultiSelectWindow<T>(string title) where T : MultiSelectWindow {
283+
T window = (T)EditorWindow.GetWindow(typeof(T), true, title, true);
284+
window.Initialize();
285+
return window;
286+
}
272287
}
273288
}

source/VersionHandlerImpl/src/PackageUninstallWindow.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@
2020
using UnityEditor;
2121

2222
namespace Google {
23+
24+
/// <summary>
25+
/// A unique class to create the multi-select window to uninstall packages managed by
26+
/// VersionHandler.
27+
/// </summary>
2328
[InitializeOnLoad]
24-
public class PackageUninstallWindow : EditorWindow {
29+
public class PackageUninstallWindow : MultiSelectWindow {
2530
// Hardcoded text for the window.
2631
private static string windowTitle = "Uninstall Managed Packages";
2732
private static string caption =
@@ -36,7 +41,7 @@ public class PackageUninstallWindow : EditorWindow {
3641
[MenuItem("Assets/External Dependency Manager/Version Handler/Uninstall Managed Packages")]
3742
public static void UninstallPackage() {
3843
// Display MultiSelectWindow
39-
MultiSelectWindow window = MultiSelectWindow.CreateMultiSelectWindow(windowTitle);
44+
var window =MultiSelectWindow.CreateMultiSelectWindow<PackageUninstallWindow>(windowTitle);
4045
window.AvailableItems = GetSelectionList();
4146
window.Sort(1);
4247
window.Caption = caption;

source/VersionHandlerImpl/src/VersionHandlerImpl.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ namespace Google {
2727

2828
[InitializeOnLoad]
2929
public class VersionHandlerImpl : AssetPostprocessor {
30+
/// <summary>
31+
/// A unique class to create the multi-select window to obsolete files.
32+
/// </summary>
33+
private class ObsoleteFilesWindow : MultiSelectWindow {}
34+
3035
/// <summary>
3136
/// Derives metadata from an asset filename.
3237
/// </summary>
@@ -2859,7 +2864,7 @@ private static void UpdateVersionedAssetsOnMainThread(bool forceUpdate,
28592864

28602865
bool cleanupFilesPending = cleanupFiles.Count > 0;
28612866
if (cleanupFilesPending && !Refreshing) {
2862-
var window = MultiSelectWindow.CreateMultiSelectWindow(PLUGIN_NAME);
2867+
var window = MultiSelectWindow.CreateMultiSelectWindow<ObsoleteFilesWindow>(PLUGIN_NAME);
28632868
Action<string> logObsoleteFile = (filename) => {
28642869
Log("Leaving obsolete file: " + filename, verbose: true);
28652870
};

0 commit comments

Comments
 (0)