You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
4.6 KiB

  1. using UnityEngine.Experimental.UIElements;
  2. using System;
  3. namespace UnityEditor.PackageManager.UI
  4. {
  5. #if !UNITY_2018_3_OR_NEWER
  6. internal class PackageItemFactory : UxmlFactory<PackageItem>
  7. {
  8. protected override PackageItem DoCreate(IUxmlAttributes bag, CreationContext cc)
  9. {
  10. return new PackageItem();
  11. }
  12. }
  13. #endif
  14. internal class PackageItem : VisualElement
  15. {
  16. #if UNITY_2018_3_OR_NEWER
  17. internal new class UxmlFactory : UxmlFactory<PackageItem> { }
  18. #endif
  19. public static string SelectedClassName = "selected";
  20. public event Action<PackageItem> OnSelected = delegate { };
  21. private readonly VisualElement root;
  22. private string currentStateClass;
  23. public Package package { get; private set; }
  24. public PackageItem previousItem;
  25. public PackageItem nextItem;
  26. public PackageGroup packageGroup;
  27. public PackageItem() : this(null)
  28. {
  29. }
  30. public PackageItem(Package package)
  31. {
  32. root = Resources.GetTemplate("PackageItem.uxml");
  33. Add(root);
  34. root.AddManipulator(new Clickable(Select));
  35. SetItem(package);
  36. }
  37. private void Select()
  38. {
  39. OnSelected(this);
  40. }
  41. public void SetSelected(bool value)
  42. {
  43. if (value)
  44. PackageContainer.AddToClassList(SelectedClassName);
  45. else
  46. PackageContainer.RemoveFromClassList(SelectedClassName);
  47. Spinner.InvertColor = value;
  48. }
  49. private void SetItem(Package package)
  50. {
  51. var displayPackage = package != null ? package.VersionToDisplay : null;
  52. if (displayPackage == null)
  53. return;
  54. this.package = package;
  55. OnPackageChanged();
  56. this.package.AddSignal.WhenOperation(OnPackageAdd);
  57. this.package.RemoveSignal.WhenOperation(OnPackageRemove);
  58. }
  59. private void OnPackageRemove(IRemoveOperation operation)
  60. {
  61. operation.OnOperationError += error => StopSpinner();
  62. OnPackageUpdate();
  63. }
  64. private void OnPackageAdd(IAddOperation operation)
  65. {
  66. operation.OnOperationError += error => StopSpinner();
  67. OnPackageUpdate();
  68. }
  69. private void OnPackageChanged()
  70. {
  71. var displayPackage = package != null ? package.VersionToDisplay : null;
  72. if (displayPackage == null)
  73. return;
  74. NameLabel.text = displayPackage.DisplayName;
  75. VersionLabel.text = displayPackage.Version.ToString();
  76. var stateClass = GetIconStateId(displayPackage);
  77. if (displayPackage.State == PackageState.Outdated && package.LatestUpdate == package.Current)
  78. stateClass = GetIconStateId(PackageState.UpToDate);
  79. if (PackageCollection.Instance.GetPackageError(package) != null)
  80. stateClass = GetIconStateId(PackageState.Error);
  81. if (stateClass == GetIconStateId(PackageState.UpToDate) && package.Current != null)
  82. stateClass = "installed";
  83. StateLabel.RemoveFromClassList(currentStateClass);
  84. StateLabel.AddToClassList(stateClass);
  85. UIUtils.SetElementDisplay(VersionLabel, !displayPackage.IsBuiltIn);
  86. currentStateClass = stateClass;
  87. if (displayPackage.State != PackageState.InProgress && Spinner.Started)
  88. StopSpinner();
  89. }
  90. private void OnPackageUpdate()
  91. {
  92. StartSpinner();
  93. }
  94. private void StartSpinner()
  95. {
  96. Spinner.Start();
  97. StateLabel.AddToClassList("no-icon");
  98. }
  99. private void StopSpinner()
  100. {
  101. Spinner.Stop();
  102. StateLabel.RemoveFromClassList("no-icon");
  103. }
  104. private Label NameLabel { get { return root.Q<Label>("packageName"); } }
  105. private Label StateLabel { get { return root.Q<Label>("packageState"); } }
  106. private Label VersionLabel { get { return root.Q<Label>("packageVersion"); } }
  107. private VisualElement PackageContainer { get { return root.Q<VisualElement>("packageContainer"); } }
  108. private LoadingSpinner Spinner { get { return root.Q<LoadingSpinner>("packageSpinner"); } }
  109. public static string GetIconStateId(PackageInfo packageInfo)
  110. {
  111. if (packageInfo == null)
  112. return "";
  113. return GetIconStateId(packageInfo.State);
  114. }
  115. public static string GetIconStateId(PackageState state)
  116. {
  117. return state.ToString().ToLower();
  118. }
  119. }
  120. }