using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using REST_JSON_API; using static CommunicationEvents; public class RenderedScrollFact : FactObjectUI, IDropHandler { #region Serializable public TextMeshProUGUI LabelMesh; public GameObject HintButton; #endregion Serializable #region Properties public int ID { get => _ID; private set { _ID = value; SetLabel(null); } } private int _ID; public Scroll Scroll { get => _Scroll; set { _Scroll = value; SetLabel(null); } } private Scroll _Scroll; public bool IsSet => ScrollFactURI != URI; public string ScrollFactURI => Scroll.requiredFacts[ID].@ref.uri; public string ScrollFactLabel => LabelMesh.text; #endregion Properties protected override void FactUpdated() { _URI ??= ScrollFactURI; Destroy(_Payload); NewAssignmentEvent.Invoke(); if (VerboseURI) Debug.Log(nameof(RenderedScrollFact) + " recieved Fact: " + URI); } protected override void _DeleteFactEvent(Fact fact) => Fact = null; protected override void _OnEnable() { HintAvailableEvent.AddListener(OnHintAvailable); } protected override void _OnDisable() { HintAvailableEvent.RemoveListener(OnHintAvailable); } public void Populate(Scroll scroll, int Nr) { Scroll = scroll; ID = Nr; _URI = ScrollFactURI; } private void SetLabel(string label) { LabelMesh.text = label ?? Scroll?.requiredFacts[ID].label ?? "Err"; } public void OnClickHintButton() { ScrollFactHintEvent.Invoke(URI); } public void OnHintAvailable(List<string> uris) { HintButton.SetActive(uris.Contains(ScrollFactURI)); } #region DropHandling public FactObjectUI Payload => _Payload == null ? null : _Payload.GetComponent<FactObjectUI>(); private GameObject _Payload; public void OnDrop(PointerEventData eventData) { if (eventData.pointerDrag.TryGetComponent(out FactObjectUI factObject)) SetByFactObject(factObject); } public void SetByFactObject(FactObjectUI fOUI) { Fact = fOUI.Fact; if (VerboseURI) Debug.Log(Fact.GetLabel(StageStatic.stage.factState) + " was dropped on " + gameObject.name + " " + (ID + 1) + "/" + ScrollDetails.ParameterDisplays.Count + " label: " + ScrollFactLabel); _Payload = // has to be: ..., Vector3.zero, Quaternion.identity => SetParent Instantiate(fOUI.gameObject, Vector3.zero, Quaternion.identity); _Payload.transform.SetParent(gameObject.transform, worldPositionStays: false); _Payload.GetComponent<CanvasGroup>().blocksRaycasts = true; // Reverse drag effect } #endregion DropHandling }