public void StartTracking(List <VisualElement> elements)
        {
            if (!enable)
            {
                return;
            }

            // Some panels like the main Toolbar don't have any tracking set up
            if (panel.contextType == ContextType.Editor && m_EditorVisualTreeAssetTracker == null)
            {
                return;
            }

            VisualTreeAsset currentAsset = null;
            ILiveReloadAssetTracker <VisualTreeAsset> tracker = null;

            foreach (var ve in elements)
            {
                if (ve.visualTreeAssetSource != null)
                {
                    if (ve.visualTreeAssetSource != currentAsset)
                    {
                        currentAsset = ve.visualTreeAssetSource;
                        tracker      = FindTracker(ve);
                    }
                    StartVisualTreeAssetTracking(tracker, ve.visualTreeAssetSource);
                }

                if (ve.styleSheetList?.Count > 0)
                {
                    foreach (var styleSheet in ve.styleSheetList)
                    {
                        m_LiveReloadStyleSheetAssetTracker.StartTrackingAsset(styleSheet);
                    }
                }
            }
        }
        private void StartVisualTreeAssetTracking(ILiveReloadAssetTracker <VisualTreeAsset> tracker, VisualTreeAsset asset)
        {
            int dirtyCount = tracker.StartTrackingAsset(asset);

            if (!m_AssetToTrackerMap.TryGetValue(asset, out var trackers))
            {
                trackers = new VisualTreeAssetToTrackMappingEntry()
                {
                    m_LastDirtyCount = dirtyCount,
                    m_Trackers       = new HashSet <ILiveReloadAssetTracker <VisualTreeAsset> >()
                };
                m_AssetToTrackerMap[asset] = trackers;
            }
            trackers.m_Trackers.Add(tracker);
        }
        internal void StartVisualTreeAssetTracking(ILiveReloadAssetTracker <VisualTreeAsset> tracker,
                                                   VisualElement visualElementUsingAsset)
        {
            tracker.StartTrackingAsset(visualElementUsingAsset.m_VisualTreeAssetSource);

            if (m_TrackerToVisualElementMap.TryGetValue(tracker, out var visualElements))
            {
                visualElements.Add(visualElementUsingAsset);
            }
            else
            {
                visualElements = new HashSet <VisualElement>();
                m_TrackerToVisualElementMap[tracker] = visualElements;
                m_LiveReloadVisualTreeAssetTrackers.Add(tracker);
            }
        }
        private void StartVisualTreeAssetTracking(ILiveReloadAssetTracker <VisualTreeAsset> tracker, VisualTreeAsset asset)
        {
            int dirtyCount = tracker.StartTrackingAsset(asset);

            if (!m_AssetToTrackerMap.TryGetValue(asset, out var trackers))
            {
                trackers = new VisualTreeAssetToTrackMappingEntry()
                {
                    m_LastDirtyCount                    = dirtyCount,
                    m_LastElementCount                  = asset.visualElementAssets.Count,
                    m_LastInlinePropertiesCount         = asset.inlineSheet.rules.Sum(r => r.properties.Length),
                    m_LastAttributePropertiesDirtyCount = asset.GetAttributePropertiesDirtyCount(),
                    m_Trackers = new HashSet <ILiveReloadAssetTracker <VisualTreeAsset> >()
                };
                m_AssetToTrackerMap[asset] = trackers;
            }
            trackers.m_Trackers.Add(tracker);
        }