com.alicizax.unity.packagem.../Editor/PackageManager/Window/PackageInfoView.cs
2026-04-17 14:21:41 +08:00

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);
}
}
}