ZoeAppClass/Assets/Scripts/Menu/MenuController.cs

795 lines
17 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.IO;
public class MenuController : MonoBehaviour
{
public static MenuController instance;
public static Sprite loadsprite;
#region Colors
[System.Serializable]
public class ColorGroup
{
public Color clara;
public Color escura;
public Color contrastColor;
}
public List<ColorGroup> colorsGroup;
public int indexColor;
public ColorGroup GetColor()
{
if (colorsGroup == null || colorsGroup.Count == 0)
{
Debug.LogError(
"A lista colorsGroup não foi configurada no MenuController."
);
return null;
}
if (indexColor < 0 || indexColor >= colorsGroup.Count)
{
indexColor = 0;
}
ColorGroup colorReturn = colorsGroup[indexColor];
indexColor++;
if (indexColor >= colorsGroup.Count)
{
indexColor = 0;
}
return colorReturn;
}
#endregion
private void Awake()
{
instance = this;
}
private Animator canvasAnime;
private bool canChange = true;
public int nbrsClasses;
public GameObject prefabClass;
private APIMenu apiMenu;
public List<APIMenu.Classes> classes =
new List<APIMenu.Classes>();
[SerializeField]
public List<GlobalClasses.ClassInfo> classInfos =
new List<GlobalClasses.ClassInfo>();
public List<string> allowedCourses =
new List<string>();
public List<string> coursesName =
new List<string>();
public List<int> allowedClasses =
new List<int>();
public Text nomeCurso;
private int actualCourse;
private GameObject scrollObj;
private Transform alligner;
private List<GameObject> classPrefabObjs =
new List<GameObject>();
public bool listedCourses = false;
private bool cancelLoad = false;
private Coroutine routineLoading = null;
private bool changingCourse = false;
private List<int> QuantidadeAulas =
new List<int>();
private void Start()
{
loadsprite = Resources.Load<Sprite>("Load");
GameObject txtClassObject =
GameObject.Find("txtClass");
if (txtClassObject != null)
{
nomeCurso =
txtClassObject.GetComponent<Text>();
}
else
{
Debug.LogError(
"GameObject 'txtClass' não encontrado."
);
}
GameObject controlAnimeObject =
GameObject.Find("ControlAnime");
if (controlAnimeObject != null)
{
canvasAnime =
controlAnimeObject.GetComponent<Animator>();
}
else
{
Debug.LogError(
"GameObject 'ControlAnime' não encontrado."
);
}
apiMenu = GetComponent<APIMenu>();
if (apiMenu == null)
{
Debug.LogError(
"O componente APIMenu não foi encontrado em " +
gameObject.name
);
}
GameObject contentAulasObject =
GameObject.Find("Content Aulas");
if (contentAulasObject != null)
{
alligner =
contentAulasObject.transform;
}
else
{
Debug.LogError(
"GameObject 'Content Aulas' não encontrado."
);
}
StartCoroutine(CheckNDeleteFiles());
StartCoroutine(secondStart());
}
private IEnumerator CheckNDeleteFiles()
{
string[] files;
try
{
files =
Directory.GetFiles(
Application.persistentDataPath
);
}
catch (System.Exception exception)
{
Debug.LogError(
"Erro ao listar arquivos em persistentDataPath: " +
exception.Message
);
yield break;
}
foreach (string file in files)
{
try
{
File.Delete(file);
}
catch (System.Exception exception)
{
Debug.LogWarning(
"Não foi possível apagar o arquivo '" +
file +
"': " +
exception.Message
);
}
yield return new WaitForEndOfFrame();
}
}
private IEnumerator secondStart()
{
GameObject objleft =
GameObject.Find("Left");
GameObject objRight =
GameObject.Find("Right");
if (objleft != null)
{
objleft.SetActive(false);
}
if (objRight != null)
{
objRight.SetActive(false);
}
yield return new WaitForEndOfFrame();
while (
ReadingFile.instance == null ||
!ReadingFile.instance.canGo
)
{
yield return new WaitForEndOfFrame();
}
if (apiMenu == null)
{
Debug.LogError(
"APIMenu está nulo. Não é possível carregar as aulas."
);
yield break;
}
yield return StartCoroutine(
apiMenu.LogarAluno()
);
yield return StartCoroutine(
apiMenu.listCourses(
ReadingFile.idmatricula,
ReadingFile.banco
)
);
while (!listedCourses)
{
yield return new WaitForFixedUpdate();
}
for (
int i = 0;
i < allowedCourses.Count;
i++
)
{
if (
allowedCourses[i] == "41" ||
allowedCourses[i] == "42"
)
{
Debug.Log(
"ID Curso: " +
allowedCourses[i]
);
yield return StartCoroutine(
apiMenu.listClasses(
allowedCourses[i],
"99"
)
);
}
else
{
if (i >= allowedClasses.Count)
{
Debug.LogError(
"Não existe allowedClasses para o índice " +
i
);
continue;
}
yield return StartCoroutine(
apiMenu.listClasses(
allowedCourses[i],
allowedClasses[i].ToString()
)
);
}
apiMenu.FinishedLoading();
}
classInfos.Clear();
QuantidadeAulas.Clear();
for (
int courseIndex = 0;
courseIndex < allowedCourses.Count;
courseIndex++
)
{
GlobalClasses.ClassInfo courseClass =
new GlobalClasses.ClassInfo();
courseClass.idCurso =
allowedCourses[courseIndex];
courseClass.nomeCurso =
courseIndex < coursesName.Count
? coursesName[courseIndex]
: string.Empty;
courseClass.infos =
new List<GlobalClasses.ClassDetailedInfo>();
int totalClasses = 0;
if (
classes != null &&
courseIndex < classes.Count &&
classes[courseIndex] != null &&
classes[courseIndex].response != null
)
{
totalClasses =
classes[courseIndex].response.Count;
}
for (
int classIndex = 0;
classIndex < totalClasses;
classIndex++
)
{
var response =
classes[courseIndex]
.response[classIndex];
if (
courseClass.idCurso !=
response.idcourses.ToString()
)
{
continue;
}
GlobalClasses.ClassDetailedInfo info =
new GlobalClasses.ClassDetailedInfo();
info.description =
response.description;
info.disabled =
response.disabled;
info.idclasses =
response.idclasses;
info.idcourses =
response.idcourses;
info.name =
response.name;
info.ordem =
response.ordem;
info.viewed =
response.viewed;
info.sprites =
response.sprites;
info.demo =
response.demo;
courseClass.infos.Add(info);
}
classInfos.Add(courseClass);
QuantidadeAulas.Add(
courseClass.infos.Count
);
yield return new WaitForEndOfFrame();
}
classes = null;
if (classInfos.Count > 0)
{
Debug.Log(
classInfos[
classInfos.Count - 1
].idCurso
);
}
yield return new WaitForEndOfFrame();
if (allowedCourses.Count == 0)
{
if (nomeCurso != null)
{
nomeCurso.text =
"No courses available!";
}
foreach (
GameObject item in classPrefabObjs
)
{
if (item != null)
{
Destroy(item);
}
}
classPrefabObjs.Clear();
}
else
{
if (
classInfos.Count == 0 ||
QuantidadeAulas.Count == 0
)
{
Debug.LogError(
"Nenhuma informação de curso foi carregada."
);
yield break;
}
StartCoroutine(
PreencherCursos(0)
);
if (nomeCurso != null)
{
nomeCurso.text =
classInfos[0].nomeCurso;
}
actualCourse = 0;
coursesName = null;
scrollObj =
GameObject.Find("Scroll");
}
yield return new WaitForEndOfFrame();
if (allowedCourses.Count > 1)
{
if (objleft != null)
{
objleft.SetActive(true);
}
if (objRight != null)
{
objRight.SetActive(true);
}
}
yield return new WaitForEndOfFrame();
if (canvasAnime != null)
{
canvasAnime.SetBool(
"start",
true
);
}
if (
classInfos.Count > 0 &&
classInfos[0].infos != null
)
{
Debug.Log(
classInfos[0].infos.Count
);
}
}
private IEnumerator waitToClickAgain()
{
canChange = false;
yield return new WaitForSecondsRealtime(
0.1f
);
canChange = true;
}
public void EnterClass(
GlobalClasses.ClassDetailedInfo ClassTogo)
{
if (ClassTogo == null)
{
Debug.LogError(
"ClassTogo está nulo."
);
return;
}
PlayerPrefs.SetString(
"NomeAula",
ClassTogo.name
);
PlayerPrefs.SetString(
"Desc",
ClassTogo.description
);
PlayerPrefs.SetInt(
"idClass",
ClassTogo.idclasses
);
SceneManager.LoadSceneAsync(
1,
LoadSceneMode.Single
);
}
private IEnumerator ExcludeExistingVideos(
int idClass)
{
string path =
Application.persistentDataPath + "/";
DirectoryInfo directory =
new DirectoryInfo(path);
if (directory.Exists)
{
FileInfo[] files =
directory.GetFiles("*.*");
foreach (FileInfo file in files)
{
try
{
File.Delete(file.FullName);
}
catch (System.Exception exception)
{
Debug.LogWarning(
"Não foi possível apagar '" +
file.FullName +
"': " +
exception.Message
);
}
}
}
yield return new WaitForEndOfFrame();
PlayerPrefs.SetInt(
"idClass",
idClass
);
SceneManager.LoadSceneAsync(
1,
LoadSceneMode.Single
);
}
public void Scroll()
{
if (!canChange || canvasAnime == null)
{
return;
}
bool active =
canvasAnime.GetBool(
"downScroll"
);
canvasAnime.SetBool(
"downScroll",
!active
);
StartCoroutine(
waitToClickAgain()
);
}
public void ChangeCourse(int add)
{
StartCoroutine(
changeCourse(add)
);
}
private IEnumerator changeCourse(
int add)
{
if (changingCourse)
{
yield break;
}
if (
classInfos == null ||
classInfos.Count == 0
)
{
yield break;
}
changingCourse = true;
int newcourse =
actualCourse + add;
if (
newcourse <=
classInfos.Count - 1 &&
newcourse >= 0
)
{
if (nomeCurso != null)
{
nomeCurso.text =
classInfos[newcourse].nomeCurso;
}
}
else
{
if (newcourse < 0)
{
newcourse =
classInfos.Count - 1;
}
else
{
newcourse = 0;
}
if (nomeCurso != null)
{
nomeCurso.text =
classInfos[newcourse].nomeCurso;
}
}
yield return new WaitForEndOfFrame();
foreach (
GameObject item in classPrefabObjs
)
{
if (item != null)
{
Destroy(item);
}
}
classPrefabObjs.Clear();
if (routineLoading != null)
{
StopCoroutine(routineLoading);
routineLoading = null;
}
routineLoading =
StartCoroutine(
PreencherCursos(newcourse)
);
yield return routineLoading;
yield return new WaitForEndOfFrame();
actualCourse = newcourse;
changingCourse = false;
}
public IEnumerator PreencherCursos(
int courseIndex)
{
if (
classInfos == null ||
QuantidadeAulas == null ||
courseIndex < 0 ||
courseIndex >= classInfos.Count ||
courseIndex >= QuantidadeAulas.Count
)
{
Debug.LogError(
"Índice de curso inválido: " +
courseIndex
);
routineLoading = null;
yield break;
}
if (prefabClass == null)
{
Debug.LogError(
"prefabClass não foi configurado."
);
routineLoading = null;
yield break;
}
if (alligner == null)
{
Debug.LogError(
"alligner está nulo."
);
routineLoading = null;
yield break;
}
int quantity =
QuantidadeAulas[courseIndex] < 20
? 20
: QuantidadeAulas[courseIndex];
for (
int i = 0;
i < quantity;
i++
)
{
GameObject createdObject =
Instantiate(
prefabClass,
alligner
);
classPrefabObjs.Add(
createdObject
);
ClassControl classControl =
createdObject
.GetComponent<ClassControl>();
if (classControl != null)
{
classControl.SetInformation(
classInfos[courseIndex],
i
);
}
else
{
Debug.LogError(
"O prefab de aula não possui ClassControl.",
createdObject
);
}
}
routineLoading = null;
yield return new WaitForEndOfFrame();
}
public void ExitApplication()
{
Debug.Log("Sair");
Application.Quit();
}
}