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