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); }
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); } }