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.
 
 
 
 

189 lines
9.1 KiB

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using CustomUI.BeatSaber;
using CustomUI.Utilities;
using HMUI;
using IPA.Updating.BeatMods;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using VRUI;
namespace BSIPA_ModList.UI.ViewControllers
{
// originally ripped verbatim from Andruzz's BeatSaverDownloader
internal class DownloadProgressViewController : VRUIViewController, TableView.IDataSource
{
private TextMeshProUGUI _titleText;
private TextMeshProUGUI _manualDownloadText;
private Button _checkForUpdates;
private Button _downloadUpdates;
private Button _restartGame;
private TableView _currentlyUpdatingTableView;
private LevelListTableCell _songListTableCellInstance;
private Button _pageUpButton;
private Button _pageDownButton;
private TableViewScroller _scroller;
private const float TableXOffset = -20f;
private const float ButtonXOffset = 36f;
private static readonly Vector2 ButtonSize = new Vector2(40f, 10f);
protected override void DidActivate(bool firstActivation, ActivationType type)
{
if (firstActivation && type == ActivationType.AddedToHierarchy)
{
DownloadController.Instance.OnDownloaderListChanged -= Refresh;
DownloadController.Instance.OnDownloadStateChanged -= DownloaderStateChanged;
_songListTableCellInstance = Resources.FindObjectsOfTypeAll<LevelListTableCell>().First(x => (x.name == "LevelListTableCell"));
_titleText = BeatSaberUI.CreateText(rectTransform, "DOWNLOAD QUEUE", new Vector2(0f, 35f));
_titleText.alignment = TextAlignmentOptions.Top;
_titleText.fontSize = 6f;
_manualDownloadText = BeatSaberUI.CreateText(rectTransform, "Manual Restart Required", new Vector2(37f, -3f));
_manualDownloadText.alignment = TextAlignmentOptions.Top;
_manualDownloadText.fontSize = 4f;
_manualDownloadText.gameObject.SetActive(false);
_pageUpButton = Instantiate(Resources.FindObjectsOfTypeAll<Button>().Last(x => (x.name == "PageUpButton")), rectTransform, false);
(_pageUpButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 1f);
(_pageUpButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 1f);
(_pageUpButton.transform as RectTransform).anchoredPosition = new Vector2(TableXOffset, -14f);
(_pageUpButton.transform as RectTransform).sizeDelta = new Vector2(40f, 10f);
_pageUpButton.interactable = true;
_pageUpButton.onClick.AddListener(delegate ()
{
_scroller.PageScrollUp();
});
_pageDownButton = Instantiate(Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == "PageDownButton")), rectTransform, false);
(_pageDownButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0f);
(_pageDownButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0f);
(_pageDownButton.transform as RectTransform).anchoredPosition = new Vector2(TableXOffset, 8f);
(_pageDownButton.transform as RectTransform).sizeDelta = new Vector2(40f, 10f);
_pageDownButton.interactable = true;
_pageDownButton.onClick.AddListener(delegate ()
{
_scroller.PageScrollDown();
});
var gobj = new GameObject("DownloadTable");
gobj.SetActive(false);
_currentlyUpdatingTableView = gobj.AddComponent<TableView>();
_currentlyUpdatingTableView.transform.SetParent(rectTransform, false);
_currentlyUpdatingTableView.SetPrivateField("_isInitialized", false);
_currentlyUpdatingTableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]);
var viewport = new GameObject("Viewport").AddComponent<RectTransform>();
viewport.SetParent(gobj.GetComponent<RectTransform>(), false);
gobj.GetComponent<ScrollRect>().viewport = viewport;
RectMask2D viewportMask = Instantiate(Resources.FindObjectsOfTypeAll<RectMask2D>().First(), _currentlyUpdatingTableView.transform, false);
viewportMask.transform.DetachChildren();
_currentlyUpdatingTableView.GetComponentsInChildren<RectTransform>().First(x => x.name == "Content").transform.SetParent(viewportMask.rectTransform, false);
(_currentlyUpdatingTableView.transform as RectTransform).anchorMin = new Vector2(0.3f, 0.5f);
(_currentlyUpdatingTableView.transform as RectTransform).anchorMax = new Vector2(0.7f, 0.5f);
(_currentlyUpdatingTableView.transform as RectTransform).sizeDelta = new Vector2(0f, 60f);
(_currentlyUpdatingTableView.transform as RectTransform).anchoredPosition = new Vector3(TableXOffset, -3f);
ReflectionUtil.SetPrivateField(_currentlyUpdatingTableView, "_pageUpButton", _pageUpButton);
ReflectionUtil.SetPrivateField(_currentlyUpdatingTableView, "_pageDownButton", _pageDownButton);
_currentlyUpdatingTableView.selectionType = TableViewSelectionType.None;
_currentlyUpdatingTableView.Init();
_currentlyUpdatingTableView.dataSource = this; // calls Init
_scroller = gobj.GetComponent<TableViewScroller>();
gobj.SetActive(true);
_currentlyUpdatingTableView.RefreshScrollButtons();
_checkForUpdates = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(ButtonXOffset, -30f), ButtonSize, CheckUpdates, "Check for updates");
_checkForUpdates.interactable = DownloadController.Instance.CanCheck || DownloadController.Instance.CanReset;
_checkForUpdates.ToggleWordWrapping(false);
_downloadUpdates = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(ButtonXOffset, -19f), ButtonSize, DownloadUpdates, "Download Updates");
_downloadUpdates.interactable = DownloadController.Instance.CanDownload;
_downloadUpdates.ToggleWordWrapping(false);
_restartGame = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(ButtonXOffset, -8f), ButtonSize, Restart, "Restart Game");
_restartGame.interactable = DownloadController.Instance.HadUpdates;
_restartGame.ToggleWordWrapping(false);
}
DownloadController.Instance.OnDownloaderListChanged += Refresh;
DownloadController.Instance.OnDownloadStateChanged += DownloaderStateChanged;
DownloaderStateChanged();
}
private void Restart()
{
Process.Start(Path.Combine(Environment.CurrentDirectory, Process.GetCurrentProcess().MainModule.FileName), Environment.CommandLine);
Application.Quit();
}
private void DownloadUpdates()
{
if (DownloadController.Instance.CanDownload)
DownloadController.Instance.StartDownloads();
}
private void CheckUpdates()
{
Updater.ResetRequestCache();
if (DownloadController.Instance.CanReset)
DownloadController.Instance.ResetCheck(false);
if (DownloadController.Instance.CanCheck)
DownloadController.Instance.CheckForUpdates();
}
private void DownloaderStateChanged()
{
_checkForUpdates.interactable = (DownloadController.Instance.CanCheck || DownloadController.Instance.CanReset) && !Updater.NeedsManualRestart;
_downloadUpdates.interactable = DownloadController.Instance.CanDownload && !Updater.NeedsManualRestart;
_restartGame.interactable = DownloadController.Instance.HadUpdates && !Updater.NeedsManualRestart;
_manualDownloadText.gameObject.SetActive(Updater.NeedsManualRestart);
}
protected override void DidDeactivate(DeactivationType type)
{
DownloadController.Instance.OnDownloaderListChanged -= Refresh;
DownloadController.Instance.OnDownloadStateChanged -= DownloaderStateChanged;
if (DownloadController.Instance.IsDone)
FloatingNotification.instance.Close();
}
private void Refresh()
{
_currentlyUpdatingTableView.ReloadData();
}
public float CellSize()
{
return 8.5f;
}
public int NumberOfCells()
{
return DownloadController.Instance.Downloads.Count;
}
public TableCell CellForIdx(TableView view, int row)
{
LevelListTableCell _tableCell = Instantiate(_songListTableCellInstance);
DownloadProgressCell _queueCell = _tableCell.gameObject.AddComponent<DownloadProgressCell>();
_queueCell.Init(DownloadController.Instance.Downloads[row]);
return _queueCell;
}
}
}