200 lines
7.4 KiB
C#
200 lines
7.4 KiB
C#
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace AlicizaX.PackageManager.Editor
|
|
{
|
|
internal class PackageInfoView : VisualElement
|
|
{
|
|
private readonly FrameworkPackageManagerWindow window;
|
|
|
|
private VisualElement mainContainer;
|
|
private Label displayNameLabel;
|
|
private Label versionLabel;
|
|
private Label authorLabel;
|
|
private Label packageNameLabel;
|
|
private Label descriptionLabel;
|
|
private Label sourceLinkLabel;
|
|
private Label installedStateLabel;
|
|
|
|
private Button updateButton;
|
|
private Button installButton;
|
|
private Button removeButton;
|
|
|
|
private RepositoryPackageData selectedPackage;
|
|
|
|
public PackageInfoView(FrameworkPackageManagerWindow window)
|
|
{
|
|
this.window = window;
|
|
|
|
style.flexShrink = 1;
|
|
style.height = Length.Percent(100);
|
|
|
|
mainContainer = new VisualElement { name = "MainContainer" };
|
|
mainContainer.style.flexShrink = 1;
|
|
mainContainer.style.height = Length.Percent(100);
|
|
mainContainer.style.paddingLeft = 10;
|
|
mainContainer.style.paddingTop = 10;
|
|
|
|
displayNameLabel = CreateLabel("DisplayName", 19, FontStyle.Bold);
|
|
versionLabel = CreateLabel("VersionWithDate", 13, FontStyle.Bold);
|
|
authorLabel = CreateLabel("AuthorLabel", 12, FontStyle.Italic);
|
|
packageNameLabel = CreateLabel("PackageName", 12, FontStyle.Italic);
|
|
installedStateLabel = CreateLabel("InstalledState", 12, FontStyle.Normal);
|
|
descriptionLabel = CreateLabel("ProjectDescription", 12, FontStyle.Normal);
|
|
|
|
sourceLinkLabel = CreateLabel("BtnLink", 12, FontStyle.Normal);
|
|
sourceLinkLabel.text = "Source Code";
|
|
sourceLinkLabel.style.color = new Color(0.2980392f, 0.498f, 1f);
|
|
sourceLinkLabel.RegisterCallback<ClickEvent>(OnSourceClick);
|
|
|
|
var buttonContainer = new VisualElement { name = "PackageBtnContainer" };
|
|
buttonContainer.style.flexDirection = FlexDirection.Row;
|
|
buttonContainer.style.paddingTop = 10;
|
|
|
|
installButton = CreateButton("BtnInstall", "Install", OnInstallClick);
|
|
updateButton = CreateButton("BtnUpdate", "Update", OnUpdateClick);
|
|
removeButton = CreateButton("BtnRemove", "Remove", OnRemoveClick);
|
|
|
|
buttonContainer.Add(installButton);
|
|
buttonContainer.Add(updateButton);
|
|
buttonContainer.Add(removeButton);
|
|
|
|
mainContainer.Add(displayNameLabel);
|
|
mainContainer.Add(versionLabel);
|
|
mainContainer.Add(authorLabel);
|
|
mainContainer.Add(packageNameLabel);
|
|
mainContainer.Add(installedStateLabel);
|
|
mainContainer.Add(descriptionLabel);
|
|
mainContainer.Add(sourceLinkLabel);
|
|
mainContainer.Add(buttonContainer);
|
|
|
|
Add(mainContainer);
|
|
RefreshView(null);
|
|
}
|
|
|
|
public void RefreshView(RepositoryPackageData repositoryPackageData)
|
|
{
|
|
selectedPackage = repositoryPackageData;
|
|
if (repositoryPackageData == null)
|
|
{
|
|
mainContainer.visible = false;
|
|
return;
|
|
}
|
|
|
|
mainContainer.visible = true;
|
|
displayNameLabel.text = string.IsNullOrEmpty(repositoryPackageData.displayName)
|
|
? repositoryPackageData.name
|
|
: repositoryPackageData.displayName;
|
|
versionLabel.text = $"Remote: {repositoryPackageData.version} HEAD: {ShortHash(repositoryPackageData.remoteHead)}";
|
|
authorLabel.text = $"Author: {repositoryPackageData.authorName}";
|
|
packageNameLabel.text = repositoryPackageData.name;
|
|
installedStateLabel.text = BuildInstalledState(repositoryPackageData);
|
|
descriptionLabel.text = string.IsNullOrEmpty(repositoryPackageData.packageDescription)
|
|
? "Description: N/A"
|
|
: repositoryPackageData.packageDescription;
|
|
|
|
installButton.style.display = repositoryPackageData.PackageState == PackageState.UnInstall ? DisplayStyle.Flex : DisplayStyle.None;
|
|
updateButton.style.display = repositoryPackageData.PackageState == PackageState.Update ? DisplayStyle.Flex : DisplayStyle.None;
|
|
removeButton.style.display = repositoryPackageData.PackageState == PackageState.Install || repositoryPackageData.PackageState == PackageState.Update
|
|
? DisplayStyle.Flex
|
|
: DisplayStyle.None;
|
|
}
|
|
|
|
private void OnSourceClick(ClickEvent evt)
|
|
{
|
|
if (selectedPackage == null || string.IsNullOrEmpty(selectedPackage.htmlUrl))
|
|
{
|
|
return;
|
|
}
|
|
|
|
Application.OpenURL(selectedPackage.htmlUrl);
|
|
}
|
|
|
|
private void OnInstallClick()
|
|
{
|
|
if (selectedPackage == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
PackageManagerCheckTool.InstallPackage(selectedPackage.cloneUrl, (success, _) =>
|
|
{
|
|
if (success)
|
|
{
|
|
window.Refresh();
|
|
}
|
|
});
|
|
}
|
|
|
|
private void OnUpdateClick()
|
|
{
|
|
if (selectedPackage == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
UpdateAllPackageHelper.UpdatePackage(window, selectedPackage);
|
|
}
|
|
|
|
private void OnRemoveClick()
|
|
{
|
|
if (selectedPackage == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var confirm = EditorUtility.DisplayDialog("Remove Package", $"Remove {selectedPackage.name}?", "Yes", "No");
|
|
if (!confirm)
|
|
{
|
|
return;
|
|
}
|
|
|
|
PackageManagerCheckTool.UninstallPackage(selectedPackage.name, (success, _) =>
|
|
{
|
|
if (success)
|
|
{
|
|
window.Refresh();
|
|
}
|
|
});
|
|
}
|
|
|
|
private static Label CreateLabel(string name, int fontSize, FontStyle fontStyle)
|
|
{
|
|
var label = new Label { name = name };
|
|
label.style.fontSize = fontSize;
|
|
label.style.unityFontStyleAndWeight = fontStyle;
|
|
label.style.paddingTop = 5;
|
|
return label;
|
|
}
|
|
|
|
private static Button CreateButton(string name, string text, System.Action clickAction)
|
|
{
|
|
var button = new Button(clickAction) { name = name, text = text };
|
|
button.style.width = 90;
|
|
button.style.height = 24;
|
|
button.style.marginLeft = 0;
|
|
button.style.marginRight = 4;
|
|
return button;
|
|
}
|
|
|
|
private static string BuildInstalledState(RepositoryPackageData package)
|
|
{
|
|
var installedVersion = string.IsNullOrEmpty(package.InstalledVersion) ? "N/A" : package.InstalledVersion;
|
|
var installedHash = string.IsNullOrEmpty(package.InstalledHash) ? "N/A" : ShortHash(package.InstalledHash);
|
|
var source = string.IsNullOrEmpty(package.InstalledSource) ? "None" : package.InstalledSource;
|
|
return $"Installed: {installedVersion} Source: {source} Local HEAD: {installedHash}";
|
|
}
|
|
|
|
private static string ShortHash(string hash)
|
|
{
|
|
if (string.IsNullOrEmpty(hash))
|
|
{
|
|
return "N/A";
|
|
}
|
|
|
|
return hash.Length <= 8 ? hash : hash.Substring(0, 8);
|
|
}
|
|
}
|
|
}
|