using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using static CommunicationEvents; public class RenderedScrollFact : FactObjectUI, IDropHandler, IPointerClickHandler { #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 string ScrollFactURI => Scroll.requiredFacts[ID].@ref.uri; public string ScrollFactLabel => LabelMesh.text; #endregion Properties protected override void FactUpdated() { Destroy(RenderedFactObject); NewAssignmentEvent.Invoke(); _URI ??= ScrollFactURI; 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 private GameObject RenderedFactObject; public void OnDrop(PointerEventData eventData) { Fact = eventData.pointerDrag.GetComponent<FactObject>().Fact; if (VerboseURI) Debug.Log(Fact.Label + " was dropped on " + gameObject.name + " " + (ID + 1) + "/" + ScrollDetails.ParameterDisplays.Count + " label: " + ScrollFactLabel); RenderedFactObject = // has to be: ..., Vector3.zero, Quaternion.identity => SetParent Instantiate(eventData.pointerDrag, Vector3.zero, Quaternion.identity); RenderedFactObject.transform.SetParent(gameObject.transform, worldPositionStays: false); } public void OnPointerClick(PointerEventData eventData) => _DeleteFactEvent(null); #endregion DropHandling }