void OnMarkerChanged(IMarker updatedMarker)
        {
            var markerList = m_MarkerList.Markers;

            markerList.Active    = updatedMarker.Id;
            markerList.Markers   = m_MarkerController.MarkerStorage.Markers;
            m_MarkerList.Markers = markerList;
            m_RefreshList.Run(RefreshMarkerList, 0.1f);
            Dispatcher.Dispatch(SetDeltaDNAButtonAction.From($"{k_DeltaDNAPrefix}Changed"));
        }
        private void InvokeOnDispatchMarkers(Payload <IViewerAction> viewerAction)
        {
            HasChanged = false;

            lock (m_SyncRoot)
            {
                if (viewerAction.ActionType.RequiresContext(MarkerEditContext.current, viewerAction.Data))
                {
                    viewerAction.ActionType.ApplyPayload(viewerAction.Data, ref m_MarkerEdit, () =>
                    {
                        bool sendUpdate = false;

                        var editedMarker = m_MarkerEdit.ToMarker();
                        // Check if any of the fields are different from controller.
                        if (!PivotTransform.Similar(m_CachedMarker.RelativePosition, editedMarker.RelativePosition) ||
                            !PivotTransform.Similar(m_CachedMarker.RelativeRotationEuler, editedMarker.RelativeRotationEuler) ||
                            !PivotTransform.Similar(m_CachedMarker.ObjectScale, editedMarker.ObjectScale) ||
                            m_CachedMarker.Name != editedMarker.Name)
                        {
                            sendUpdate = true;
                        }

                        // Update drag handle position
                        if (sendUpdate)
                        {
                            m_MarkerController.Visualize(editedMarker);
                            m_UpdateDragHandle.Run(
                                () => m_DraggableMarkerPlacement.UpdatePose(editedMarker.GetWorldPose(m_MarkerController.AlignedObject.Get())),
                                0.1f);
                            m_CachedMarker = editedMarker;
                            m_MarkerEditContextTarget.UpdateWith(ref m_MarkerEdit);
                        }
                        HasChanged = true;
                    });
                }
                if (viewerAction.ActionType.RequiresContext(MarkerListContext.current, viewerAction.Data))
                {
                    viewerAction.ActionType.ApplyPayload(viewerAction.Data, ref m_MarkerList, () =>
                    {
                        m_MarkerListContextTarget.UpdateWith(ref m_MarkerList);
                        HasChanged = true;
                    });
                }
            }
        }