PackageDetails.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Semver;
  5. using UnityEngine;
  6. using UnityEngine.Networking;
  7. using UnityEngine.Experimental.UIElements;
  8. namespace UnityEditor.PackageManager.UI
  9. {
  10. #if !UNITY_2018_3_OR_NEWER
  11. internal class PackageDetailsFactory : UxmlFactory<PackageDetails>
  12. {
  13. protected override PackageDetails DoCreate(IUxmlAttributes bag, CreationContext cc)
  14. {
  15. return new PackageDetails();
  16. }
  17. }
  18. #endif
  19. internal class PackageDetails : VisualElement
  20. {
  21. #if UNITY_2018_3_OR_NEWER
  22. internal new class UxmlFactory : UxmlFactory<PackageDetails> {}
  23. #endif
  24. private readonly VisualElement root;
  25. private Package package;
  26. private const string emptyDescriptionClass = "empty";
  27. private List<VersionItem> VersionItems;
  28. internal PopupField<VersionItem> VersionPopup;
  29. private PackageInfo DisplayPackage;
  30. private PackageInfo SelectedPackage
  31. {
  32. get { return VersionPopup.value.Version != null ? VersionPopup.value.Version : null; }
  33. }
  34. internal enum PackageAction
  35. {
  36. Add,
  37. Remove,
  38. Update,
  39. Downgrade,
  40. Enable,
  41. Disable,
  42. UpToDate,
  43. Current,
  44. Local,
  45. Git,
  46. Embedded
  47. }
  48. private static readonly VersionItem EmptyVersion = new VersionItem {Version = null};
  49. internal static readonly string[] PackageActionVerbs = { "Install", "Remove", "Update to", "Update to", "Enable", "Disable", "Up to date", "Current", "Local", "Git", "Embedded" };
  50. internal static readonly string[] PackageActionInProgressVerbs = { "Installing", "Removing", "Updating to", "Updating to", "Enabling", "Disabling", "Up to date", "Current", "Local", "Git", "Embedded" };
  51. public PackageDetails()
  52. {
  53. UIUtils.SetElementDisplay(this, false);
  54. root = Resources.GetTemplate("PackageDetails.uxml");
  55. Add(root);
  56. foreach (var extension in PackageManagerExtensions.Extensions)
  57. CustomContainer.Add(extension.CreateExtensionUI());
  58. root.StretchToParentSize();
  59. SetUpdateVisibility(false);
  60. RemoveButton.visible = false;
  61. UpdateBuiltIn.visible = false;
  62. UpdateButton.clickable.clicked += UpdateClick;
  63. UpdateBuiltIn.clickable.clicked += UpdateClick;
  64. RemoveButton.clickable.clicked += RemoveClick;
  65. ViewDocButton.clickable.clicked += ViewDocClick;
  66. ViewChangelogButton.clickable.clicked += ViewChangelogClick;
  67. ViewLicenses.clickable.clicked += ViewLicensesClick;
  68. VersionItems = new List<VersionItem> {EmptyVersion};
  69. VersionPopup = new PopupField<VersionItem>(VersionItems, 0);
  70. VersionPopup.SetLabelCallback(VersionSelectionSetLabel);
  71. VersionPopup.AddToClassList("popup");
  72. VersionPopup.OnValueChanged(VersionSelectionChanged);
  73. if (VersionItems.Count == 1)
  74. VersionPopup.SetEnabled(false);
  75. UpdateDropdownContainer.Add(VersionPopup);
  76. VersionPopup.StretchToParentSize();
  77. // Fix button on dark skin but overlapping edge pixel perfectly
  78. if (EditorGUIUtility.isProSkin)
  79. {
  80. VersionPopup.style.positionLeft = -1;
  81. UpdateDropdownContainer.style.sliceLeft = 4;
  82. }
  83. // We add a null check to avoid the null exception error when updating Package Manager UI to the new version
  84. if (DetailWarningLink != null)
  85. DetailWarningLink.clickable.clicked += () => Application.OpenURL("https://docs.unity3d.com/Manual/upm-scoped.html");
  86. }
  87. private string VersionSelectionSetLabel(VersionItem item)
  88. {
  89. return item.Label;
  90. }
  91. private void VersionSelectionChanged(ChangeEvent<VersionItem> e)
  92. {
  93. RefreshAddButton();
  94. }
  95. private void SetUpdateVisibility(bool value)
  96. {
  97. if (UpdateContainer != null)
  98. UIUtils.SetElementDisplay(UpdateContainer, value);
  99. }
  100. internal void SetDisplayPackage(PackageInfo packageInfo)
  101. {
  102. DisplayPackage = packageInfo;
  103. var detailVisible = true;
  104. Error error = null;
  105. if (package == null || DisplayPackage == null)
  106. {
  107. detailVisible = false;
  108. UIUtils.SetElementDisplay(DocumentationContainer, false);
  109. UIUtils.SetElementDisplay(CustomContainer, false);
  110. UIUtils.SetElementDisplay(UpdateBuiltIn, false);
  111. foreach (var extension in PackageManagerExtensions.Extensions)
  112. extension.OnPackageSelectionChange(null);
  113. }
  114. else
  115. {
  116. SetUpdateVisibility(true);
  117. UIUtils.SetElementDisplay(ViewDocButton, true);
  118. RemoveButton.visible = true;
  119. if (string.IsNullOrEmpty(DisplayPackage.Description))
  120. {
  121. DetailDesc.text = "There is no description for this package.";
  122. DetailDesc.AddToClassList(emptyDescriptionClass);
  123. }
  124. else
  125. {
  126. DetailDesc.text = DisplayPackage.Description;
  127. DetailDesc.RemoveFromClassList(emptyDescriptionClass);
  128. }
  129. DetailTitle.text = DisplayPackage.DisplayName;
  130. DetailVersion.text = "Version " + DisplayPackage.VersionWithoutTag;
  131. if (DisplayPackage.IsInDevelopment || DisplayPackage.HasVersionTag(PackageTag.preview))
  132. UIUtils.SetElementDisplay(GetTag(PackageTag.verified), false);
  133. else
  134. {
  135. var unityVersionParts = Application.unityVersion.Split('.');
  136. var unityVersion = string.Format("{0}.{1}", unityVersionParts[0], unityVersionParts[1]);
  137. VerifyLabel.text = unityVersion + " verified";
  138. UIUtils.SetElementDisplay(GetTag(PackageTag.verified), DisplayPackage.IsVerified);
  139. }
  140. UIUtils.SetElementDisplay(GetTag(PackageTag.inDevelopment), DisplayPackage.IsInDevelopment);
  141. UIUtils.SetElementDisplay(GetTag(PackageTag.local), DisplayPackage.IsLocal);
  142. UIUtils.SetElementDisplay(GetTag(PackageTag.preview), DisplayPackage.IsPreview);
  143. UIUtils.SetElementDisplay(DocumentationContainer, DisplayPackage.Origin != PackageSource.BuiltIn);
  144. UIUtils.SetElementDisplay(ChangelogContainer, DisplayPackage.HasChangelog(DisplayPackage));
  145. root.Q<Label>("detailName").text = DisplayPackage.Name;
  146. root.Q<ScrollView>("detailView").scrollOffset = new Vector2(0, 0);
  147. DetailModuleReference.text = "";
  148. var isBuiltIn = DisplayPackage.IsBuiltIn;
  149. if (isBuiltIn)
  150. DetailModuleReference.text = DisplayPackage.BuiltInDescription;
  151. DetailAuthor.text = "";
  152. if (!string.IsNullOrEmpty(DisplayPackage.Author))
  153. DetailAuthor.text = string.Format("Author: {0}", DisplayPackage.Author);
  154. UIUtils.SetElementDisplay(DetailDesc, !isBuiltIn);
  155. UIUtils.SetElementDisplay(DetailVersion, !isBuiltIn);
  156. UIUtils.SetElementDisplayNonEmpty(DetailModuleReference);
  157. UIUtils.SetElementDisplayNonEmpty(DetailAuthor);
  158. UIUtils.SetElementDisplay(DetailWarning, !package.IsUnityPackage && !DisplayPackage.IsInDevelopment && !DisplayPackage.IsLocal);
  159. if (DisplayPackage.Errors.Count > 0)
  160. error = DisplayPackage.Errors.First();
  161. RefreshAddButton();
  162. RefreshRemoveButton();
  163. UIUtils.SetElementDisplay(CustomContainer, true);
  164. package.AddSignal.OnOperation += OnAddOperation;
  165. package.RemoveSignal.OnOperation += OnRemoveOperation;
  166. foreach (var extension in PackageManagerExtensions.Extensions)
  167. extension.OnPackageSelectionChange(DisplayPackage.Info);
  168. }
  169. // Set visibility
  170. root.Q<VisualElement>("detail").visible = detailVisible;
  171. if (null == error)
  172. error = PackageCollection.Instance.GetPackageError(package);
  173. if (error != null)
  174. SetError(error);
  175. else
  176. DetailError.ClearError();
  177. }
  178. private void ResetVersionItems(PackageInfo displayPackage)
  179. {
  180. VersionItems.Clear();
  181. VersionPopup.SetEnabled(true);
  182. if (displayPackage == null)
  183. return;
  184. //
  185. // Get key versions -- Latest, Verified, LatestPatch, Current.
  186. var keyVersions = new List<PackageInfo>();
  187. if (package.LatestRelease != null) keyVersions.Add(package.LatestRelease);
  188. if (package.Current != null) keyVersions.Add(package.Current);
  189. if (package.Verified != null && package.Verified != package.Current) keyVersions.Add(package.Verified);
  190. if (package.LatestPatch != null && package.IsAfterCurrentVersion(package.LatestPatch)) keyVersions.Add(package.LatestPatch);
  191. if (package.Current == null && package.LatestRelease == null && package.Latest != null) keyVersions.Add(package.Latest);
  192. if (Package.ShouldProposeLatestVersions && package.Latest != package.LatestRelease && package.Latest != null) keyVersions.Add(package.Latest);
  193. keyVersions.Add(package.LatestUpdate); // Make sure LatestUpdate is always in the list.
  194. foreach (var version in keyVersions.OrderBy(package => package.Version).Reverse())
  195. {
  196. var item = new VersionItem {Version = version};
  197. VersionItems.Add(item);
  198. if (version == package.LatestUpdate)
  199. VersionPopup.value = item;
  200. }
  201. //
  202. // Add all versions
  203. foreach (var version in package.Versions.Reverse())
  204. {
  205. var item = new VersionItem {Version = version};
  206. item.MenuName = "All Versions/";
  207. VersionItems.Add(item);
  208. }
  209. if (VersionItems.Count == 0)
  210. {
  211. VersionItems.Add(EmptyVersion);
  212. VersionPopup.value = EmptyVersion;
  213. VersionPopup.SetEnabled(false);
  214. }
  215. }
  216. public void SetPackage(Package package)
  217. {
  218. if (this.package != null)
  219. {
  220. if (this.package.AddSignal.Operation != null)
  221. {
  222. this.package.AddSignal.Operation.OnOperationError -= OnAddOperationError;
  223. this.package.AddSignal.Operation.OnOperationSuccess -= OnAddOperationSuccess;
  224. }
  225. this.package.AddSignal.ResetEvents();
  226. if (this.package.RemoveSignal.Operation != null)
  227. {
  228. this.package.RemoveSignal.Operation.OnOperationSuccess -= OnRemoveOperationSuccess;
  229. this.package.RemoveSignal.Operation.OnOperationError -= OnRemoveOperationError;
  230. }
  231. this.package.RemoveSignal.ResetEvents();
  232. }
  233. UIUtils.SetElementDisplay(this, true);
  234. this.package = package;
  235. var displayPackage = package != null ? package.VersionToDisplay : null;
  236. ResetVersionItems(displayPackage);
  237. SetDisplayPackage(displayPackage);
  238. }
  239. private void SetError(Error error)
  240. {
  241. DetailError.AdjustSize(DetailView.verticalScroller.visible);
  242. DetailError.SetError(error);
  243. DetailError.OnCloseError = () =>
  244. {
  245. PackageCollection.Instance.RemovePackageErrors(package);
  246. PackageCollection.Instance.UpdatePackageCollection();
  247. };
  248. }
  249. private void OnAddOperation(IAddOperation operation)
  250. {
  251. operation.OnOperationError += OnAddOperationError;
  252. operation.OnOperationSuccess += OnAddOperationSuccess;
  253. }
  254. private void OnAddOperationError(Error error)
  255. {
  256. if (package != null && package.AddSignal.Operation != null)
  257. {
  258. package.AddSignal.Operation.OnOperationSuccess -= OnAddOperationSuccess;
  259. package.AddSignal.Operation.OnOperationError -= OnAddOperationError;
  260. package.AddSignal.Operation = null;
  261. }
  262. PackageCollection.Instance.AddPackageError(package, error);
  263. SetError(error);
  264. if (package != null)
  265. ResetVersionItems(package.VersionToDisplay);
  266. PackageCollection.Instance.UpdatePackageCollection();
  267. }
  268. private void OnAddOperationSuccess(PackageInfo packageInfo)
  269. {
  270. if (package != null && package.AddSignal.Operation != null)
  271. {
  272. package.AddSignal.Operation.OnOperationSuccess -= OnAddOperationSuccess;
  273. package.AddSignal.Operation.OnOperationError -= OnAddOperationError;
  274. package.AddSignal.Operation = null;
  275. }
  276. foreach (var extension in PackageManagerExtensions.Extensions)
  277. extension.OnPackageAddedOrUpdated(packageInfo.Info);
  278. }
  279. private void OnRemoveOperation(IRemoveOperation operation)
  280. {
  281. // Make sure we are not already registered
  282. operation.OnOperationError -= OnRemoveOperationError;
  283. operation.OnOperationSuccess -= OnRemoveOperationSuccess;
  284. operation.OnOperationError += OnRemoveOperationError;
  285. operation.OnOperationSuccess += OnRemoveOperationSuccess;
  286. }
  287. private void OnRemoveOperationError(Error error)
  288. {
  289. if (package != null && package.RemoveSignal.Operation != null)
  290. {
  291. package.RemoveSignal.Operation.OnOperationSuccess -= OnRemoveOperationSuccess;
  292. package.RemoveSignal.Operation.OnOperationError -= OnRemoveOperationError;
  293. package.RemoveSignal.Operation = null;
  294. }
  295. PackageCollection.Instance.AddPackageError(package, error);
  296. SetError(error);
  297. PackageCollection.Instance.UpdatePackageCollection();
  298. }
  299. private void OnRemoveOperationSuccess(PackageInfo packageInfo)
  300. {
  301. if (package != null && package.RemoveSignal.Operation != null)
  302. {
  303. package.RemoveSignal.Operation.OnOperationSuccess -= OnRemoveOperationSuccess;
  304. package.RemoveSignal.Operation.OnOperationError -= OnRemoveOperationError;
  305. package.RemoveSignal.Operation = null;
  306. }
  307. foreach (var extension in PackageManagerExtensions.Extensions)
  308. extension.OnPackageRemoved(packageInfo.Info);
  309. }
  310. private void RefreshAddButton()
  311. {
  312. if (package.Current != null && package.Current.IsInDevelopment)
  313. {
  314. UIUtils.SetElementDisplay(UpdateBuiltIn, false);
  315. UIUtils.SetElementDisplay(UpdateCombo, false);
  316. UIUtils.SetElementDisplay(UpdateButton, false);
  317. return;
  318. }
  319. var targetVersion = SelectedPackage;
  320. if (targetVersion == null)
  321. return;
  322. var enableButton = !Package.AddRemoveOperationInProgress;
  323. var enableVersionButton = true;
  324. var action = PackageAction.Update;
  325. var inprogress = false;
  326. var isBuiltIn = package.IsBuiltIn;
  327. SemVersion version = null;
  328. if (package.AddSignal.Operation != null)
  329. {
  330. if (isBuiltIn)
  331. {
  332. action = PackageAction.Enable;
  333. inprogress = true;
  334. enableButton = false;
  335. }
  336. else
  337. {
  338. var addOperationVersion = package.AddSignal.Operation.PackageInfo.Version;
  339. if (package.Current == null)
  340. {
  341. action = PackageAction.Add;
  342. inprogress = true;
  343. }
  344. else
  345. {
  346. action = addOperationVersion.CompareByPrecedence(package.Current.Version) >= 0
  347. ? PackageAction.Update : PackageAction.Downgrade;
  348. inprogress = true;
  349. }
  350. enableButton = false;
  351. enableVersionButton = false;
  352. }
  353. }
  354. else
  355. {
  356. if (package.Current != null)
  357. {
  358. // Installed
  359. if (package.Current.IsVersionLocked)
  360. {
  361. if (package.Current.Origin == PackageSource.Embedded)
  362. action = PackageAction.Embedded;
  363. else if (package.Current.Origin == PackageSource.Git)
  364. action = PackageAction.Git;
  365. enableButton = false;
  366. enableVersionButton = false;
  367. }
  368. else
  369. {
  370. if (targetVersion.IsCurrent)
  371. {
  372. if (targetVersion == package.LatestUpdate)
  373. action = PackageAction.UpToDate;
  374. else
  375. action = PackageAction.Current;
  376. enableButton = false;
  377. }
  378. else
  379. {
  380. action = targetVersion.Version.CompareByPrecedence(package.Current.Version) >= 0
  381. ? PackageAction.Update : PackageAction.Downgrade;
  382. }
  383. }
  384. }
  385. else
  386. {
  387. // Not Installed
  388. if (package.Versions.Any())
  389. {
  390. if (isBuiltIn)
  391. action = PackageAction.Enable;
  392. else
  393. action = PackageAction.Add;
  394. }
  395. }
  396. }
  397. if (package.RemoveSignal.Operation != null)
  398. enableButton = false;
  399. if (EditorApplication.isCompiling)
  400. {
  401. enableButton = false;
  402. enableVersionButton = false;
  403. EditorApplication.update -= CheckCompilationStatus;
  404. EditorApplication.update += CheckCompilationStatus;
  405. }
  406. var button = isBuiltIn ? UpdateBuiltIn : UpdateButton;
  407. button.SetEnabled(enableButton);
  408. VersionPopup.SetEnabled(enableVersionButton);
  409. button.text = GetButtonText(action, inprogress, version);
  410. var visibleFlag = !(package.Current != null && package.Current.IsVersionLocked);
  411. UIUtils.SetElementDisplay(UpdateBuiltIn, isBuiltIn && visibleFlag);
  412. UIUtils.SetElementDisplay(UpdateCombo, !isBuiltIn && visibleFlag);
  413. UIUtils.SetElementDisplay(UpdateButton, !isBuiltIn && visibleFlag);
  414. }
  415. private void RefreshRemoveButton()
  416. {
  417. var visibleFlag = false;
  418. var current = package.Current;
  419. // Show only if there is a current package installed
  420. if (current != null)
  421. {
  422. visibleFlag = current.CanBeRemoved && !package.IsPackageManagerUI;
  423. var action = current.IsBuiltIn ? PackageAction.Disable : PackageAction.Remove;
  424. var inprogress = package.RemoveSignal.Operation != null;
  425. var enableButton = visibleFlag && !EditorApplication.isCompiling && !inprogress && !Package.AddRemoveOperationInProgress;
  426. if (EditorApplication.isCompiling)
  427. {
  428. EditorApplication.update -= CheckCompilationStatus;
  429. EditorApplication.update += CheckCompilationStatus;
  430. }
  431. RemoveButton.SetEnabled(enableButton);
  432. RemoveButton.text = GetButtonText(action, inprogress);
  433. }
  434. UIUtils.SetElementDisplay(RemoveButton, visibleFlag);
  435. }
  436. private void CheckCompilationStatus()
  437. {
  438. if (EditorApplication.isCompiling)
  439. return;
  440. RefreshAddButton();
  441. RefreshRemoveButton();
  442. EditorApplication.update -= CheckCompilationStatus;
  443. }
  444. private static string GetButtonText(PackageAction action, bool inProgress = false, SemVersion version = null)
  445. {
  446. return version == null ?
  447. string.Format("{0}", inProgress ? PackageActionInProgressVerbs[(int)action] : PackageActionVerbs[(int)action]) :
  448. string.Format("{0} {1}", inProgress ? PackageActionInProgressVerbs[(int)action] : PackageActionVerbs[(int)action], version);
  449. }
  450. private void UpdateClick()
  451. {
  452. if (package.IsPackageManagerUI)
  453. {
  454. // Let's not allow updating of the UI if there are build errrors, as for now, that will prevent the UI from reloading properly.
  455. if (EditorUtility.scriptCompilationFailed)
  456. {
  457. EditorUtility.DisplayDialog("Unity Package Manager", "The Package Manager UI cannot be updated while there are script compilation errors in your project. Please fix the errors and try again.", "Ok");
  458. return;
  459. }
  460. if (!EditorUtility.DisplayDialog("Unity Package Manager", "Updating this package will close the Package Manager window. You will have to re-open it after the update is done. Do you want to continue?", "Yes", "No"))
  461. return;
  462. if (package.AddSignal.Operation != null)
  463. {
  464. package.AddSignal.Operation.OnOperationSuccess -= OnAddOperationSuccess;
  465. package.AddSignal.Operation.OnOperationError -= OnAddOperationError;
  466. package.AddSignal.ResetEvents();
  467. package.AddSignal.Operation = null;
  468. }
  469. DetailError.ClearError();
  470. EditorApplication.update += CloseAndUpdate;
  471. return;
  472. }
  473. DetailError.ClearError();
  474. package.Add(SelectedPackage);
  475. RefreshAddButton();
  476. RefreshRemoveButton();
  477. }
  478. private void CloseAndUpdate()
  479. {
  480. EditorApplication.update -= CloseAndUpdate;
  481. package.Add(SelectedPackage);
  482. var windows = UnityEngine.Resources.FindObjectsOfTypeAll<PackageManagerWindow>();
  483. if (windows.Length > 0)
  484. {
  485. windows[0].Close();
  486. }
  487. }
  488. private void RemoveClick()
  489. {
  490. DetailError.ClearError();
  491. package.Remove();
  492. RefreshRemoveButton();
  493. RefreshAddButton();
  494. }
  495. private static void ViewOfflineUrl(Func<string> getOfflineUrl, string messageOnNotFound)
  496. {
  497. var offlineUrl = getOfflineUrl();
  498. if (!string.IsNullOrEmpty(offlineUrl))
  499. Application.OpenURL(offlineUrl);
  500. else
  501. EditorUtility.DisplayDialog("Unity Package Manager", messageOnNotFound, "Ok");
  502. }
  503. private static void ViewUrl(Func<string> getUrl, Func<string> getOfflineUrl, string messageOnNotFound)
  504. {
  505. if (Application.internetReachability != NetworkReachability.NotReachable)
  506. {
  507. var onlineUrl = getUrl();
  508. var request = UnityWebRequest.Head(onlineUrl);
  509. var operation = request.SendWebRequest();
  510. operation.completed += (op) =>
  511. {
  512. if (request.responseCode != 404)
  513. {
  514. Application.OpenURL(onlineUrl);
  515. }
  516. else
  517. {
  518. ViewOfflineUrl(getOfflineUrl, messageOnNotFound);
  519. }
  520. };
  521. }
  522. else
  523. {
  524. ViewOfflineUrl(getOfflineUrl, messageOnNotFound);
  525. }
  526. }
  527. private void ViewDocClick()
  528. {
  529. ViewUrl(DisplayPackage.GetDocumentationUrl, DisplayPackage.GetOfflineDocumentationUrl, "Unable to find documentation.");
  530. }
  531. private void ViewChangelogClick()
  532. {
  533. ViewUrl(DisplayPackage.GetChangelogUrl, DisplayPackage.GetOfflineChangelogUrl, "Unable to find changelog.");
  534. }
  535. private void ViewLicensesClick()
  536. {
  537. ViewUrl(DisplayPackage.GetLicensesUrl, DisplayPackage.GetOfflineLicensesUrl, "Unable to find licenses.");
  538. }
  539. private Label DetailDesc { get { return root.Q<Label>("detailDesc"); } }
  540. internal Button UpdateButton { get { return root.Q<Button>("update"); } }
  541. private Button RemoveButton { get { return root.Q<Button>("remove"); } }
  542. private Button ViewDocButton { get { return root.Q<Button>("viewDocumentation"); } }
  543. private VisualElement DocumentationContainer { get { return root.Q<VisualElement>("documentationContainer"); } }
  544. private Button ViewChangelogButton { get { return root.Q<Button>("viewChangelog"); } }
  545. private VisualElement ChangelogContainer { get { return root.Q<VisualElement>("changeLogContainer"); } }
  546. private VisualElement ViewLicensesContainer { get { return root.Q<VisualElement>("viewLicensesContainer"); } }
  547. private Button ViewLicenses { get { return root.Q<Button>("viewLicenses"); } }
  548. private VisualElement UpdateContainer { get { return root.Q<VisualElement>("updateContainer"); } }
  549. private Alert DetailError { get { return root.Q<Alert>("detailError"); } }
  550. private ScrollView DetailView { get { return root.Q<ScrollView>("detailView"); } }
  551. private Label DetailModuleReference { get { return root.Q<Label>("detailModuleReference"); } }
  552. private Label DetailTitle { get { return root.Q<Label>("detailTitle"); }}
  553. private Label DetailVersion { get { return root.Q<Label>("detailVersion"); }}
  554. private Label DetailAuthor { get { return root.Q<Label>("detailAuthor"); }}
  555. private VisualElement DetailWarning { get { return root.Q<VisualElement>("detailWarning"); }}
  556. private Button DetailWarningLink { get { return root.Q<Button>("detailWarningLink"); } }
  557. private Label VerifyLabel { get { return root.Q<Label>("tagVerify"); } }
  558. private VisualElement CustomContainer { get { return root.Q<VisualElement>("detailCustomContainer"); } }
  559. internal VisualElement GetTag(PackageTag tag) {return root.Q<VisualElement>("tag-" + tag); }
  560. private VisualElement UpdateDropdownContainer { get { return root.Q<VisualElement>("updateDropdownContainer"); } }
  561. internal VisualElement UpdateCombo { get { return root.Q<VisualElement>("updateCombo"); } }
  562. internal Button UpdateBuiltIn { get { return root.Q<Button>("updateBuiltIn"); } }
  563. }
  564. }