// ------------------------------------------------------
        #endregion
        #region ILayoutManagerDelegate
        // ------------------------------------------------------

        public void LayoutManagerLoadedNewLayout(LayoutManager manager, Layout newLayout) {
            // LoadSoundClipsExclusivelyForCurrentLayout(() => { });
            canvasControl.mainScreen.LayoutChanged(newLayout, manager.loadedAudioClipCount, manager.soundDictionary.Count);
        }
 public void LayoutManagerHotspotListChanged(LayoutManager manager, Layout layout) {
     canvasControl.mainScreen.LayoutChanged(layout, manager.loadedAudioClipCount, manager.soundDictionary.Count);
 }
 public void DuplicateLayout(Layout layout) {
     layoutManager.DuplicateLayout(layout);
     LoadLayoutData();
 }
 public void DeleteLayout(Layout layout) {
     layoutManager.DeleteLayout(layout);
     LoadLayoutData();
 }
 public void LoadLayout(Layout layout) {
     layoutManager.currentLayoutId = layout.id;
     LoadLayoutData();
 }
        void refreshLoadStateForSoundMarkers(List <SoundMarker> markers, Layout layout, Action completion)
        {
            if (_managerDelegate == null || layout == null)
            {
                return;
            }
            Dictionary <string, SoundFile> sfDict = _managerDelegate.getSoundDictionary();
            int numLoaded = _managerDelegate.getNumLoadedInSoundDictionary();

            // UnityEngine.Debug.LogWarning("refreshLoadStateForSoundMarkers NumLoadedAudioClips: " + numLoaded);

            LambdaWaiter <SoundFile> lambdaWaiter = new LambdaWaiter <SoundFile>();

            HashSet <string>    loadingOrLoadedMarkerIDs  = new HashSet <string>();
            HashSet <SoundFile> loadingOrLoadedSoundFiles = new HashSet <SoundFile>();

            foreach (SoundMarker marker in markers)
            {
                if (loadingOrLoadedMarkerIDs.Contains(marker.hotspot.id))
                {
                    continue;
                }                                                                       // Already covered by a SyncedMarker

                SoundFile sf;
                if (!sfDict.TryGetValue(marker.hotspot.soundID, out sf))
                {
                    continue;
                }

                // if (marker.onDemandAudioShouldBeLoaded) {
                //     UnityEngine.Debug.LogWarning("   Marker " + sf.filename + " onDemandAudioShouldBeLoaded: " + marker.onDemandAudioShouldBeLoaded);
                // } else {
                //     UnityEngine.Debug.LogWarning("   Marker " + sf.filename + " onDemandAudioShouldBeLoaded: " + marker.onDemandAudioShouldBeLoaded);
                // }
                if (!marker.onDemandAudioShouldBeLoaded)
                {
                    continue;
                }

                // The Marker SHOULD be loaded
                loadingOrLoadedSoundFiles.Add(sf);
                loadingOrLoadedMarkerIDs.Add(marker.hotspot.id);

                LoadClipInSoundFileOnCoroutine(sf, marker,
                                               lambdaWaiter.AddCallback((SoundFile returnedSoundFile) => {
                }));

                // Also make sure any synced markers are loaded or loading...
                // IEnumerable<string> syncedMarkerIDs = layout.getSynchronisedMarkerIDs(marker.hotspot.id);
                IEnumerable <SoundMarker> syncedMarkers = layout.getSynchronisedMarkers(marker.hotspot.id);
                if (syncedMarkers == null)
                {
                    continue;
                }

                foreach (SoundMarker syncedMarker in syncedMarkers)
                {
                    if (loadingOrLoadedMarkerIDs.Contains(syncedMarker.hotspot.id))
                    {
                        continue;
                    }                                                                             // Marker already loaded or loading...

                    SoundFile syncedSoundFile;
                    if (!sfDict.TryGetValue(syncedMarker.hotspot.soundID, out syncedSoundFile))
                    {
                        continue;
                    }

                    // UnityEngine.Debug.Log("   SyncedMarker " + sf.filename + " SHOULD be loaded");
                    loadingOrLoadedSoundFiles.Add(syncedSoundFile);
                    loadingOrLoadedMarkerIDs.Add(syncedMarker.hotspot.id);

                    if (syncedSoundFile.isDefaultSoundFile)
                    {
                        continue;
                    }
                    // Execute the below if the AudioClip is not loaded
                    LoadClipInSoundFileOnCoroutine(syncedSoundFile, syncedMarker,
                                                   lambdaWaiter.AddCallback((SoundFile returnedSoundFile) => {
                    }));
                }
            }

            // Unload SoundClips that aren't being used in the current layout
            int numDestroyed = unloadSoundFilesExceptThoseInSet(loadingOrLoadedSoundFiles, sfDict);

            UnityEngine.Debug.Log("RefreshLoadStateForSoundMarkers... " + markers.Count + " Markers, "
                                  + loadingOrLoadedSoundFiles.Count + " SoundClip(s) are loading or loaded... "
                                  + (sfDict.Values.Count - loadingOrLoadedSoundFiles.Count + " NOT loaded. "
                                     + numDestroyed + " DESTROYED!"));
            lambdaWaiter.WaitForAllCallbacks(() => {
                _managerDelegate?.OnDemandLoadingLoadedAudioClipsChanged(this);
                if (completion != null)
                {
                    completion();
                }
            });
        }
 public LoadAllAudioClipsOperation(List <SoundMarker> markers, Layout layout, Action completion)
 {
     this.markers    = markers;
     this.layout     = layout;
     this.completion = completion;
 }
 public RefreshMarkerClipLoadStatesOperation(List <SoundMarker> markers, Layout layout, Action completion)
 {
     this.markers    = markers;
     this.layout     = layout;
     this.completion = completion;
 }
 public LoadSoundMarkerAndSyncedClipsOperation(SoundMarker marker, Layout layout, Action <HashSet <SoundMarker> > completion)
 {
     this.marker     = marker;
     this.layout     = layout;
     this.completion = completion;
 }