private void RefreshUI()
    {
        nothingSelectedPrompt.gameObject.SetActive(false);
        multipleSelectedPrompt.gameObject.SetActive(false);
        clonePrompt.SetActive(false);
        lockedContentChecker.Close();

        if (!isOpen)
        {
            return;
        }

        if (currActor == null)
        {
            NullActorRefresh();
        }
        else if (currActor?.GetCloneParent() != null && currActor.GetCloneParent() != "")
        {
            clonePrompt.SetActive(true);
            VoosActor cloneParent = voosEngine.GetActor(currActor.GetCloneParent());
            cloneMessage.text = $"This is a copy of {cloneParent.GetDisplayName()}";
        }
        else
        {
            lockedContentChecker.Open(currActor, () =>
            {
                showCallback(currActor);
            }, () =>
            {
                hideCallback(false);
            });
        }
    }
    private void BreakLink(bool withUndo = true)
    {
        VoosActor actor = currActor;

        // Save for undo
        string prevParent = actor.GetCloneParent();

        SetActorInternal(null);
        actor.SetCloneParent(null);
        actor.MakeOwnCopyOfBrain();

        if (withUndo)
        {
            // Setup undo item
            string actorName = actor.GetName();
            string newBrain  = actor.GetBrainName();
            undo.Push(new UndoStack.Item
            {
                actionLabel         = $"Break copy-link of {actor.GetDisplayName()}",
                getUnableToDoReason = () => ActorUndoUtil.GetUnableToEditActorReason(voosEngine, actorName),
                doIt = () =>
                {
                    var redoActor = voosEngine.GetActor(actorName);
                    redoActor.SetCloneParent(null);
                    // A bit sloppy: We're relying on the fact that brains are never deleted
                    // (except on load).
                    redoActor.SetBrainName(newBrain);
                    OnBreakLinkChanged(redoActor);
                },
                getUnableToUndoReason = () =>
                {
                    var prevParentActor = voosEngine.GetActor(prevParent);
                    if (prevParentActor == null)
                    {
                        return($"The original copy no longer exists.");
                    }
                    return(null);
                },
                undo = () =>
                {
                    var undoActor       = voosEngine.GetActor(actorName);
                    var prevParentActor = voosEngine.GetActor(prevParent);
                    Debug.Assert(prevParent != null, "BreakLink undo action: prevParent does not exist anymore");
                    undoActor.SetCloneParent(prevParent);
                    undoActor.SetBrainName(prevParentActor.GetBrainName());
                    OnBreakLinkChanged(undoActor);
                }
            });
        }

        SetActorInternal(actor);
    }
    public void Setup()
    {
        Util.FindIfNotSet(this, ref voosEngine);
        Util.FindIfNotSet(this, ref editMain);
        Util.FindIfNotSet(this, ref undo);
        Util.FindIfNotSet(this, ref popups);

        editOriginalButton.onClick.AddListener(() =>
        {
            SetActorInternal(voosEngine.GetActor(currActor.GetCloneParent()));
        });

        breakLinkButton.onClick.AddListener(() => BreakLink());
        voosEngine.onBeforeActorDestroy += (actor) =>
        {
            if (currActor != null && actor == currActor)
            {
                SetActorInternal(null);
                hideCallback(true);
            }
        };
    }