using BSIPA_ModList.UI.ViewControllers;
|
|
using CustomUI.BeatSaber;
|
|
using CustomUI.Utilities;
|
|
using IPA.Loader;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using UnityEngine.SceneManagement;
|
|
using VRUI;
|
|
|
|
namespace BSIPA_ModList.UI
|
|
{
|
|
internal class ModListFlowCoordinator : FlowCoordinator
|
|
{
|
|
private BackButtonNavigationController navigationController;
|
|
private ModListController modList;
|
|
private DownloadProgressViewController downloads;
|
|
private VRUIViewController settings;
|
|
|
|
#pragma warning disable CS0618
|
|
protected override void DidActivate(bool firstActivation, ActivationType activationType)
|
|
{ // thx Caeden
|
|
if (firstActivation && activationType == ActivationType.AddedToHierarchy)
|
|
{
|
|
title = "Installed Mods";
|
|
|
|
navigationController = BeatSaberUI.CreateViewController<BackButtonNavigationController>();
|
|
navigationController.didFinishEvent += backButton_DidFinish;
|
|
|
|
modList = BeatSaberUI.CreateViewController<ModListController>();
|
|
modList.Init(this, PluginManager.AllPlugins.Select(p => p.Metadata).Concat(PluginManager.DisabledPlugins), PluginLoader.ignoredPlugins, PluginManager.Plugins);
|
|
|
|
settings = SettingsViewController.Create();
|
|
|
|
downloads = BeatSaberUI.CreateViewController<DownloadProgressViewController>();
|
|
|
|
PushViewControllerToNavigationController(navigationController, modList);
|
|
}
|
|
|
|
ProvideInitialViewControllers(navigationController, settings, downloads);
|
|
}
|
|
#pragma warning restore
|
|
|
|
private delegate void PresentFlowCoordDel(FlowCoordinator self, FlowCoordinator newF, Action finished, bool immediate, bool replaceTop);
|
|
private static PresentFlowCoordDel presentFlow;
|
|
|
|
public void Present(Action finished = null, bool immediate = false, bool replaceTop = false)
|
|
{
|
|
if (presentFlow == null)
|
|
{
|
|
var ty = typeof(FlowCoordinator);
|
|
var m = ty.GetMethod("PresentFlowCoordinator", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
|
presentFlow = (PresentFlowCoordDel)Delegate.CreateDelegate(typeof(PresentFlowCoordDel), m);
|
|
}
|
|
|
|
MainFlowCoordinator mainFlow = Resources.FindObjectsOfTypeAll<MainFlowCoordinator>().First();
|
|
presentFlow(mainFlow, this, finished, immediate, replaceTop);
|
|
}
|
|
|
|
public bool HasSelected { get; private set; } = false;
|
|
|
|
public void SetSelected(VRUIViewController selected, Action callback = null, bool immediate = false)
|
|
{
|
|
if (immediate)
|
|
{
|
|
if (HasSelected)
|
|
PopViewController(immediate: true);
|
|
PushViewController(selected, callback, true);
|
|
HasSelected = true;
|
|
}
|
|
else
|
|
{
|
|
if (HasSelected)
|
|
PopViewController(() =>
|
|
{
|
|
PushViewController(selected, callback, immediate);
|
|
HasSelected = true;
|
|
}, immediate);
|
|
else
|
|
{
|
|
PushViewController(selected, callback, immediate);
|
|
HasSelected = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ClearSelected(Action callback = null, bool immediate = false)
|
|
{
|
|
if (HasSelected) PopViewController(callback, immediate);
|
|
HasSelected = false;
|
|
}
|
|
|
|
public void PushViewController(VRUIViewController controller, Action callback = null, bool immediate = false)
|
|
{
|
|
PushViewControllerToNavigationController(navigationController, controller, callback, immediate);
|
|
}
|
|
|
|
public void PopViewController(Action callback = null, bool immediate = false)
|
|
{
|
|
PopViewControllerFromNavigationController(navigationController, callback, immediate);
|
|
}
|
|
|
|
internal HashSet<Action> exitActions = new HashSet<Action>();
|
|
|
|
private delegate void DismissFlowDel(FlowCoordinator self, FlowCoordinator newF, Action finished, bool immediate);
|
|
private static DismissFlowDel dismissFlow;
|
|
|
|
private void backButton_DidFinish()
|
|
{
|
|
if (dismissFlow == null)
|
|
{
|
|
var ty = typeof(FlowCoordinator);
|
|
var m = ty.GetMethod("DismissFlowCoordinator", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
|
dismissFlow = (DismissFlowDel)Delegate.CreateDelegate(typeof(DismissFlowDel), m);
|
|
}
|
|
|
|
if (exitActions.Count == 0)
|
|
{
|
|
MainFlowCoordinator mainFlow = Resources.FindObjectsOfTypeAll<MainFlowCoordinator>().First();
|
|
dismissFlow(mainFlow, this, null, false);
|
|
}
|
|
else
|
|
{
|
|
var actions = exitActions;
|
|
UnityAction<Scene, LoadSceneMode> releaseAction = null;
|
|
releaseAction = (a, b) => SceneManager_sceneLoaded(actions, releaseAction, a, b);
|
|
SceneManager.sceneLoaded += releaseAction;
|
|
Resources.FindObjectsOfTypeAll<MenuTransitionsHelperSO>().First().RestartGame(true);
|
|
}
|
|
}
|
|
|
|
private static void SceneManager_sceneLoaded(HashSet<Action> actions, UnityAction<Scene, LoadSceneMode> self, Scene arg0, LoadSceneMode arg1)
|
|
{
|
|
if (arg0.name == "Init")
|
|
{
|
|
SceneManager.sceneLoaded -= self;
|
|
|
|
foreach (var act in actions)
|
|
act();
|
|
}
|
|
}
|
|
}
|
|
}
|