181 lines
5.7 KiB
C#
181 lines
5.7 KiB
C#
|
using Assets.Scripts;
|
|||
|
using Newtonsoft.Json;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.SceneManagement;
|
|||
|
using UnityEngine.UIElements;
|
|||
|
using XCharts.Runtime;
|
|||
|
|
|||
|
public class StatsMenuController : SingletonMB<StatsMenuController>
|
|||
|
{
|
|||
|
#region PROPERTIES
|
|||
|
|
|||
|
public List<SessionData> Sessions { get; private set; }
|
|||
|
public Canvas Canvas { get { return _canvas; } private set { _canvas = value; } }
|
|||
|
[SerializeField] private Canvas _canvas;
|
|||
|
|
|||
|
#endregion
|
|||
|
#region VARIABLES
|
|||
|
|
|||
|
[SerializeField] private GameObject graphPanelTemplate;
|
|||
|
private UIDocument _document;
|
|||
|
private Button _exitButton;
|
|||
|
private Button _storageButton;
|
|||
|
private List<LineChart> lineCharts;
|
|||
|
|
|||
|
#endregion
|
|||
|
#region EVENTS
|
|||
|
|
|||
|
private void OnExitButton(ClickEvent e)
|
|||
|
{
|
|||
|
SceneManager.LoadScene("MainMenu");
|
|||
|
}
|
|||
|
private void OnStorageButton(ClickEvent e)
|
|||
|
{
|
|||
|
string path = Path.Combine(Application.persistentDataPath, "SessionsData");
|
|||
|
#if UNITY_EDITOR
|
|||
|
UnityEditor.EditorUtility.RevealInFinder(path);
|
|||
|
#elif UNITY_STANDALONE_WIN
|
|||
|
path = path.Replace("/", "\\"); // Remplacer les / par \ pour Windows
|
|||
|
Process.Start("explorer.exe", path);
|
|||
|
#elif UNITY_STANDALONE_OSX
|
|||
|
Process.Start("open", path);
|
|||
|
#elif UNITY_STANDALONE_LINUX
|
|||
|
Process.Start("xdg-open", path);
|
|||
|
#else
|
|||
|
Debug.LogWarning("Opening the file explorer is not supported on this platform.");
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
#region ENDPOINTS
|
|||
|
|
|||
|
public void OnSessionSelected(SessionData session)
|
|||
|
{
|
|||
|
if (lineCharts != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < lineCharts.Count; i++)
|
|||
|
{
|
|||
|
Destroy(lineCharts[i]);
|
|||
|
}
|
|||
|
lineCharts.Clear();
|
|||
|
}
|
|||
|
|
|||
|
UnityEngine.Debug.Log("Session Chart " + session.SessionNumber);
|
|||
|
|
|||
|
int n = 0;
|
|||
|
foreach (var attempt in session.Attempts)
|
|||
|
{
|
|||
|
n++;
|
|||
|
if (n > 4) break;
|
|||
|
|
|||
|
var instance = Instantiate(graphPanelTemplate, Canvas.transform).GetComponent<GraphPanelScript>().LineChart;
|
|||
|
instance.RemoveAllSerie();
|
|||
|
|
|||
|
lineCharts.Add(instance);
|
|||
|
|
|||
|
|
|||
|
var position = new Vector3(480, -184, -1);
|
|||
|
var nextColumnPosition = new Vector3(instance.chartWidth + 2, 0, 0);
|
|||
|
var nextLinePosition = new Vector3(0, -instance.chartHeight - 2, 0);
|
|||
|
switch (lineCharts.IndexOf(instance))
|
|||
|
{
|
|||
|
case 0:
|
|||
|
instance.GetComponent<RectTransform>().anchoredPosition = position;
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
instance.GetComponent<RectTransform>().anchoredPosition = position + nextColumnPosition;
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
instance.GetComponent<RectTransform>().anchoredPosition = position + nextLinePosition;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
instance.GetComponent<RectTransform>().anchoredPosition = position + nextLinePosition + nextColumnPosition;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// Definir nom de la chart
|
|||
|
var chartName = instance.EnsureChartComponent<Title>();
|
|||
|
chartName.text = $"Scores dans le temps | round {attempt.AttemptNumber}";
|
|||
|
|
|||
|
|
|||
|
// D<>finir les noms des axes
|
|||
|
var xAxis = instance.EnsureChartComponent<XAxis>();
|
|||
|
xAxis.type = Axis.AxisType.Value;
|
|||
|
AxisName xName = new();
|
|||
|
xName.name = "Temps (ticks)";
|
|||
|
xAxis.axisName = xName;
|
|||
|
|
|||
|
var yAxis = instance.EnsureChartComponent<YAxis>();
|
|||
|
yAxis.type = Axis.AxisType.Value;
|
|||
|
AxisName yName = new();
|
|||
|
yName.name = "Score";
|
|||
|
yAxis.axisName = yName;
|
|||
|
|
|||
|
// Ajouter une l<>gende
|
|||
|
var legend = instance.EnsureChartComponent<Legend>();
|
|||
|
legend.show = true;
|
|||
|
|
|||
|
foreach (var playerAttempt in attempt.PlayersAttempts)
|
|||
|
{
|
|||
|
var scoreOverTime = playerAttempt.Value.PlayerScoresOverTicksTime;
|
|||
|
|
|||
|
// Ajouter une nouvelle s<>rie avec une l<>gende
|
|||
|
var serie = instance.AddSerie<Line>(playerAttempt.Value.PlayerName);
|
|||
|
serie.serieName = playerAttempt.Value.PlayerName;
|
|||
|
//serie.legendName = playerAttempt.Value.PlayerName;
|
|||
|
scoreOverTime.ForEach(score =>
|
|||
|
{
|
|||
|
serie.AddXYData(score.X, score.Y);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endregion
|
|||
|
#region METHODS
|
|||
|
|
|||
|
private List<SessionData> LoadSessionData()
|
|||
|
{
|
|||
|
string directoryPath = Path.Combine(Application.persistentDataPath, "SessionsData");
|
|||
|
var sessionDataList = new List<SessionData>();
|
|||
|
|
|||
|
var files = Directory.GetFiles(directoryPath, "*.json");
|
|||
|
foreach (var file in files)
|
|||
|
{
|
|||
|
var json = File.ReadAllText(file);
|
|||
|
var sessionData = JsonConvert.DeserializeObject<SessionData>(json);
|
|||
|
sessionDataList.Add(sessionData);
|
|||
|
}
|
|||
|
|
|||
|
return sessionDataList.OrderBy<SessionData, int>(s => s.SessionNumber).ToList();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
#region LIFECYCLE
|
|||
|
|
|||
|
protected override void Awake()
|
|||
|
{
|
|||
|
base.Awake();
|
|||
|
Sessions = LoadSessionData();
|
|||
|
|
|||
|
_document = GetComponent<UIDocument>();
|
|||
|
_exitButton = _document.rootVisualElement.Q("ExitButton") as Button;
|
|||
|
_exitButton.RegisterCallback<ClickEvent>(OnExitButton);
|
|||
|
_storageButton = _document.rootVisualElement.Q("StorageButton") as Button;
|
|||
|
_storageButton.RegisterCallback<ClickEvent>(OnStorageButton);
|
|||
|
|
|||
|
lineCharts = new();
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|