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.

159 lines
5.5 KiB

  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using CustomUI.BeatSaber;
  5. using CustomUI.Utilities;
  6. using HMUI;
  7. using IPA.Loader;
  8. using IPA.Old;
  9. using UnityEngine;
  10. using VRUI;
  11. using IPA.Loader.Features;
  12. namespace BSIPA_ModList.UI
  13. {
  14. internal class ModListController : CustomListViewController
  15. {
  16. private interface IClickableCell
  17. {
  18. void OnSelect(ModListController cntrl);
  19. }
  20. private class BSIPAModCell : CustomCellInfo, IClickableCell
  21. {
  22. private static Sprite _defaultIcon;
  23. public static Sprite DefaultIcon
  24. {
  25. get
  26. {
  27. if (_defaultIcon == null)
  28. _defaultIcon = UIUtilities.LoadSpriteFromResources("BSIPA_ModList.Icons.mod_bsipa.png");
  29. return _defaultIcon;
  30. }
  31. }
  32. internal PluginLoader.PluginInfo Plugin;
  33. private ModListController list;
  34. public BSIPAModCell(ModListController list, PluginLoader.PluginInfo plugin)
  35. : base($"{plugin.Metadata.Name} <size=60%>v{plugin.Metadata.Version}", plugin.Metadata.Manifest.Author, null)
  36. {
  37. Plugin = plugin;
  38. this.list = list;
  39. if (plugin.Metadata.Manifest.IconPath != null)
  40. icon = UIUtilities.LoadSpriteRaw(UIUtilities.GetResource(plugin.Metadata.Assembly, plugin.Metadata.Manifest.IconPath));
  41. else
  42. icon = DefaultIcon;
  43. Logger.log.Debug($"BSIPAModCell {plugin.Metadata.Name} {plugin.Metadata.Version}");
  44. }
  45. private ModInfoViewController infoView;
  46. public void OnSelect(ModListController cntrl)
  47. {
  48. Logger.log.Debug($"Selected BSIPAModCell {Plugin.Metadata.Name} {Plugin.Metadata.Version}");
  49. if (infoView == null)
  50. {
  51. infoView = BeatSaberUI.CreateViewController<ModInfoViewController>();
  52. infoView.Init(icon, Plugin.Metadata.Name, Plugin.Metadata.Version.ToString(), Plugin.Metadata.Manifest.Author,
  53. Plugin.Metadata.Manifest.Description, Plugin.Metadata.Features.FirstOrDefault(f => f is NoUpdateFeature) == null);
  54. }
  55. list.flow.SetSelected(infoView);
  56. }
  57. }
  58. private class BSIPAIgnoredModCell : CustomCellInfo, IClickableCell
  59. {
  60. internal PluginLoader.PluginMetadata Plugin;
  61. private ModListController list;
  62. public BSIPAIgnoredModCell(ModListController list, PluginLoader.PluginMetadata plugin)
  63. : base($"<color=#878787>{plugin.Name} <size=60%>v{plugin.Version}", $"{plugin.Manifest.Author} <color=#BFBFBF>- <i>Not loaded</i>", BSIPAModCell.DefaultIcon)
  64. {
  65. Plugin = plugin;
  66. this.list = list;
  67. Logger.log.Debug($"BSIPAIgnoredModCell {plugin.Name} {plugin.Version}");
  68. }
  69. public void OnSelect(ModListController cntrl)
  70. {
  71. Logger.log.Debug($"Selected BSIPAIgnoredModCell {Plugin.Name} {Plugin.Version}");
  72. }
  73. }
  74. #pragma warning disable CS0618
  75. private class IPAModCell : CustomCellInfo, IClickableCell
  76. {
  77. private static Sprite _defaultIcon;
  78. public static Sprite DefaultIcon
  79. {
  80. get
  81. {
  82. if (_defaultIcon == null)
  83. _defaultIcon = UIUtilities.LoadSpriteFromResources("BSIPA_ModList.Icons.mod_ipa.png");
  84. return _defaultIcon;
  85. }
  86. }
  87. internal IPlugin Plugin;
  88. private ModListController list;
  89. public IPAModCell(ModListController list, IPlugin plugin)
  90. : base($"{plugin.Name} <size=60%>{plugin.Version}", "<color=#BFBFBF><i>Legacy</i>", DefaultIcon)
  91. {
  92. Plugin = plugin;
  93. this.list = list;
  94. Logger.log.Debug($"IPAModCell {plugin.Name} {plugin.Version}");
  95. }
  96. public void OnSelect(ModListController cntrl)
  97. {
  98. Logger.log.Debug($"Selected IPAModCell {Plugin.Name} {Plugin.Version}");
  99. }
  100. }
  101. #pragma warning restore
  102. private ModListFlowCoordinator flow;
  103. #pragma warning disable CS0618
  104. public void Init(ModListFlowCoordinator flow, IEnumerable<PluginLoader.PluginInfo> bsipaPlugins, IEnumerable<PluginLoader.PluginMetadata> ignoredPlugins, IEnumerable<IPlugin> ipaPlugins)
  105. {
  106. Logger.log.Debug("List Controller Init");
  107. DidActivateEvent = DidActivate;
  108. DidSelectRowEvent = DidSelectRow;
  109. includePageButtons = true;
  110. this.flow = flow;
  111. reuseIdentifier = "BSIPAModListTableCell";
  112. foreach (var plugin in bsipaPlugins)
  113. Data.Add(new BSIPAModCell(this, plugin));
  114. foreach (var plugin in ignoredPlugins)
  115. Data.Add(new BSIPAIgnoredModCell(this, plugin));
  116. foreach (var plugin in ipaPlugins)
  117. Data.Add(new IPAModCell(this, plugin));
  118. }
  119. #pragma warning restore
  120. private void DidSelectRow(TableView view, int index)
  121. {
  122. Debug.Assert(ReferenceEquals(view.dataSource, this));
  123. (Data[index] as IClickableCell)?.OnSelect(this);
  124. }
  125. private new void DidActivate(bool first, ActivationType type)
  126. {
  127. }
  128. }
  129. }