예제 #1
0
 void HandleFirstTimePrefabStageIsOpened(StageNavigationItem stage)
 {
     if (stage.isPrefabStage && GetStoredHierarchyState(m_SceneHierarchyWindow, stage) == null)
     {
         SetDefaultExpandedStateForOpenedPrefab(stage.prefabStage.prefabContentsRoot);
     }
 }
예제 #2
0
        public void LoadStateIntoHierarchy(SceneHierarchyWindow hierarchy, StageNavigationItem stage)
        {
            // Restore expanded state always
            if (stage.isMainStage)
            {
                hierarchy.sceneHierarchy.treeViewState.expandedIDs = m_ExpandedSceneGameObjectInstanceIDs;
            }
            else
            {
                RestoreExandedStateFromFileIDs(hierarchy, stage, m_ExpandedPrefabGameObjectFileIDs, m_LastClickedFileID);
            }


            // Restore selection and scroll value when requested
            if (stage.setSelectionAndScrollWhenBecomingCurrentStage)
            {
                Selection.activeInstanceID = stage.isMainStage ? m_LastClickedInstanceID : hierarchy.sceneHierarchy.treeViewState.lastClickedID;
                hierarchy.sceneHierarchy.treeViewState.scrollPos.y = m_ScrollY;
            }

            if (SceneHierarchy.s_DebugPersistingExpandedState)
            {
                DebugLog("Restoring", stage);
            }
        }
예제 #3
0
 void OnStageChanged(StageNavigationItem previousStage, StageNavigationItem newStage)
 {
     SaveCameraState(m_SceneView, previousStage);
     SyncToCurrentStage();
     m_BreadcrumbInitialized = false;
     m_SceneView.OnStageChanged(previousStage, newStage);
 }
예제 #4
0
 void OnStageChanging(StageNavigationItem previousStage, StageNavigationItem newStage)
 {
     // Exit Avatar Editing before entering Prefab Mode so the camera states of the Prefab Mode is set last.
     // This is why we use the stageChanging and not stageChanged event.
     if (newStage.isPrefabStage && m_EditMode == EditMode.Editing)
     {
         SwitchToAssetMode(false);
     }
 }
예제 #5
0
 void DebugLog(string prefix, StageNavigationItem stage)
 {
     Debug.Log(prefix + (stage.isMainStage ? " Main stage " : " Prefab stage ") + string.Format("-main stage: {0}, -prefab stage: {1}, -scrollY: {2}, -selection {3}, -setSelection {4}",
                                                                                                DebugUtils.ListToString(m_ExpandedSceneGameObjectInstanceIDs),
                                                                                                DebugUtils.ListToString(m_ExpandedPrefabGameObjectFileIDs),
                                                                                                m_ScrollY,
                                                                                                m_LastClickedInstanceID,
                                                                                                stage.setSelectionAndScrollWhenBecomingCurrentStage));
 }
예제 #6
0
        static void RestoreExandedStateFromFileIDs(SceneHierarchyWindow hierarchy, StageNavigationItem item, List <UInt64> expandedGameObjectFileIDs, UInt64 lastClickedFileID)
        {
            var searchRoot = item.prefabStage.prefabContentsRoot;
            var fileIDToInstanceIDMapper = new FileIDToInstanceIDMapper(searchRoot.transform, expandedGameObjectFileIDs, lastClickedFileID);

            hierarchy.sceneHierarchy.treeViewState.lastClickedID = fileIDToInstanceIDMapper.instanceID;
            hierarchy.sceneHierarchy.treeViewState.expandedIDs   = fileIDToInstanceIDMapper.instanceIDs;
            hierarchy.sceneHierarchy.treeViewState.expandedIDs.Sort(); // required to be sorted (see TreeViewState)
        }
예제 #7
0
        void AutoSaveButtons()
        {
            StageNavigationItem item = StageNavigationManager.instance.currentItem;

            if (item.isPrefabStage)
            {
                if (m_IsPrefabInValidAssetFolder && !m_IsPrefabInImmutableFolder)
                {
                    StatusQueryOptions opts = EditorUserSettings.allowAsyncStatusUpdate ? StatusQueryOptions.UseCachedAsync : StatusQueryOptions.UseCachedIfPossible;
                    bool openForEdit        = AssetDatabase.IsOpenForEdit(item.prefabAssetPath, opts);

                    PrefabStage stage = item.prefabStage;
                    if (stage.showingSavingLabel)
                    {
                        GUILayout.Label(Styles.autoSavingBadgeContent, Styles.savingBadge);
                        GUILayout.Space(4);
                    }

                    if (!stage.autoSave)
                    {
                        using (new EditorGUI.DisabledScope(!openForEdit || !PrefabStageUtility.GetCurrentPrefabStage().HasSceneBeenModified()))
                        {
                            if (GUILayout.Button(Styles.saveButtonContent, Styles.button))
                            {
                                PrefabStageUtility.GetCurrentPrefabStage().SavePrefabWithVersionControlDialogAndRenameDialog();
                            }
                        }
                    }

                    using (new EditorGUI.DisabledScope(stage.temporarilyDisableAutoSave))
                    {
                        bool autoSaveForScene = stage.autoSave;
                        EditorGUI.BeginChangeCheck();
                        autoSaveForScene = GUILayout.Toggle(autoSaveForScene, Styles.autoSaveGUIContent, Styles.saveToggle);
                        if (EditorGUI.EndChangeCheck())
                        {
                            stage.autoSave = autoSaveForScene;
                        }
                    }

                    if (!openForEdit)
                    {
                        if (GUILayout.Button(Styles.checkoutButtonContent, Styles.button))
                        {
                            Task task = Provider.Checkout(AssetDatabase.LoadAssetAtPath <GameObject>(item.prefabAssetPath), CheckoutMode.Both);
                            task.Wait();
                        }
                    }
                }
                else
                {
                    GUILayout.Label(Styles.immutablePrefabContent, EditorStyles.boldLabel);
                }
            }
        }
예제 #8
0
 private static void StageNavigationManagerOnStageChanging(StageNavigationItem oldItem, StageNavigationItem newItem)
 {
     RevertIsolationCurrentStage();
     if (!newItem.isMainStage && newItem.prefabStage != null)
     {
         SceneVisibilityState.SetPrefabStageScene(newItem.prefabStage.scene);
     }
     else
     {
         SceneVisibilityState.SetPrefabStageScene(default(Scene));
     }
 }
예제 #9
0
        void HandleFirstTimePrefabStageIsOpened(StageNavigationItem stage)
        {
            if (stage.isPrefabStage && GetStoredCameraState(m_SceneView, stage) == null)
            {
                // Default to scene view lighting if scene itself does not have any lights
                if (!HasAnyActiveLights(stage.prefabStage.scene))
                {
                    m_SceneView.sceneLighting = false;
                }

                // For UI to frame properly we need to delay one full Update for the layouting to have been processed
                EditorApplication.update += DelayedFraming;
            }
        }
예제 #10
0
        void LoadHierarchyState(SceneHierarchyWindow hierarchy, StageNavigationItem stage)
        {
            if (stage == null)
            {
                return;
            }

            var state = GetStoredHierarchyState(hierarchy, stage);

            if (state != null)
            {
                state.LoadStateIntoHierarchy(hierarchy, stage);
            }
        }
예제 #11
0
        void LoadCameraState(SceneView sceneView, StageNavigationItem stage)
        {
            if (stage == null)
            {
                return;
            }

            var state = GetStoredCameraState(sceneView, stage);

            if (state != null)
            {
                state.RestoreStateToSceneView(sceneView);
            }
        }
 private static void StageNavigationManagerOnStageChanging(StageNavigationItem oldItem, StageNavigationItem newItem)
 {
     if (!newItem.isMainStage && newItem.prefabStage != null)
     {
         SceneVisibilityState.SetPrefabStageScene(newItem.prefabStage.scene);
     }
     else
     {
         SceneVisibilityState.SetPrefabStageScene(default(Scene));
     }
     if (!oldItem.isMainStage)
     {
         SceneVisibilityState.prefabStageIsolated = false;
     }
 }
예제 #13
0
        void SaveHierarchyState(SceneHierarchyWindow hierarchyWindow, StageNavigationItem stage)
        {
            if (stage == null)
            {
                return;
            }
            string key   = StageUtility.CreateWindowAndStageIdentifier(hierarchyWindow.windowGUID, stage);
            var    state = m_StateCache.GetState(key);

            if (state == null)
            {
                state = new SceneHierarchyState();
            }
            state.SaveStateFromHierarchy(hierarchyWindow, stage);
            m_StateCache.SetState(key, state);
        }
예제 #14
0
        void OnStageChanged(StageNavigationItem previousStage, StageNavigationItem newStage)
        {
            if (previousStage.isMainStage)
            {
                SaveHierarchyState(m_SceneHierarchyWindow, previousStage); // prefab stage is saved before it is destroyed
            }
            var stage = StageNavigationManager.instance.currentItem;

            SyncHierarchyToCurrentStage(newStage, true);
            CachePrefabHeaderText(stage);

            if (m_SceneHierarchyWindow.hasSearchFilter)
            {
                m_SceneHierarchyWindow.SetSearchFilter(string.Empty, m_SceneHierarchyWindow.searchMode, true);
            }
        }
예제 #15
0
        void SaveCameraState(SceneView sceneView, StageNavigationItem stage)
        {
            if (stage == null)
            {
                return;
            }
            string key   = StageUtility.CreateWindowAndStageIdentifier(sceneView.windowGUID, stage);
            var    state = m_StateCache.GetState <SceneViewCameraState>(key);

            if (state == null)
            {
                state = new SceneViewCameraState();
            }
            state.SaveStateFromSceneView(sceneView);
            m_StateCache.SetState(key, state);
        }
예제 #16
0
        void SyncToCurrentStage()
        {
            StageNavigationItem stage = StageNavigationManager.instance.currentItem;

            if (stage.isMainStage)
            {
                m_SceneView.customScene = new Scene();
                m_SceneView.customParentForDraggedObjects = null;
            }
            else
            {
                m_SceneView.customScene = PrefabStageUtility.GetCurrentPrefabStage().scene;
                m_SceneView.customParentForDraggedObjects = PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot.transform;
            }

            LoadCameraState(m_SceneView, stage);
            HandleFirstTimePrefabStageIsOpened(stage);
        }
예제 #17
0
        void HandleFirstTimePrefabStageIsOpened(StageNavigationItem stage)
        {
            if (stage.isPrefabStage && GetStoredCameraState(m_SceneView, stage) == null)
            {
                // Default to scene view lighting if scene itself does not have any lights
                if (!HasAnyActiveLights(stage.prefabStage.scene))
                {
                    m_SceneView.sceneLighting = false;
                }

                // Default to not showing skybox if user did not specify a custom environment scene.
                if (string.IsNullOrEmpty(stage.prefabStage.scene.path))
                {
                    m_SceneView.sceneViewState.showSkybox = false;
                }

                // For UI to frame properly we need to delay one full Update for the layouting to have been processed
                EditorApplication.update += DelayedFraming;
            }
        }
예제 #18
0
        void CachePrefabHeaderText(StageNavigationItem stage)
        {
            if (!stage.isPrefabStage)
            {
                return;
            }

            var prefabStage = stage.prefabStage;

            if (prefabStage == null)
            {
                return;
            }

            var prefabAssetPath = prefabStage.prefabAssetPath;

            m_PrefabHeaderContent      = new GUIContent();
            m_PrefabHeaderContent.text = System.IO.Path.GetFileNameWithoutExtension(prefabAssetPath);

            // Make room for version control overlay icons.
            // GUIStyles don't allow controlling the space between icon and text.
            // We could add spacing by splitting text and icon into two rects and two draw operations,
            // but just adding a space character is a lot simpler and ends up amounting to the same thing.
            // This is cached text so there is minimal overhead.
            if (VersionControl.Provider.isActive)
            {
                m_PrefabHeaderContent.text = " " + m_PrefabHeaderContent.text;
            }

            PrefabUtility.GetPrefabAssetType(prefabStage.prefabContentsRoot);
            m_PrefabHeaderContent.image = prefabStage.prefabFileIcon;
            if (!stage.prefabAssetExists)
            {
                m_PrefabHeaderContent.tooltip = L10n.Tr("Prefab asset has been deleted");
            }

            if (PrefabStageUtility.GetCurrentPrefabStage().HasSceneBeenModified())
            {
                m_PrefabHeaderContent.text += "*";
            }
        }
예제 #19
0
        void SyncHierarchyToCurrentStage(StageNavigationItem stage, bool loadExpandedState)
        {
            if (loadExpandedState)
            {
                LoadHierarchyState(m_SceneHierarchyWindow, stage);
            }

            if (stage.isMainStage)
            {
                m_SceneHierarchy.customParentForNewGameObjects = null;
                m_SceneHierarchy.SetCustomDragHandler(null);
                m_SceneHierarchy.customScenes = null;
            }
            else
            {
                m_SceneHierarchy.customParentForNewGameObjects = stage.prefabStage.prefabContentsRoot.transform;
                m_SceneHierarchy.SetCustomDragHandler(PrefabModeDraggingHandler);
                m_SceneHierarchy.customScenes = new[] { stage.prefabStage.scene };
                HandleFirstTimePrefabStageIsOpened(stage);
                m_SceneHierarchy.FrameObject(stage.prefabStage.prefabContentsRoot.GetInstanceID(), false);
            }
        }
예제 #20
0
        public void SaveStateFromHierarchy(SceneHierarchyWindow hierarchy, StageNavigationItem stage)
        {
            var lastClickedGameObject = EditorUtility.InstanceIDToObject(hierarchy.sceneHierarchy.treeViewState.lastClickedID) as GameObject;

            if (stage.isMainStage)
            {
                m_LastClickedInstanceID = lastClickedGameObject != null?lastClickedGameObject.GetInstanceID() : 0;

                m_ExpandedSceneGameObjectInstanceIDs = hierarchy.sceneHierarchy.treeViewState.expandedIDs;
            }
            else
            {
                m_LastClickedFileID = lastClickedGameObject != null?GetOrGenerateFileID(lastClickedGameObject) : 0;

                m_ExpandedPrefabGameObjectFileIDs = GetExpandedGameObjectFileIDs(hierarchy);
            }

            m_ScrollY = hierarchy.sceneHierarchy.treeViewState.scrollPos.y;

            if (SceneHierarchy.s_DebugPersistingExpandedState)
            {
                DebugLog("Saving", stage);
            }
        }
예제 #21
0
 void OnPrefabStageReloaded(StageNavigationItem prefabStage)
 {
     LoadHierarchyState(m_SceneHierarchyWindow, prefabStage);                 // Load hierarchy state before reloading the tree so the correct rows are loaded
     m_SceneHierarchy.customParentForNewGameObjects = prefabStage.prefabStage.prefabContentsRoot.transform;
     m_SceneHierarchy.customScenes = new[] { prefabStage.prefabStage.scene }; // This will re-init the TreeView (new scenes to show)
 }
예제 #22
0
 void OnPrefabStageReloading(StageNavigationItem prefabStage)
 {
     SaveHierarchyState(m_SceneHierarchyWindow, prefabStage); // Save hierarchy state so we can load it after the prefab have been reloaded (with new instanceIDs)
 }
예제 #23
0
 void OnPrefabStageBeingDestroyed(StageNavigationItem prefabStage)
 {
     SaveHierarchyState(m_SceneHierarchyWindow, prefabStage);
 }
예제 #24
0
 void OnPrefabStageReloaded(StageNavigationItem prefabStage)
 {
     m_SceneView.customScene = prefabStage.prefabStage.scene;
     m_SceneView.customParentForDraggedObjects = prefabStage.prefabStage.prefabContentsRoot.transform;
 }
예제 #25
0
        SceneHierarchyState GetStoredHierarchyState(SceneHierarchyWindow hierarchyWindow, StageNavigationItem stage)
        {
            string key = StageUtility.CreateWindowAndStageIdentifier(hierarchyWindow.windowGUID, stage);

            return(m_StateCache.GetState(key));
        }
예제 #26
0
        SceneViewCameraState GetStoredCameraState(SceneView sceneView, StageNavigationItem stage)
        {
            string key = StageUtility.CreateWindowAndStageIdentifier(sceneView.windowGUID, stage);

            return(m_StateCache.GetState <SceneViewCameraState>(key));
        }