示例#1
0
        public override VisualElement CreateInspectorGUI()
        {
            var styleSheetLoader = new StyleSheetLoader();

            styleSheetLoader.LoadStyleSheets();
            var root = Root = new VisualElement();

            root.AddToClassList("scene-template-asset-inspector");
            root.AddToClassList(StyleSheetLoader.Styles.unityThemeVariables);
            root.AddToClassList(StyleSheetLoader.Styles.sceneTemplateThemeVariables);
            root.styleSheets.Add(styleSheetLoader.CommonStyleSheet);
            root.styleSheets.Add(styleSheetLoader.VariableStyleSheet);
            root.style.flexDirection = FlexDirection.Column;

            var detailElement = new VisualElement();

            // Template scene
            var templateSceneProperty = serializedObject.FindProperty(k_TemplateScenePropertyName);
            var templatePropertyField = new PropertyField(templateSceneProperty, "Template Scene");

            templatePropertyField.RegisterCallback <ChangeEvent <Object> >(e =>
            {
                RebuildDependencies(root);
                TriggerSceneTemplateModified();
            });
            detailElement.Add(templatePropertyField);

            // Scene title
            var templateTitleProperty = serializedObject.FindProperty(k_TemplateTitlePropertyName);
            var titlePropertyField    = new PropertyField(templateTitleProperty, "Title");

            titlePropertyField.RegisterCallback <ChangeEvent <string> >(e => TriggerSceneTemplateModified());
            detailElement.Add(titlePropertyField);

            // Scene description
            var templateDescriptionProperty = serializedObject.FindProperty(k_TemplateDescriptionPropertyName);
            var descriptionTextField        = new TextField("Description", -1, true, false, '*')
            {
                name  = k_DescriptionTextFieldName,
                value = templateDescriptionProperty.stringValue
            };

            descriptionTextField.AddToClassList(StyleSheetLoader.Styles.classWrappingText);
            descriptionTextField.RegisterValueChangedCallback(e =>
            {
                serializedObject.UpdateIfRequiredOrScript();
                templateDescriptionProperty.stringValue = e.newValue;
                serializedObject.ApplyModifiedProperties();
                TriggerSceneTemplateModified();
            });
            detailElement.Add(descriptionTextField);

            var templateAddToDefaultsProperty = serializedObject.FindProperty(k_TemplateAddToDefaultsPropertyName);
            var defaultTemplateField          = new VisualElement();

            defaultTemplateField.style.flexDirection = FlexDirection.Row;
            var addToDefaultsPropertyField = new PropertyField(templateAddToDefaultsProperty, " ");

            addToDefaultsPropertyField.RegisterCallback <ChangeEvent <bool> >(e => TriggerSceneTemplateModified());
            addToDefaultsPropertyField.style.flexShrink = 0;
            defaultTemplateField.Add(addToDefaultsPropertyField);
            var label = new Label("Pin in New Scene Dialog");

            label.style.unityTextAlign = TextAnchor.MiddleLeft;
            label.style.overflow       = Overflow.Hidden;
            label.style.textOverflow   = TextOverflow.Ellipsis;
            label.style.flexShrink     = 1;
            defaultTemplateField.Add(label);
            detailElement.Add(defaultTemplateField);
            root.Add(CreateFoldoutInspector(detailElement, "Details", "SceneTemplateInspectorDetailsFoldout"));

            // Template thumbnail
            var templateThumbnailProperty = serializedObject.FindProperty(k_TemplateThumbnailPropertyName);
            var thumbnailField            = MakeThumbnailField(templateThumbnailProperty, "Texture");

            root.Add(CreateFoldoutInspector(thumbnailField, "Thumbnail", "SceneTemplateInspectorThumbnailFoldout"));

            // SceneTemplatePipeline
            var sceneTemplatePipeline = new VisualElement();

            sceneTemplatePipeline.Add(new HelpBox(k_ScenteTemplateInfo, HelpBoxMessageType.Info));

            var pipelineProperty = serializedObject.FindProperty(k_TemplatePipelineName);
            var pipelineField    = new PropertyField(pipelineProperty, "Scene Template Pipeline")
            {
                name = k_SceneTemplatePipelineName
            };

            pipelineField.RegisterCallback <ChangeEvent <Object> >(e =>
            {
                if (e.newValue != null && !SceneTemplateAsset.IsValidPipeline(e.newValue as MonoScript))
                {
                    Debug.LogWarning(k_ScenteTemplateInfo);
                    pipelineProperty.objectReferenceValue = null;
                    serializedObject.ApplyModifiedProperties();
                }
            });
            sceneTemplatePipeline.Add(pipelineField);
            root.Add(CreateFoldoutInspector(sceneTemplatePipeline, "Scene Template Pipeline", "SceneTemplatePipelineFoldout"));

            // Dependencies
            root.Add(CreateFoldoutInspector(BuildDependencyRows(), "Dependencies", "SceneTemplateDependenciesFoldout"));

            root.Bind(serializedObject);
            return(root);
        }
示例#2
0
        private void BuildUI()
        {
            // Keyboard events need a focusable element to trigger
            rootVisualElement.focusable = true;
            rootVisualElement.RegisterCallback <KeyUpEvent>(e =>
            {
                switch (e.keyCode)
                {
                case KeyCode.Escape when !docked:
                    Close();
                    break;
                }
            });

            // Load stylesheets
            var styleSheetLoader = new StyleSheetLoader();

            styleSheetLoader.LoadStyleSheets();
            rootVisualElement.AddToClassList(StyleSheetLoader.Styles.unityThemeVariables);
            rootVisualElement.AddToClassList(StyleSheetLoader.Styles.sceneTemplateThemeVariables);
            rootVisualElement.styleSheets.Add(styleSheetLoader.CommonStyleSheet);
            rootVisualElement.styleSheets.Add(styleSheetLoader.VariableStyleSheet);

            // Create a container to offset everything nicely inside the window
            {
                var offsetContainer = new VisualElement();
                offsetContainer.AddToClassList(StyleSheetLoader.Styles.classOffsetContainer);
                rootVisualElement.Add(offsetContainer);

                // Create a container for the scene templates and description
                {
                    var mainContainer = new VisualElement();
                    mainContainer.style.flexDirection = FlexDirection.Row;
                    mainContainer.AddToClassList(StyleSheetLoader.Styles.classMainContainer);
                    offsetContainer.Add(mainContainer);

                    {
                        // Create a container for the scene templates lists(left side)
                        var sceneTemplatesContainer = new VisualElement();
                        sceneTemplatesContainer.AddToClassList(StyleSheetLoader.Styles.classTemplatesContainer);
                        sceneTemplatesContainer.AddToClassList(StyleSheetLoader.Styles.sceneTemplateDialogBorder);
                        // mainContainer.Add(sceneTemplatesContainer);
                        CreateAllSceneTemplateListsUI(sceneTemplatesContainer);

                        // Create a container for the template description (right side)
                        var descriptionContainer = new VisualElement();
                        descriptionContainer.AddToClassList(StyleSheetLoader.Styles.classDescriptionContainer);
                        descriptionContainer.AddToClassList(StyleSheetLoader.Styles.classBorder);
                        // mainContainer.Add(descriptionContainer);
                        CreateTemplateDescriptionUI(descriptionContainer);

                        if (EditorPrefs.HasKey(GetKeyName(nameof(m_Splitter))))
                        {
                            var splitterPosition = EditorPrefs.GetFloat(GetKeyName(nameof(m_Splitter)));
                            sceneTemplatesContainer.style.width = splitterPosition;
                        }
                        else
                        {
                            EditorApplication.delayCall += () =>
                            {
                                sceneTemplatesContainer.style.width = position.width * 0.60f;
                            };
                        }
                        m_Splitter = new VisualSplitter(sceneTemplatesContainer, descriptionContainer, FlexDirection.Row);
                        mainContainer.Add(m_Splitter);
                    }
                }

                // Create the button row
                {
                    var buttonRow = new VisualElement();
                    buttonRow.AddToClassList(StyleSheetLoader.Styles.sceneTemplateDialogFooter);
                    offsetContainer.Add(buttonRow);
                    buttonRow.style.flexDirection = FlexDirection.Row;

                    var loadAdditiveButton = new Toggle()
                    {
                        name = k_SceneTemplateCreateAdditiveButtonName, text = "Load additively"
                    };
                    buttonRow.Add(loadAdditiveButton);
                    {
                        // The buttons need to be right-aligned
                        var buttonSection = new VisualElement();
                        buttonSection.style.flexDirection = FlexDirection.RowReverse;
                        buttonSection.AddToClassList(StyleSheetLoader.Styles.classButtons);
                        buttonRow.Add(buttonSection);
                        var createSceneButton = new Button(() =>
                        {
                            if (m_LastSelectedTemplate == null)
                            {
                                return;
                            }
                            OnCreateNewScene(m_LastSelectedTemplate);
                        })
                        {
                            text = "Create"
                        };
                        createSceneButton.AddToClassList(StyleSheetLoader.Styles.classButton);
                        var cancelButton = new Button(Close)
                        {
                            text = "Cancel"
                        };
                        cancelButton.AddToClassList(StyleSheetLoader.Styles.classButton);
                        buttonSection.Add(cancelButton);
                        buttonSection.Add(createSceneButton);

                        m_Buttons = new List <ButtonInfo>
                        {
                            new ButtonInfo {
                                button = createSceneButton, callback = OnCreateNewScene
                            },
                            new ButtonInfo {
                                button = cancelButton, callback = info => Close()
                            }
                        };
                        m_SelectedButtonIndex = m_Buttons.FindIndex(bi => bi.button == createSceneButton);
                        UpdateSelectedButton();
                    }
                }
                SetAllElementSequentiallyFocusable(rootVisualElement, false);
            }

            if (m_LastSelectedTemplate != null)
            {
                UpdateTemplateDescriptionUI(m_LastSelectedTemplate);
            }
        }