Skip to content
This repository has been archived by the owner on Jan 24, 2023. It is now read-only.

Commit

Permalink
Added "Recently Used Avatars" list.
Browse files Browse the repository at this point in the history
  • Loading branch information
RequiDev committed Aug 14, 2021
1 parent 30db5af commit b84f1db
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 65 deletions.
49 changes: 12 additions & 37 deletions ReModCE/Components/AvatarFavoritesComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ internal class AvatarFavoritesComponent : ModComponent, IAvatarListOwner
private ReAvatarList _avatarList;
private ReUiButton _favoriteButton;

private readonly AvatarList _allAvatars =
new AvatarList();

private readonly List<ReAvatar> _savedAvatars;

public AvatarFavoritesComponent()
Expand All @@ -40,10 +37,6 @@ public AvatarFavoritesComponent()
public override void OnUiManagerInit(UiManager uiManager)
{
_avatarList = new ReAvatarList("ReModCE Favorites", this);
foreach (var avi in _savedAvatars.Distinct().Select(x => x.AsApiAvatar()).ToList())
{
_allAvatars.Add(avi);
}

_avatarList.AvatarPedestal.field_Internal_Action_3_String_GameObject_AvatarPerformanceStats_0 = new Action<string, GameObject, AvatarPerformanceStats>(OnAvatarInstantiated);

Expand All @@ -55,6 +48,7 @@ public override void OnUiManagerInit(UiManager uiManager)
_favoriteButton.Position += new Vector3(UiManager.ButtonSize, 0f);
}
}

private void OnAvatarInstantiated(string url, GameObject avatar, AvatarPerformanceStats avatarPerformanceStats)
{
_favoriteButton.Text = HasAvatarFavorited(_avatarList.AvatarPedestal.field_Internal_ApiAvatar_0.id) ? "Unfavorite" : "Favorite";
Expand All @@ -65,48 +59,24 @@ private void FavoriteAvatar(ApiAvatar apiAvatar)
var hasFavorited = HasAvatarFavorited(apiAvatar.id);
if (!hasFavorited)
{
_allAvatars.Insert(0, apiAvatar);
_savedAvatars.Insert(0, new ReAvatar(apiAvatar));
_favoriteButton.Text = "Unfavorite";
OnFavoriteAvatar(apiAvatar);
}
else
{
_allAvatars.Remove(apiAvatar);
_savedAvatars.RemoveAll(a => a.Id == apiAvatar.id);
_favoriteButton.Text = "Favorite";
OnUnfavoriteAvatar(apiAvatar);
}
SaveAvatarsToDisk();

_avatarList.Refresh(GetAvatars());
}

private bool HasAvatarFavorited(string id)
{
foreach (var avi in _allAvatars)
{
if (avi.id == _avatarList.AvatarPedestal.field_Internal_ApiAvatar_0.id)
{
return true;
}
}

return false;
return _savedAvatars.FirstOrDefault(a => a.Id == id) != null;
}

public void OnFavoriteAvatar(ApiAvatar avatar)
{
if (_savedAvatars.FirstOrDefault(a => a.Id == avatar.id) == null)
{
_savedAvatars.Insert(0, new ReAvatar(avatar));
}
SaveAvatarsToDisk();
}

public void OnUnfavoriteAvatar(ApiAvatar avatar)
{
_savedAvatars.RemoveAll(a => a.Id == avatar.id);
SaveAvatarsToDisk();
}


private void SaveAvatarsToDisk()
{
Directory.CreateDirectory("UserData/ReModCE");
Expand All @@ -115,7 +85,12 @@ private void SaveAvatarsToDisk()

public AvatarList GetAvatars()
{
return _allAvatars;
var list = new AvatarList();
foreach (var avi in _savedAvatars.Distinct().Select(x => x.AsApiAvatar()).ToList())
{
list.Add(avi);
}
return list;
}
}
}
68 changes: 67 additions & 1 deletion ReModCE/Components/RecentAvatarsComponent.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,79 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using ReModCE.Core;
using ReModCE.Managers;
using ReModCE.UI;
using UnityEngine;
using UnityEngine.UI;
using VRC.Core;
using VRC.SDKBase.Validation.Performance.Stats;
using AvatarList = Il2CppSystem.Collections.Generic.List<VRC.Core.ApiAvatar>;

namespace ReModCE.Components
{
internal class RecentAvatarsComponent : ModComponent
internal class RecentAvatarsComponent : ModComponent, IAvatarListOwner
{
private ReAvatarList _avatarList;
private readonly List<ReAvatar> _recentAvatars;

public RecentAvatarsComponent()
{
if (File.Exists("UserData/ReModCE/recent_avatars.json"))
{
_recentAvatars = JsonConvert.DeserializeObject<List<ReAvatar>>(File.ReadAllText("UserData/ReModCE/recent_avatars.json"));
}
else
{
_recentAvatars = new List<ReAvatar>();
}
}
public override void OnUiManagerInit(UiManager uiManager)
{
_avatarList = new ReAvatarList("Recently Used", this, false);

var changeButton = GameObject.Find("UserInterface/MenuContent/Screens/Avatar/Change Button");
changeButton.GetComponent<Button>().onClick.AddListener(new Action(OnChangeAvatar));
}

private void OnChangeAvatar()
{
var apiAvatar = _avatarList.AvatarPedestal.field_Internal_ApiAvatar_0;
if (_recentAvatars.FirstOrDefault(a => a.Id == apiAvatar.id) != null)
{
_recentAvatars.RemoveAll(a => a.Id == apiAvatar.id);
}

_recentAvatars.Insert(0, new ReAvatar(apiAvatar));

if (_recentAvatars.Count > 100)
{
_recentAvatars.Remove(_recentAvatars.Last());
}

SaveAvatarsToDisk();

_avatarList.Refresh(GetAvatars());
}

private void SaveAvatarsToDisk()
{
Directory.CreateDirectory("UserData/ReModCE");
File.WriteAllText("UserData/ReModCE/recent_avatars.json", JsonConvert.SerializeObject(_recentAvatars));
}

public AvatarList GetAvatars()
{
var list = new AvatarList();
foreach (var avi in _recentAvatars.Distinct().Select(x => x.AsApiAvatar()).ToList())
{
list.Add(avi);
}
return list;
}
}
}
73 changes: 46 additions & 27 deletions ReModCE/UI/ReAvatarList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ private static GameObject LegacyAvatarList
}

private readonly UiAvatarList _avatarList;

private readonly bool _hasPagination;
private readonly ReUiButton _refreshButton;
private readonly ReUiButton _nextPageButton;
private readonly ReUiButton _prevPageButton;
Expand All @@ -60,62 +62,79 @@ public string Title
private readonly string _title;

private readonly IAvatarListOwner _owner;
public ReAvatarList(string title, IAvatarListOwner owner) : base(
public ReAvatarList(string title, IAvatarListOwner owner, bool addPagination = true) : base(
LegacyAvatarList,
LegacyAvatarList.transform.parent,
$"{title}AvatarList")
{
_hasPagination = addPagination;
_owner = owner;
_title = title;

_avatarList = GameObject.GetComponent<UiAvatarList>();
_avatarList.clearUnseenListOnCollapse = false;
_avatarList.field_Public_EnumNPublicSealedvaInPuMiFaSpClPuLiCrUnique_0 =
Category.SpecificList;
GameObject.transform.SetSiblingIndex(0);

var enableDisableListener = GameObject.AddComponent<EnableDisableListener>();
enableDisableListener.OnEnableEvent += () => Refresh(_owner.GetAvatars());
enableDisableListener.OnEnableEvent += RefreshAvatars;

var expandButton = GameObject.GetComponentInChildren<Button>(true);
_textComponent = expandButton.GetComponentInChildren<Text>();
Title = title;

_refreshButton = new ReUiButton("↻", new Vector3(980f, 0f),
new Vector2(0.25f, 1), () => Refresh(_owner.GetAvatars()), expandButton.transform);

_nextPageButton = new ReUiButton("→", new Vector2(900f, 0f), new Vector2(0.25f, 1f), () =>
if (_hasPagination)
{
_currentPage += 1;
Refresh(_owner.GetAvatars());
}, expandButton.transform);
_refreshButton = new ReUiButton("↻", new Vector3(980f, 0f), new Vector2(0.25f, 1), RefreshAvatars, expandButton.transform);

_prevPageButton = new ReUiButton("", new Vector2(750f, 0f), new Vector2(0.25f, 1f), () =>
{
_currentPage -= 1;
Refresh(_owner.GetAvatars());
}, expandButton.transform);
_nextPageButton = new ReUiButton("", new Vector2(900f, 0f), new Vector2(0.25f, 1f), () =>
{
_currentPage += 1;
Refresh(_owner.GetAvatars());
}, expandButton.transform);

_pageCount = new ReUiText("0 / 0", new Vector2(825f, 0f), new Vector2(0.25f, 1f), expandButton.transform);
_prevPageButton = new ReUiButton("←", new Vector2(750f, 0f), new Vector2(0.25f, 1f), () =>
{
_currentPage -= 1;
Refresh(_owner.GetAvatars());
}, expandButton.transform);

_pageCount = new ReUiText("0 / 0", new Vector2(825f, 0f), new Vector2(0.25f, 1f), expandButton.transform);
}
}

public void Refresh(AvatarList avatars)
private void RefreshAvatars()
{
var pagesCount = avatars.Count / MaxAvatarsPerPage;
_currentPage = Mathf.Clamp(_currentPage, 0, pagesCount);
Refresh(_owner.GetAvatars());
}

_pageCount.Text = $"{_currentPage + 1} / {pagesCount + 1}";
var cutDown = avatars.GetRange(_currentPage * MaxAvatarsPerPage, Math.Abs(_currentPage * MaxAvatarsPerPage - avatars.Count));
if (cutDown.Count > MaxAvatarsPerPage)
public void Refresh(AvatarList avatars)
{
if (_hasPagination)
{
cutDown.RemoveRange(MaxAvatarsPerPage, cutDown.Count - MaxAvatarsPerPage);
}
var pagesCount = avatars.Count / MaxAvatarsPerPage;
_currentPage = Mathf.Clamp(_currentPage, 0, pagesCount);

_prevPageButton.Interactable = _currentPage > 0;
_nextPageButton.Interactable = _currentPage < avatars.Count / MaxAvatarsPerPage;
_pageCount.Text = $"{_currentPage + 1} / {pagesCount + 1}";
var cutDown = avatars.GetRange(_currentPage * MaxAvatarsPerPage,
Math.Abs(_currentPage * MaxAvatarsPerPage - avatars.Count));
if (cutDown.Count > MaxAvatarsPerPage)
{
cutDown.RemoveRange(MaxAvatarsPerPage, cutDown.Count - MaxAvatarsPerPage);
}

Title = $"{_title} ({cutDown.Count}/{avatars.Count})";
_prevPageButton.Interactable = _currentPage > 0;
_nextPageButton.Interactable = _currentPage < avatars.Count / MaxAvatarsPerPage;

_avatarList.StartRenderElementsCoroutine(cutDown);
Title = $"{_title} ({cutDown.Count}/{avatars.Count})";

_avatarList.StartRenderElementsCoroutine(cutDown);
}
else
{
_avatarList.StartRenderElementsCoroutine(avatars);
}
}
}
}

0 comments on commit b84f1db

Please sign in to comment.