@ -0,0 +1,110 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | |||
<PropertyGroup> | |||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |||
<ProjectGuid>{23AB2621-A05C-4377-8418-85E6012C0BBE}</ProjectGuid> | |||
<OutputType>Library</OutputType> | |||
<AppDesignerFolder>Properties</AppDesignerFolder> | |||
<RootNamespace>BSIPA_ModList</RootNamespace> | |||
<AssemblyName>BSIPA-ModList</AssemblyName> | |||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> | |||
<FileAlignment>512</FileAlignment> | |||
<Deterministic>true</Deterministic> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |||
<DebugSymbols>true</DebugSymbols> | |||
<DebugType>portable</DebugType> | |||
<Optimize>false</Optimize> | |||
<OutputPath>bin\Debug\</OutputPath> | |||
<DefineConstants>DEBUG;TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |||
<DebugType>portable</DebugType> | |||
<Optimize>true</Optimize> | |||
<OutputPath>bin\Release\</OutputPath> | |||
<DefineConstants>TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Reference Include="Assembly-CSharp"> | |||
<HintPath>..\Refs\Assembly-CSharp.dll</HintPath> | |||
<Private>False</Private> | |||
</Reference> | |||
<Reference Include="BeatSaberCustomUI"> | |||
<HintPath>..\Refs\BeatSaberCustomUI.dll</HintPath> | |||
<Private>False</Private> | |||
</Reference> | |||
<Reference Include="System" /> | |||
<Reference Include="System.Core" /> | |||
<Reference Include="System.Xml.Linq" /> | |||
<Reference Include="System.Data.DataSetExtensions" /> | |||
<Reference Include="Microsoft.CSharp" /> | |||
<Reference Include="System.Data" /> | |||
<Reference Include="System.Net.Http" /> | |||
<Reference Include="System.Xml" /> | |||
<Reference Include="UnityEngine.CoreModule"> | |||
<HintPath>..\Refs\UnityEngine.CoreModule.dll</HintPath> | |||
<Private>False</Private> | |||
</Reference> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Include="Plugin.cs" /> | |||
<Compile Include="Properties\AssemblyInfo.cs" /> | |||
<Compile Include="UI\ModListController.cs" /> | |||
<Compile Include="UI\ModListMenu.cs" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\IPA.Loader\IPA.Loader.csproj"> | |||
<Project>{5ad344f0-01a0-4ca8-92e5-9d095737744d}</Project> | |||
<Name>IPA.Loader</Name> | |||
<Private>False</Private> | |||
</ProjectReference> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<EmbeddedResource Include="manifest.json" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<PackageReference Include="SemanticVersioning"> | |||
<Version>1.2.0</Version> | |||
</PackageReference> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<EmbeddedResource Include="Icons\mod_bsipa.png" /> | |||
<EmbeddedResource Include="Icons\mod_ipa.png" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<EmbeddedResource Include="Icons\self.png" /> | |||
</ItemGroup> | |||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | |||
<Target Name="AfterBuild"> | |||
<Message Text="Packing..." Importance="normal" /> | |||
<!--<ItemGroup> | |||
<Dlls Include="$(SolutionDir)IPA.Injector\bin\$(OtherConfig)\**\*" Exclude="$(SolutionDir)IPA.Injector\bin\$(OtherConfig)\Libraries\**\*" /> | |||
<Dlls Include="$(SolutionDir)Doorstop\Proxy\bin\x64\$(ProxyConfig)\**\*.dll" /> | |||
<Dlls Include="$(SolutionDir)Doorstop\Proxy\bin\x64\$(ProxyConfig)\**\*.pdb" /> | |||
</ItemGroup> | |||
<Copy SourceFiles="@(Dlls)" DestinationFolder="$(OutputPath)IPA\%(RecursiveDir)" /> | |||
<Move SourceFiles="$(OutputPath)IPA\proxy.dll" DestinationFiles="$(OutputPath)IPA\winhttp.dll" /> | |||
<Move Condition="Exists('$(OutputPath)IPA\proxy.pdb')" SourceFiles="$(OutputPath)IPA\proxy.pdb" DestinationFiles="$(OutputPath)IPA\winhttp.pdb" /> | |||
<ItemGroup> | |||
<BadFiles Include="$(OutputPath)*.dll" /> | |||
<BadFiles Include="$(OutputPath)*.pdb" Condition="'$(Configuration)'=='Release' Or '$(Configuration)'=='Verbose_Release'" /> | |||
<BadFiles Include="$(OutputPath)IPA\*.pdb" Condition="'$(Configuration)'=='Release' Or '$(Configuration)'=='Verbose_Release'" /> | |||
</ItemGroup> | |||
<Delete Files="@(BadFiles)" /> | |||
<RemoveDir Directories="$(OutputPath)Libraries\" />--> | |||
<ItemGroup> | |||
<BadFiles Include="$(OutputPath)**/*" Exclude="$(OutputPath)**/$(AssemblyName).*" /> | |||
</ItemGroup> | |||
<Delete Files="@(BadFiles)" /> | |||
<ItemGroup> | |||
<UnBadFiles Include="$(OutputPath)*" /> | |||
</ItemGroup> | |||
<Move SourceFiles="@(UnBadFiles)" DestinationFolder="$(OutputPath)Plugins/" /> | |||
</Target> | |||
</Project> |
@ -0,0 +1,65 @@ | |||
using IPA; | |||
using UnityEngine.SceneManagement; | |||
using IPALogger = IPA.Logging.Logger; | |||
using CustomUI.BeatSaber; | |||
using BSIPA_ModList.UI; | |||
using CustomUI.MenuButton; | |||
using UnityEngine.Events; | |||
namespace BSIPA_ModList | |||
{ | |||
internal static class Logger | |||
{ | |||
internal static IPALogger log { get; set; } | |||
} | |||
public class Plugin : IBeatSaberPlugin | |||
{ | |||
public void Init(IPALogger logger) | |||
{ | |||
Logger.log = logger; | |||
Logger.log.Debug("Init"); | |||
} | |||
public void OnActiveSceneChanged(Scene prevScene, Scene nextScene) | |||
{ | |||
} | |||
public void OnApplicationQuit() | |||
{ | |||
} | |||
private ModListMenu menu; | |||
private MenuButton button; | |||
public void OnApplicationStart() | |||
{ | |||
Logger.log.Debug("Creating Menu"); | |||
} | |||
public void OnFixedUpdate() | |||
{ | |||
} | |||
public void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode) | |||
{ | |||
if (scene.name == "MenuCore" && button == null) | |||
{ | |||
menu = BeatSaberUI.CreateCustomMenu<ModListMenu>("Installed Mods"); | |||
button = MenuButtonUI.AddButton("All Mods", "Shows all installed mods, along with controls for updating them.", () => | |||
{ | |||
Logger.log.Debug("Presenting menu"); | |||
menu.Present(); | |||
}); | |||
} | |||
} | |||
public void OnSceneUnloaded(Scene scene) | |||
{ | |||
} | |||
public void OnUpdate() | |||
{ | |||
} | |||
} | |||
} |
@ -0,0 +1,36 @@ | |||
using System.Reflection; | |||
using System.Runtime.CompilerServices; | |||
using System.Runtime.InteropServices; | |||
// General Information about an assembly is controlled through the following | |||
// set of attributes. Change these attribute values to modify the information | |||
// associated with an assembly. | |||
[assembly: AssemblyTitle("BSIPA-ModList")] | |||
[assembly: AssemblyDescription("")] | |||
[assembly: AssemblyConfiguration("")] | |||
[assembly: AssemblyCompany("")] | |||
[assembly: AssemblyProduct("BSIPA-ModList")] | |||
[assembly: AssemblyCopyright("Copyright © 2019")] | |||
[assembly: AssemblyTrademark("")] | |||
[assembly: AssemblyCulture("")] | |||
// Setting ComVisible to false makes the types in this assembly not visible | |||
// to COM components. If you need to access a type in this assembly from | |||
// COM, set the ComVisible attribute to true on that type. | |||
[assembly: ComVisible(false)] | |||
// The following GUID is for the ID of the typelib if this project is exposed to COM | |||
[assembly: Guid("23ab2621-a05c-4377-8418-85e6012c0bbe")] | |||
// Version information for an assembly consists of the following four values: | |||
// | |||
// Major Version | |||
// Minor Version | |||
// Build Number | |||
// Revision | |||
// | |||
// You can specify all the values or you can default the Build and Revision Numbers | |||
// by using the '*' as shown below: | |||
// [assembly: AssemblyVersion("1.0.*")] | |||
[assembly: AssemblyVersion("1.0.0.0")] | |||
[assembly: AssemblyFileVersion("1.0.0.0")] |
@ -0,0 +1,135 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using CustomUI.BeatSaber; | |||
using CustomUI.Utilities; | |||
using HMUI; | |||
using IPA.Loader; | |||
using IPA.Old; | |||
using UnityEngine; | |||
namespace BSIPA_ModList.UI | |||
{ | |||
internal class ModListController : CustomListViewController | |||
{ | |||
private interface IClickableCell | |||
{ | |||
void OnSelect(ModListController cntrl); | |||
} | |||
private class BSIPAModCell : CustomCellInfo, IClickableCell | |||
{ | |||
private static Sprite _defaultIcon; | |||
public static Sprite DefaultIcon | |||
{ | |||
get | |||
{ | |||
if (_defaultIcon == null) | |||
_defaultIcon = UIUtilities.LoadSpriteFromResources("BSIPA_ModList.Icons.mod_bsipa.png"); | |||
return _defaultIcon; | |||
} | |||
} | |||
internal PluginLoader.PluginInfo Plugin; | |||
public BSIPAModCell(PluginLoader.PluginInfo plugin) | |||
: base($"{plugin.Metadata.Name} <size=60%>v{plugin.Metadata.Version}", plugin.Metadata.Manifest.Author, null) | |||
{ | |||
Plugin = plugin; | |||
if (plugin.Metadata.Manifest.IconPath != null) | |||
icon = UIUtilities.LoadSpriteRaw(UIUtilities.GetResource(plugin.Metadata.Assembly, plugin.Metadata.Manifest.IconPath)); | |||
else | |||
icon = DefaultIcon; | |||
Logger.log.Debug($"BSIPAModCell {plugin.Metadata.Name} {plugin.Metadata.Version}"); | |||
} | |||
public void OnSelect(ModListController cntrl) | |||
{ | |||
Logger.log.Debug($"Selected BSIPAModCell {Plugin.Metadata.Name} {Plugin.Metadata.Version}"); | |||
} | |||
} | |||
private class BSIPAIgnoredModCell : CustomCellInfo, IClickableCell | |||
{ | |||
internal PluginLoader.PluginMetadata Plugin; | |||
public BSIPAIgnoredModCell(PluginLoader.PluginMetadata plugin) | |||
: base($"<color=#878787>{plugin.Name} <size=60%>v{plugin.Version}", $"{plugin.Manifest.Author} <color=#BFBFBF>- <i>Not loaded</i>", BSIPAModCell.DefaultIcon) | |||
{ | |||
Plugin = plugin; | |||
Logger.log.Debug($"BSIPAIgnoredModCell {plugin.Name} {plugin.Version}"); | |||
} | |||
public void OnSelect(ModListController cntrl) | |||
{ | |||
Logger.log.Debug($"Selected BSIPAIgnoredModCell {Plugin.Name} {Plugin.Version}"); | |||
} | |||
} | |||
#pragma warning disable CS0618 | |||
private class IPAModCell : CustomCellInfo, IClickableCell | |||
{ | |||
private static Sprite _defaultIcon; | |||
public static Sprite DefaultIcon | |||
{ | |||
get | |||
{ | |||
if (_defaultIcon == null) | |||
_defaultIcon = UIUtilities.LoadSpriteFromResources("BSIPA_ModList.Icons.mod_ipa.png"); | |||
return _defaultIcon; | |||
} | |||
} | |||
internal IPlugin Plugin; | |||
public IPAModCell(IPlugin plugin) | |||
: base($"{plugin.Name} <size=60%>{plugin.Version}", "<color=#BFBFBF><i>Legacy</i>", DefaultIcon) | |||
{ | |||
Plugin = plugin; | |||
Logger.log.Debug($"IPAModCell {plugin.Name} {plugin.Version}"); | |||
} | |||
public void OnSelect(ModListController cntrl) | |||
{ | |||
Logger.log.Debug($"Selected IPAModCell {Plugin.Name} {Plugin.Version}"); | |||
} | |||
} | |||
#pragma warning restore | |||
#pragma warning disable CS0618 | |||
public void Init(IEnumerable<PluginLoader.PluginInfo> bsipaPlugins, IEnumerable<PluginLoader.PluginMetadata> ignoredPlugins, IEnumerable<IPlugin> ipaPlugins) | |||
{ | |||
Logger.log.Debug("List Controller Init"); | |||
DidActivateEvent = DidActivate; | |||
DidSelectRowEvent = DidSelectRow; | |||
includePageButtons = true; | |||
reuseIdentifier = "BSIPAModListTableCell"; | |||
foreach (var plugin in bsipaPlugins) | |||
Data.Add(new BSIPAModCell(plugin)); | |||
foreach (var plugin in ignoredPlugins) | |||
Data.Add(new BSIPAIgnoredModCell(plugin)); | |||
foreach (var plugin in ipaPlugins) | |||
Data.Add(new IPAModCell(plugin)); | |||
} | |||
#pragma warning restore | |||
private void DidSelectRow(TableView view, int index) | |||
{ | |||
Debug.Assert(ReferenceEquals(view.dataSource, this)); | |||
(Data[index] as IClickableCell)?.OnSelect(this); | |||
} | |||
private new void DidActivate(bool first, ActivationType type) | |||
{ | |||
} | |||
} | |||
} |
@ -0,0 +1,26 @@ | |||
using CustomUI.BeatSaber; | |||
using IPA.Loader; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BSIPA_ModList.UI | |||
{ | |||
internal class ModListMenu : CustomMenu | |||
{ | |||
private ModListController controller; | |||
#pragma warning disable CS0618 | |||
public ModListMenu() | |||
{ | |||
Logger.log.Debug("Menu constructor"); | |||
controller = BeatSaberUI.CreateViewController<ModListController>(); | |||
controller.Init(PluginManager.AllPlugins, PluginLoader.ignoredPlugins, PluginManager.Plugins); | |||
SetMainViewController(controller, true); | |||
} | |||
#pragma warning restore | |||
} | |||
} |
@ -0,0 +1,15 @@ | |||
{ | |||
"$schema": "https://raw.githubusercontent.com/nike4613/ModSaber-MetadataFileSchema/master/Schema.json", | |||
"author": "DaNike", | |||
"description": "An in-game interface client for BSIPA.", | |||
"gameVersion": "0.13.2", | |||
"id": "BSIPA-ModList", | |||
"name": "BSIPA Mod List", | |||
"version": "1.0.0", | |||
"icon": "BSIPA_ModList.Icons.self.png", | |||
"dependsOn": { | |||
"BSIPA": "^3.12.13", | |||
"CustomUI": "^1.5.4" | |||
}, | |||
"features": [] | |||
} |