Skip to content
Snippets Groups Projects
RenderedScrollFact.cs 4.23 KiB
Newer Older
using REST_JSON_API;
MaZiFAU's avatar
MaZiFAU committed
using System.Collections.Generic;
Richard Marcus's avatar
Richard Marcus committed
using UnityEngine;
MaZiFAU's avatar
MaZiFAU committed
using UnityEngine.EventSystems;
using static CommunicationEvents;
Richard Marcus's avatar
Richard Marcus committed

[RequireComponent(typeof(TMP_InputField))]
MaZiFAU's avatar
MaZiFAU committed
public class RenderedScrollFact : FactObjectUI, IDropHandler
Richard Marcus's avatar
Richard Marcus committed
{
MaZiFAU's avatar
MaZiFAU committed
    #region Serializable
Richard Marcus's avatar
Richard Marcus committed
    public TextMeshProUGUI LabelMesh;
    public GameObject HintButton;
MaZiFAU's avatar
MaZiFAU committed
    #endregion Serializable

    #region Properties
        => Scroll.requiredFacts.FindIndex(f => f.@ref.uri == ScrollFactURI);
MaZiFAU's avatar
MaZiFAU committed
    public Scroll Scroll
Richard Marcus's avatar
Richard Marcus committed
    {
MaZiFAU's avatar
MaZiFAU committed
        get => _Scroll;
Richard Marcus's avatar
Richard Marcus committed
        set
        {
MaZiFAU's avatar
MaZiFAU committed
            _Scroll = value;
            SetLabel(null);
            ResetPayload();
Richard Marcus's avatar
Richard Marcus committed
        }
    }
MaZiFAU's avatar
MaZiFAU committed
    private Scroll _Scroll;

MaZiFAU's avatar
MaZiFAU committed
    public bool IsSet
        => ScrollFactURI != URI;

MaZiFAU's avatar
MaZiFAU committed
    public string ScrollFactURI
    {
        get => _ScrollFactURI;
        set
        {
            _ScrollFactURI = value;
            SetLabel(null);
        }
    }
    private string _ScrollFactURI;
MaZiFAU's avatar
MaZiFAU committed

    public string ScrollFactLabel
        => LabelMesh.text;

    private TMP_InputField _InputField;

    public string RequiredType
        => Scroll.requiredFacts[ID].getType();
MaZiFAU's avatar
MaZiFAU committed
    #endregion Properties

    protected override void _Awake()
MaZiFAU's avatar
MaZiFAU committed
    {
        _InputField = gameObject.GetComponent<TMP_InputField>();
        _InputField.textComponent.gameObject.SetActive(true);
    }
    protected override void FactUpdated()
    {
        _URI ??= ScrollFactURI;
        if (VerboseURI)
            Debug.Log(nameof(RenderedScrollFact) + " recieved Fact: " + URI);
        NewAssignmentEvent.Invoke();
        ResetPayload();
        base.FactUpdated();
MaZiFAU's avatar
MaZiFAU committed
    }

    private void ResetPayload()
    {
        Destroy(_Payload);

        _InputField.enabled = _InputField.textComponent.enabled =
              !IsSet
            && (RequiredType == MMTConstants.RealLit
             || string.IsNullOrEmpty(RequiredType));

        _InputField.SetTextWithoutNotify("R");

        if (DisplayFacts.displayedFacts.TryGetValue(URI, out GameObject fact_display))
        {
            _Payload = // has to be: ..., Vector3.zero, Quaternion.identity => SetParent
                Instantiate(fact_display, Vector3.zero, Quaternion.identity);

            _Payload.transform.SetParent(gameObject.transform, worldPositionStays: false);
            _Payload.GetComponent<CanvasGroup>().blocksRaycasts = true; // Reverse drag effect, if any
        }
    }

    protected override void _DeleteFactEvent(Fact fact)
        => Fact = null; // calls NewAssignmentEvent.Invoke();

    protected override void _OnEnable()
    {
        HintAvailableEvent.AddListener(OnHintAvailable);
    protected override void _OnDisable()
MaZiFAU's avatar
MaZiFAU committed
    {
        HintAvailableEvent.RemoveListener(OnHintAvailable);
    }

    public void Populate(Scroll scroll, string scroll_fact_uri)
        _Scroll = scroll;
        _ScrollFactURI = scroll_fact_uri;
MaZiFAU's avatar
MaZiFAU committed
        _URI = ScrollFactURI;
    }

    private void SetLabel(string label)
    {
        LabelMesh.text = label ?? Scroll?.requiredFacts[ID].label ?? "Err";
    }

MaZiFAU's avatar
MaZiFAU committed
        ScrollFactHintEvent.Invoke(URI);
    public void OnHintAvailable(List<string> uris)
    {
MaZiFAU's avatar
MaZiFAU committed
        HintButton.SetActive(uris.Contains(ScrollFactURI));
MaZiFAU's avatar
MaZiFAU committed

    public void OnTextChange()
    {
        if (!float.TryParse(_InputField.text, out float input))
            return;

        Fact = FactAdder.AddFactIfNotFound(new RealLitFact(input), out _, false, null, "Manual User Input");
    }

MaZiFAU's avatar
MaZiFAU committed
    #region DropHandling 
MaZiFAU's avatar
MaZiFAU committed
    public FactObjectUI Payload
MaZiFAU's avatar
MaZiFAU committed
        => _Payload == null ? null : _Payload.GetComponent<FactObjectUI>();

    private GameObject _Payload;
MaZiFAU's avatar
MaZiFAU committed

    public void OnDrop(PointerEventData eventData)
    {
MaZiFAU's avatar
MaZiFAU committed
        if (eventData.pointerDrag.TryGetComponent(out FactObjectUI factObject))
            SetByFactObject(factObject);
    }

    public void SetByFactObject(FactObjectUI fOUI)
    {
        Fact = fOUI.Fact;
MaZiFAU's avatar
MaZiFAU committed

        if (VerboseURI)
            Debug.Log(Fact.GetLabel(StageStatic.stage.factState) + " was dropped on "
MaZiFAU's avatar
MaZiFAU committed
                + gameObject.name + " " + (ID + 1) + "/" +
                ScrollDetails.ParameterDisplays.Count + " label: " + ScrollFactLabel);
    }
    #endregion DropHandling 
Richard Marcus's avatar
Richard Marcus committed
}