| | 1 | | using DCL.Controllers; |
| | 2 | | using DCL.Models; |
| | 3 | | using System; |
| | 4 | | using System.Collections.Generic; |
| | 5 | |
|
| | 6 | | namespace DCL.PortableExperiencesToggle |
| | 7 | | { |
| | 8 | | public class PortableExperiencesToggleController : IDisposable |
| | 9 | | { |
| | 10 | | private readonly IntVariable currentSceneVariable; |
| | 11 | | private readonly IWorldState worldState; |
| | 12 | | private readonly IPortableExperiencesBridge portableExperiencesBridge; |
| | 13 | | private readonly BaseHashSet<string> portableExperiencesIds; |
| | 14 | | private readonly BaseDictionary<string, (string name, string description, string icon)> disabledPortableExperien |
| | 15 | | private readonly BaseDictionary<int, bool> isSceneUiEnabled; |
| 5 | 16 | | private readonly List<string> idsBuffer = new (); |
| 5 | 17 | | private readonly List<string> originalDisabledPortableExperiences = new (); |
| 5 | 18 | | private readonly Dictionary<int, (int, bool)> originalPxUiVisibility = new (); |
| | 19 | |
|
| | 20 | | private ScenePortableExperienceFeatureToggles lastToggle = ScenePortableExperienceFeatureToggles.Enable; |
| | 21 | |
|
| 5 | 22 | | public PortableExperiencesToggleController(IntVariable currentSceneVariable, |
| | 23 | | IWorldState worldState, |
| | 24 | | IPortableExperiencesBridge portableExperiencesBridge, |
| | 25 | | BaseHashSet<string> portableExperiencesIds, |
| | 26 | | BaseDictionary<string, (string name, string description, string icon)> disabledPortableExperiences, |
| | 27 | | BaseDictionary<int, bool> isSceneUiEnabled) |
| | 28 | | { |
| 5 | 29 | | this.currentSceneVariable = currentSceneVariable; |
| 5 | 30 | | this.worldState = worldState; |
| 5 | 31 | | this.portableExperiencesBridge = portableExperiencesBridge; |
| 5 | 32 | | this.portableExperiencesIds = portableExperiencesIds; |
| 5 | 33 | | this.disabledPortableExperiences = disabledPortableExperiences; |
| 5 | 34 | | this.isSceneUiEnabled = isSceneUiEnabled; |
| | 35 | |
|
| 5 | 36 | | currentSceneVariable.OnChange += OnCurrentSceneChanged; |
| 5 | 37 | | } |
| | 38 | |
|
| | 39 | | public void Dispose() |
| | 40 | | { |
| 5 | 41 | | currentSceneVariable.OnChange -= OnCurrentSceneChanged; |
| 5 | 42 | | } |
| | 43 | |
|
| | 44 | | private void OnCurrentSceneChanged(int current, int previous) |
| | 45 | | { |
| 7 | 46 | | IParcelScene scene = worldState.GetScene(current); |
| 7 | 47 | | if (scene == null) return; |
| | 48 | |
|
| 7 | 49 | | ScenePortableExperienceFeatureToggles pxToggle = scene.sceneData.scenePortableExperienceFeatureToggles; |
| | 50 | |
|
| 7 | 51 | | if (pxToggle == ScenePortableExperienceFeatureToggles.Disable) |
| | 52 | | { |
| 2 | 53 | | originalDisabledPortableExperiences.Clear(); |
| 2 | 54 | | originalDisabledPortableExperiences.AddRange(disabledPortableExperiences.GetKeys()); |
| 2 | 55 | | DisableAllPortableExperiences(); |
| | 56 | | } |
| 5 | 57 | | else if (pxToggle == ScenePortableExperienceFeatureToggles.HideUi) |
| | 58 | | { |
| 2 | 59 | | originalPxUiVisibility.Clear(); |
| | 60 | |
|
| 12 | 61 | | foreach (string pxId in portableExperiencesIds.Get()) |
| | 62 | | { |
| 4 | 63 | | IParcelScene pxScene = worldState.GetPortableExperienceScene(pxId); |
| 4 | 64 | | if (pxScene == null) continue; |
| 4 | 65 | | originalPxUiVisibility[pxScene.sceneData.sceneNumber] = (pxScene.sceneData.sceneNumber, true); |
| | 66 | | } |
| | 67 | |
|
| 4 | 68 | | foreach ((int sceneNumber, bool visible) in isSceneUiEnabled) |
| 0 | 69 | | originalPxUiVisibility[sceneNumber] = (sceneNumber, visible); |
| | 70 | |
|
| 2 | 71 | | HideUiOfAllPortableExperiences(); |
| | 72 | | } |
| 3 | 73 | | else if (pxToggle == ScenePortableExperienceFeatureToggles.Enable) |
| | 74 | | { |
| 3 | 75 | | if (lastToggle == ScenePortableExperienceFeatureToggles.Disable) |
| 1 | 76 | | RestoreAllPortableExperiences(); |
| 2 | 77 | | else if (lastToggle == ScenePortableExperienceFeatureToggles.HideUi) |
| 1 | 78 | | RestorePortableExperiencesUiVisibility(); |
| | 79 | | } |
| | 80 | |
|
| 7 | 81 | | lastToggle = pxToggle; |
| 7 | 82 | | } |
| | 83 | |
|
| | 84 | | private void HideUiOfAllPortableExperiences() |
| | 85 | | { |
| 12 | 86 | | foreach (string pxId in portableExperiencesIds.Get()) |
| | 87 | | { |
| 4 | 88 | | IParcelScene pxScene = worldState.GetPortableExperienceScene(pxId); |
| 4 | 89 | | if (pxScene == null) continue; |
| | 90 | |
|
| 4 | 91 | | isSceneUiEnabled.AddOrSet(pxScene.sceneData.sceneNumber, false); |
| | 92 | | } |
| 2 | 93 | | } |
| | 94 | |
|
| | 95 | | private void DisableAllPortableExperiences() |
| | 96 | | { |
| 2 | 97 | | idsBuffer.Clear(); |
| 2 | 98 | | idsBuffer.AddRange(disabledPortableExperiences.GetKeys()); |
| 2 | 99 | | idsBuffer.AddRange(portableExperiencesIds.Get()); |
| 2 | 100 | | portableExperiencesBridge.SetDisabledPortableExperiences(idsBuffer); |
| 2 | 101 | | } |
| | 102 | |
|
| | 103 | | private void RestoreAllPortableExperiences() => |
| 1 | 104 | | portableExperiencesBridge.SetDisabledPortableExperiences(originalDisabledPortableExperiences); |
| | 105 | |
|
| | 106 | | private void RestorePortableExperiencesUiVisibility() => |
| 1 | 107 | | isSceneUiEnabled.Set(originalPxUiVisibility.Values); |
| | 108 | | } |
| | 109 | | } |