Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
As of v1.9.3, Unity has added a simple extention API to the PackageManager UI. This small example shows you how to implment it and add a new window to the package manager. Note: you will need to change to the Staging package repository as time of writing. This code needs to go in an Editor folder
using System.Linq;
using UnityEditor;
using UnityEditor.PackageManager.UI;
using UnityEngine;
using UnityEngine.Experimental.UIElements;
using UnityEngine.Experimental.UIElements.StyleEnums;
using PackageInfo = UnityEditor.PackageManager.PackageInfo;
[InitializeOnLoad]
public class PackageManagerExtentionExample : IPackageManagerExtension
{
// This class implments the new IPackageManagerExtension interface, allowing us to plug it
// into the package manager window. this feature is still very much under development
static PackageManagerExtentionExample()
{
Debug.Log("CALLED STATIC CTOR");
// This static constructor gets called becuase we have the InitializeOnLoad attribute
// on our class. Here we register this PackageManager extention so our exta version list
// shows up in the manager window
PackageManagerExtensions.RegisterExtension(new PackageManagerExtentionExample());
}
// this is the scrollview were going to put the version list into
ScrollView tasksContainer;
public VisualElement CreateExtensionUI()
{
Debug.Log("CALLED CreateExtensionUI");
VisualContainer root = new VisualContainer()
{
style =
{
backgroundColor = Color.grey,
alignSelf = Align.FlexStart,
flexDirection = FlexDirection.Row
}
};
tasksContainer = new ScrollView()
{
style =
{
width = 400,
height = 100,
flexDirection = FlexDirection.Column,
}
};
tasksContainer.showHorizontal = false;
root.Add(tasksContainer);
return root;
}
public void OnPackageSelectionChange(PackageInfo packageInfo)
{
// setup the version list for the currently selected package
Debug.Log("CALLED OnPackageSelectionChange");
tasksContainer.contentContainer.Clear();
foreach (var version in packageInfo.versions.all.Reverse())
{
tasksContainer.contentContainer.Add(NewVersion(version, packageInfo));
}
}
private VisualElement NewVersion(string version, PackageInfo packageInfo)
{
// create a list item for the passed in version
var versionElement = new VisualContainer()
{
style =
{
width = 400,
flexDirection = FlexDirection.Row
}
};
versionElement.name = version;
// fist, lets put in the version name
versionElement.Add(new Label(version));
// annnd now a bunch of interesting info
versionElement.Add(new Toggle(null){text = "Recomended", on = (packageInfo.versions.recommended == version)});
versionElement.Add(new Toggle(null){text = "Compatible", on = (packageInfo.versions.compatible.Contains(version))});
versionElement.Add(new Toggle(null){text = "Latest Compatible", on = (packageInfo.versions.latestCompatible == version)});
Debug.Log("ADDED " + version);
return versionElement;
}
public void OnPackageAddedOrUpdated(PackageInfo packageInfo)
{
Debug.Log("CALLED OnPackageAddedOrUpdated");
}
public void OnPackageRemoved(PackageInfo packageInfo)
{
Debug.Log("CALLED OnPackageRemoved");
}
}

Always thankful for your support, Lotte💖

Buy Me a Coffee at ko-fi.com Become a Patron!

@darbotron

This comment has been minimized.

Copy link

darbotron commented Jun 13, 2018

Lotte - your gist page is a goldmine! Thanks so much for doing this!! Coffee bought!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.