public override void CreateUI() { var root = rootVisualElement; var viewportWindow = document.primaryViewportWindow; if (viewportWindow == null) { return; } var selection = viewportWindow.selection; var viewport = viewportWindow.viewport; var classDragger = new BuilderClassDragger(this, root, selection, viewport, viewport.parentTracker); var hierarchyDragger = new BuilderHierarchyDragger(this, root, selection, viewport, viewport.parentTracker); var contextMenuManipulator = new BuilderElementContextMenu(this, selection); m_HierarchyPane = new BuilderHierarchy(this, viewport, selection, classDragger, hierarchyDragger, contextMenuManipulator, null); selection.AddNotifier(m_HierarchyPane); root.Add(m_HierarchyPane); // Command Handler commandHandler.RegisterPane(m_HierarchyPane); }
public BuilderExplorer( BuilderViewport viewport, BuilderSelection selection, BuilderClassDragger classDragger, BuilderHierarchyDragger hierarchyDragger, BuilderElementContextMenu contextMenuManipulator, VisualElement documentElementRoot, HighlightOverlayPainter highlightOverlayPainter, string toolbarUxmlPath) { m_Viewport = viewport; m_DocumentElementRoot = documentElementRoot; m_DocumentElement = viewport.documentElement; AddToClassList(s_UssClassName); m_ClassDragger = classDragger; m_HierarchyDragger = hierarchyDragger; m_ContextMenuManipulator = contextMenuManipulator; m_SelectionMadeExternally = false; m_Selection = selection; // TODO: Transfer to own USS. var sheet = EditorGUIUtility.Load(k_DefaultStyleSheetPath) as StyleSheet; styleSheets.Add(sheet); StyleSheet colorSheet; if (EditorGUIUtility.isProSkin) { colorSheet = EditorGUIUtility.Load(k_DefaultDarkStyleSheetPath) as StyleSheet; } else { colorSheet = EditorGUIUtility.Load(k_DefaultLightStyleSheetPath) as StyleSheet; } styleSheets.Add(colorSheet); // Query the UI if (!string.IsNullOrEmpty(toolbarUxmlPath)) { var template = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>(toolbarUxmlPath); template.CloneTree(this); } // Create the Hierarchy View. m_ElementHierarchyView = new ElementHierarchyView( m_DocumentElement, selection, classDragger, hierarchyDragger, contextMenuManipulator, ElementSelected, highlightOverlayPainter); m_ElementHierarchyView.style.flexGrow = 1; Add(m_ElementHierarchyView); // Make sure the Hierarchy View gets focus when the pane gets focused. primaryFocusable = m_ElementHierarchyView.Q <ListView>(); UpdateHierarchyAndSelection(false); m_ShouldRebuildHierarchyOnStyleChange = true; }
public override void CreateUI() { var root = rootVisualElement; var viewportWindow = document.primaryViewportWindow; if (viewportWindow == null) { return; } var selection = viewportWindow.selection; var viewport = viewportWindow.viewport; var classDragger = new BuilderClassDragger(this, root, selection, viewport, viewport.parentTracker); var styleSheetsDragger = new BuilderStyleSheetsDragger(this, root, selection); m_StyleSheetsPane = new BuilderStyleSheets(this, viewport, selection, classDragger, styleSheetsDragger, null, null); selection.AddNotifier(m_StyleSheetsPane); root.Add(m_StyleSheetsPane); // Command Handler commandHandler.RegisterPane(m_StyleSheetsPane); }
public BuilderExplorer( BuilderPaneWindow paneWindow, BuilderViewport viewport, BuilderSelection selection, BuilderClassDragger classDragger, BuilderExplorerDragger explorerDragger, BuilderElementContextMenu contextMenuManipulator, VisualElement documentElementRoot, bool includeDocumentElementRoot, HighlightOverlayPainter highlightOverlayPainter, string toolbarUxmlPath) { m_PaneWindow = paneWindow; m_Viewport = viewport; m_DocumentElementRoot = documentElementRoot; m_IncludeDocumentElementRoot = includeDocumentElementRoot; m_DocumentElement = viewport.documentElement; AddToClassList(s_UssClassName); m_ClassDragger = classDragger; m_ExplorerDragger = explorerDragger; m_ContextMenuManipulator = contextMenuManipulator; m_SelectionMadeExternally = false; m_Selection = selection; // Query the UI if (!string.IsNullOrEmpty(toolbarUxmlPath)) { var template = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>(toolbarUxmlPath); template.CloneTree(this); } // Create the Hierarchy View. m_ElementHierarchyView = new ElementHierarchyView( m_PaneWindow, m_DocumentElement, selection, classDragger, explorerDragger, contextMenuManipulator, ElementSelectionChanged, highlightOverlayPainter); m_ElementHierarchyView.style.flexGrow = 1; Add(m_ElementHierarchyView); // Enable horizontal scrolling. #if UNITY_2020_2_OR_NEWER m_ElementHierarchyView.Q <TreeView>().horizontalScrollingEnabled = true; #endif // Make sure the Hierarchy View gets focus when the pane gets focused. primaryFocusable = m_ElementHierarchyView.Q <ListView>(); UpdateHierarchyAndSelection(false); m_ShouldRebuildHierarchyOnStyleChange = true; }
public BuilderHierarchy( BuilderViewport viewport, BuilderSelection selection, BuilderClassDragger classDragger, BuilderHierarchyDragger hierarchyDragger, BuilderElementContextMenu contextMenuManipulator, HighlightOverlayPainter highlightOverlayPainter) : base( viewport, selection, classDragger, hierarchyDragger, contextMenuManipulator, viewport.documentElement, highlightOverlayPainter, null) { viewDataKey = "builder-hierarchy"; }
public BuilderHierarchy( BuilderViewport viewport, BuilderSelection selection, BuilderClassDragger classDragger, BuilderHierarchyDragger hierarchyDragger, BuilderElementContextMenu contextMenuManipulator, HighlightOverlayPainter highlightOverlayPainter) : base( viewport, selection, classDragger, hierarchyDragger, contextMenuManipulator, viewport.documentElement, highlightOverlayPainter, kToolbarPath) { viewDataKey = "builder-hierarchy"; m_HierarchyTypeClassVisibilityMenu = this.Q <ToolbarMenu>("hierarchy-visibility-toolbar-menu"); SetUpHierarchyVisibilityMenu(); }
public override void CreateUI() { var root = rootVisualElement; titleContent = GetLocalizedTitleContent(); saveChangesMessage = BuilderConstants.SaveDialogSaveChangesPromptMessage; // Load assets. var builderTemplate = BuilderPackageUtilities.LoadAssetAtPath <VisualTreeAsset>(BuilderConstants.UIBuilderPackagePath + "/Builder.uxml"); // Load templates. builderTemplate.CloneTree(root); // Create overlay painter. m_HighlightOverlayPainter = new HighlightOverlayPainter(); // Fetch the tooltip previews. var styleSheetsPaneTooltipPreview = root.Q <BuilderTooltipPreview>("stylesheets-pane-tooltip-preview"); var libraryTooltipPreview = root.Q <BuilderTooltipPreview>("library-tooltip-preview"); // Create selection. m_Selection = new BuilderSelection(root, this); // Create Element Context Menu Manipulator var contextMenuManipulator = new BuilderElementContextMenu(this, selection); // Create viewport first. m_Viewport = new BuilderViewport(this, selection, contextMenuManipulator); selection.documentRootElement = m_Viewport.documentRootElement; var overlayHelper = viewport.Q <OverlayPainterHelperElement>(); overlayHelper.painter = m_HighlightOverlayPainter; // Create the rest of the panes. var classDragger = new BuilderClassDragger(this, root, selection, m_Viewport, m_Viewport.parentTracker); var styleSheetsDragger = new BuilderStyleSheetsDragger(this, root, selection); var styleSheetsPane = new BuilderStyleSheets(this, m_Viewport, selection, classDragger, styleSheetsDragger, m_HighlightOverlayPainter, styleSheetsPaneTooltipPreview); var hierarchyDragger = new BuilderHierarchyDragger(this, root, selection, m_Viewport, m_Viewport.parentTracker) { builderStylesheetRoot = styleSheetsPane.container }; m_Hierarchy = new BuilderHierarchy(this, m_Viewport, selection, classDragger, hierarchyDragger, contextMenuManipulator, m_HighlightOverlayPainter); var libraryDragger = new BuilderLibraryDragger(this, root, selection, m_Viewport, m_Viewport.parentTracker, hierarchy.container, libraryTooltipPreview) { builderStylesheetRoot = styleSheetsPane.container }; m_Viewport.viewportDragger.builderHierarchyRoot = hierarchy.container; m_Library = new BuilderLibrary(this, m_Viewport, selection, libraryDragger, libraryTooltipPreview); m_Inspector = new BuilderInspector(this, selection, m_HighlightOverlayPainter); m_Toolbar = new BuilderToolbar(this, selection, m_Viewport, hierarchy, m_Library, m_Inspector, libraryTooltipPreview); m_UxmlPreview = new BuilderUxmlPreview(this); m_UssPreview = new BuilderUssPreview(this, selection); root.Q("viewport").Add(m_Viewport); m_Viewport.toolbar.Add(m_Toolbar); root.Q("library").Add(m_Library); root.Q("style-sheets").Add(styleSheetsPane); root.Q("hierarchy").Add(hierarchy); root.Q("uxml-preview").Add(m_UxmlPreview); root.Q("uss-preview").Add(m_UssPreview); root.Q("inspector").Add(m_Inspector); // Init selection. selection.AssignNotifiers(new IBuilderSelectionNotifier[] { document, m_Viewport, styleSheetsPane, hierarchy, m_Inspector, m_Library, m_UxmlPreview, m_UssPreview, m_Toolbar, m_Viewport.parentTracker, m_Viewport.resizer, m_Viewport.mover, m_Viewport.anchorer, m_Viewport.selectionIndicator }); // Command Handler commandHandler.RegisterPane(styleSheetsPane); commandHandler.RegisterPane(hierarchy); commandHandler.RegisterPane(m_Viewport); commandHandler.RegisterToolbar(m_Toolbar); m_MiddleSplitView = rootVisualElement.Q <TwoPaneSplitView>("middle-column"); m_MiddleSplitView.RegisterCallback <GeometryChangedEvent>(OnFirstDisplay); OnEnableAfterAllSerialization(); }
public BuilderStyleSheets( BuilderPaneWindow paneWindow, BuilderViewport viewport, BuilderSelection selection, BuilderClassDragger classDragger, BuilderStyleSheetsDragger styleSheetsDragger, HighlightOverlayPainter highlightOverlayPainter, BuilderTooltipPreview tooltipPreview) : base( paneWindow, viewport, selection, classDragger, styleSheetsDragger, new BuilderStyleSheetsContextMenu(paneWindow, selection), viewport.styleSelectorElementContainer, false, highlightOverlayPainter, kToolbarPath) { m_TooltipPreview = tooltipPreview; if (m_TooltipPreview != null) { var helpTooltipTemplate = BuilderPackageUtilities.LoadAssetAtPath <VisualTreeAsset>(kHelpTooltipPath); var helpTooltipContainer = helpTooltipTemplate.CloneTree(); m_TooltipPreview.Add(helpTooltipContainer); // We are the only ones using it so just add the contents and be done. } viewDataKey = "builder-style-sheets"; AddToClassList(BuilderConstants.ExplorerStyleSheetsPaneClassName); var parent = this.Q("new-selector-item"); // Init text field. m_NewSelectorField = parent.Q <BuilderNewSelectorField>("new-selector-field"); m_NewSelectorTextField = m_NewSelectorField.textField; m_NewSelectorTextField.SetValueWithoutNotify(BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage); m_NewSelectorTextInputField = m_NewSelectorTextField.Q("unity-text-input"); m_NewSelectorTextInputField.RegisterCallback <KeyDownEvent>(OnEnter, TrickleDown.TrickleDown); UpdateNewSelectorFieldEnabledStateFromDocument(); m_NewSelectorTextInputField.RegisterCallback <FocusEvent>((evt) => { var input = evt.target as VisualElement; var field = GetTextFieldParent(input); m_FieldFocusStep = FieldFocusStep.FocusedFromStandby; if (field.text == BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage || m_ShouldRefocusSelectorFieldOnBlur) { m_ShouldRefocusSelectorFieldOnBlur = false; field.value = BuilderConstants.UssSelectorClassNameSymbol; } ShowTooltip(); }, TrickleDown.TrickleDown); m_NewSelectorTextField.RegisterCallback <ChangeEvent <string> >((evt) => { if (m_FieldFocusStep != FieldFocusStep.FocusedFromStandby) { return; } m_FieldFocusStep = m_NewSelectorTextField.value == BuilderConstants.UssSelectorClassNameSymbol ? FieldFocusStep.NeedsSelectionOverride : FieldFocusStep.Idle; // We don't want the '.' we just inserted in the FocusEvent to be highlighted, // which is the default behavior. Same goes for when we add pseudo states with options menu. m_NewSelectorTextField.SelectRange(m_NewSelectorTextField.value.Length, m_NewSelectorTextField.value.Length); }); // Since MouseDown captures the mouse, we need to RegisterCallback directly on the target in order to intercept the event. // This could be replaced by setting selectAllOnMouseUp to false. m_NewSelectorTextInputField.Q <TextElement>().RegisterCallback <MouseUpEvent>((evt) => { // We want to prevent the default action on mouse up in KeyboardTextEditor, but only when // the field selection behaviour was changed by us. if (m_FieldFocusStep != FieldFocusStep.NeedsSelectionOverride) { return; } m_FieldFocusStep = FieldFocusStep.Idle; // Reselect on the next execution, after the KeyboardTextEditor selects all. m_NewSelectorTextInputField.schedule.Execute(() => { m_NewSelectorTextField.SelectRange(m_NewSelectorTextField.value.Length, m_NewSelectorTextField.value.Length); }); }, TrickleDown.TrickleDown); m_NewSelectorTextInputField.RegisterCallback <BlurEvent>((evt) => { var input = evt.target as VisualElement; var field = GetTextFieldParent(input); if (m_ShouldRefocusSelectorFieldOnBlur) { field.schedule.Execute(PostEnterRefocus); evt.PreventDefault(); evt.StopImmediatePropagation(); return; } if (string.IsNullOrEmpty(field.text) || field.text == BuilderConstants.UssSelectorClassNameSymbol) { field.SetValueWithoutNotify(BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage); m_PseudoStatesMenu.SetEnabled(false); } HideTooltip(); }, TrickleDown.TrickleDown); // Setup New USS Menu. m_AddUSSMenu = parent.Q <ToolbarMenu>("add-uss-menu"); SetUpAddUSSMenu(); // Setup pseudo states menu. m_PseudoStatesMenu = m_NewSelectorField.pseudoStatesMenu; // Update sub title. UpdateSubtitleFromActiveUSS(); // Init drag stylesheet root classDragger.builderStylesheetRoot = container; styleSheetsDragger.builderStylesheetRoot = container; RegisterCallback <GeometryChangedEvent>(e => AdjustPosition()); }
public ElementHierarchyView( VisualElement documentRootElement, BuilderSelection selection, BuilderClassDragger classDragger, BuilderHierarchyDragger hierarchyDragger, BuilderElementContextMenu contextMenuManipulator, Action <VisualElement> selectElementCallback, HighlightOverlayPainter highlightOverlayPainter) { m_DocumentRootElement = documentRootElement; m_Selection = selection; m_ClassDragger = classDragger; m_HierarchyDragger = hierarchyDragger; m_ContextMenuManipulator = contextMenuManipulator; this.focusable = true; m_SelectElementCallback = selectElementCallback; hierarchyHasChanged = true; m_SearchResultsHightlights = new List <VisualElement>(); this.RegisterCallback <FocusEvent>(e => m_TreeView?.Focus()); // HACK: ListView/TreeView need to clear their selections when clicking on nothing. this.RegisterCallback <MouseDownEvent>(e => { var leafTarget = e.leafTarget as VisualElement; if (leafTarget.parent is ScrollView) { ClearSelection(); } }); m_TreeViewHoverOverlay = highlightOverlayPainter; m_Container = new VisualElement(); m_Container.name = "explorer-container"; m_Container.style.flexGrow = 1; m_ClassDragger.builderHierarchyRoot = m_Container; m_HierarchyDragger.builderHierarchyRoot = m_Container; Add(m_Container); m_SearchBar = new ElementHierarchySearchBar(this); Add(m_SearchBar); // TODO: Hiding for now since search does not work, especially with style class pills. m_SearchBar.style.display = DisplayStyle.None; m_ClassPillTemplate = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>( BuilderConstants.UIBuilderPackagePath + "/BuilderClassPill.uxml"); // Create TreeView. m_TreeRootItems = new List <ITreeViewItem>(); m_TreeView = new TreeView(m_TreeRootItems, 20, MakeItem, FillItem); m_TreeView.viewDataKey = "unity-builder-explorer-tree"; m_TreeView.style.flexGrow = 1; #if UNITY_2020_1_OR_NEWER m_TreeView.onSelectionChange += OnSelectionChange; #else m_TreeView.onSelectionChanged += OnSelectionChange; #endif #if UNITY_2019_3_OR_NEWER m_TreeView.RegisterCallback <MouseDownEvent>(OnLeakedMouseClick); #endif m_Container.Add(m_TreeView); m_ContextMenuManipulator.RegisterCallbacksOnTarget(m_Container); }
public override void CreateUI() { var root = rootVisualElement; // Load assets. var builderTemplate = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>(BuilderConstants.UIBuilderPackagePath + "/Builder.uxml"); var saveDialogTemplate = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>(BuilderConstants.UIBuilderPackagePath + "/BuilderSaveDialog.uxml"); // Load templates. builderTemplate.CloneTree(root); saveDialogTemplate.CloneTree(root); // Create overlay painter. m_HighlightOverlayPainter = new HighlightOverlayPainter(); // Fetch the save dialog. var dialog = root.Q <ModalPopup>("save-dialog"); // Fetch the tooltip previews. var styleSheetsPaneTooltipPreview = root.Q <BuilderTooltipPreview>("stylesheets-pane-tooltip-preview"); var libraryTooltipPreview = root.Q <BuilderTooltipPreview>("library-tooltip-preview"); // Create selection. m_Selection = new BuilderSelection(root, this); // Create Element Context Menu Manipulator var contextMenuManipulator = new BuilderElementContextMenu(this, selection); // Create viewport first. m_Viewport = new BuilderViewport(this, selection, contextMenuManipulator); selection.documentElement = m_Viewport.documentElement; var overlayHelper = viewport.Q <OverlayPainterHelperElement>(); overlayHelper.painter = m_HighlightOverlayPainter; // Create the rest of the panes. var classDragger = new BuilderClassDragger(this, root, selection, m_Viewport, m_Viewport.parentTracker); var hierarchyDragger = new BuilderHierarchyDragger(this, root, selection, m_Viewport, m_Viewport.parentTracker); var styleSheetsPane = new BuilderStyleSheets(m_Viewport, selection, classDragger, hierarchyDragger, contextMenuManipulator, m_HighlightOverlayPainter, styleSheetsPaneTooltipPreview); var hierarchy = new BuilderHierarchy(m_Viewport, selection, classDragger, hierarchyDragger, contextMenuManipulator, m_HighlightOverlayPainter); var libraryDragger = new BuilderLibraryDragger(this, root, selection, m_Viewport, m_Viewport.parentTracker, hierarchy.container, libraryTooltipPreview); m_Library = new BuilderLibrary(this, m_Viewport, selection, libraryDragger, libraryTooltipPreview); m_Inspector = new BuilderInspector(this, selection); m_Toolbar = new BuilderToolbar(this, selection, dialog, m_Viewport, hierarchy, m_Library, m_Inspector, libraryTooltipPreview); m_UxmlPreview = new BuilderUxmlPreview(this); m_UssPreview = new BuilderUssPreview(this); root.Q("viewport").Add(m_Viewport); m_Viewport.toolbar.Add(m_Toolbar); root.Q("library").Add(m_Library); root.Q("style-sheets").Add(styleSheetsPane); root.Q("hierarchy").Add(hierarchy); root.Q("uxml-preview").Add(m_UxmlPreview); root.Q("uss-preview").Add(m_UssPreview); root.Q("inspector").Add(m_Inspector); // Init selection. selection.AssignNotifiers(new IBuilderSelectionNotifier[] { document, m_Viewport, styleSheetsPane, hierarchy, m_Inspector, m_UxmlPreview, m_UssPreview, m_Viewport.parentTracker, m_Viewport.resizer, m_Viewport.mover, m_Viewport.anchorer }); // Command Handler commandHandler.RegisterPane(styleSheetsPane); commandHandler.RegisterPane(hierarchy); commandHandler.RegisterPane(m_Viewport); commandHandler.RegisterToolbar(m_Toolbar); OnEnableAfterAllSerialization(); }
public BuilderStyleSheets( BuilderViewport viewport, BuilderSelection selection, BuilderClassDragger classDragger, BuilderHierarchyDragger hierarchyDragger, BuilderExplorerContextMenu contextMenuManipulator, HighlightOverlayPainter highlightOverlayPainter, BuilderTooltipPreview tooltipPreview) : base( viewport, selection, classDragger, hierarchyDragger, contextMenuManipulator, viewport.styleSelectorElementContainer, highlightOverlayPainter, kToolbarPath) { m_TooltipPreview = tooltipPreview; if (m_TooltipPreview != null) { var helpTooltipTemplate = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>(kHelpTooltipPath); var helpTooltipContainer = helpTooltipTemplate.CloneTree(); m_TooltipPreview.Add(helpTooltipContainer); // We are the only ones using it so just add the contents and be done. } viewDataKey = "builder-style-sheets"; AddToClassList(BuilderConstants.ExplorerStyleSheetsPaneClassName); var parent = this.Q("new-selector-item"); // Init text field. m_NewSelectorTextField = parent.Q <TextField>("new-selector-field"); m_NewSelectorTextField.SetValueWithoutNotify(BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage); m_NewSelectorTextInputField = m_NewSelectorTextField.Q("unity-text-input"); m_NewSelectorTextInputField.RegisterCallback <KeyDownEvent>(OnEnter, TrickleDown.TrickleDown); m_NewSelectorTextInputField.RegisterCallback <FocusEvent>((evt) => { var input = evt.target as VisualElement; var field = input.parent as TextField; m_FieldFocusedFromStandby = true; if (field.text == BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage || m_NewSelectorJustCreated) { m_NewSelectorJustCreated = false; field.value = BuilderConstants.UssSelectorClassNameSymbol; } ShowTooltip(); }); m_NewSelectorTextField.RegisterCallback <ChangeEvent <string> >((evt) => { var field = evt.target as TextField; if (!string.IsNullOrEmpty(evt.newValue) && evt.newValue != BuilderConstants.UssSelectorClassNameSymbol) { m_NewSelectorAddButton.SetEnabled(true); m_PseudoStatesMenu.SetEnabled(true); } else { m_NewSelectorAddButton.SetEnabled(false); m_PseudoStatesMenu.SetEnabled(false); } if (!m_FieldFocusedFromStandby) { return; } m_FieldFocusedFromStandby = false; // We don't want the '.' we just inserted in the FocusEvent to be highlighted, // which is the default behavior. field.SelectRange(1, 1); }); m_NewSelectorTextInputField.RegisterCallback <BlurEvent>((evt) => { var input = evt.target as VisualElement; var field = input.parent as TextField; if (m_NewSelectorJustCreated) { field.schedule.Execute(PostEnterRefocus); evt.PreventDefault(); evt.StopImmediatePropagation(); return; } if (string.IsNullOrEmpty(field.text) || field.text == BuilderConstants.UssSelectorClassNameSymbol) { field.SetValueWithoutNotify(BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage); m_NewSelectorAddButton.SetEnabled(false); m_PseudoStatesMenu.SetEnabled(false); } HideTooltip(); }); // Setup new selector button. m_NewSelectorAddButton = parent.Q <ToolbarButton>("add-new-selector-button"); m_NewSelectorAddButton.clickable.clicked += OnAddPress; m_NewSelectorAddButton.SetEnabled(false); // Setup pseudo states menu. m_PseudoStatesMenu = parent.Q <ToolbarMenu>("add-pseudo-state-menu"); m_PseudoStatesMenu.SetEnabled(false); SetUpPseudoStatesMenu(); }
public BuilderStyleSheets( BuilderPaneWindow paneWindow, BuilderViewport viewport, BuilderSelection selection, BuilderClassDragger classDragger, BuilderStyleSheetsDragger styleSheetsDragger, HighlightOverlayPainter highlightOverlayPainter, BuilderTooltipPreview tooltipPreview) : base( paneWindow, viewport, selection, classDragger, styleSheetsDragger, new BuilderStyleSheetsContextMenu(paneWindow, selection), viewport.styleSelectorElementContainer, false, highlightOverlayPainter, kToolbarPath) { m_TooltipPreview = tooltipPreview; if (m_TooltipPreview != null) { var helpTooltipTemplate = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>(kHelpTooltipPath); var helpTooltipContainer = helpTooltipTemplate.CloneTree(); m_TooltipPreview.Add(helpTooltipContainer); // We are the only ones using it so just add the contents and be done. } viewDataKey = "builder-style-sheets"; AddToClassList(BuilderConstants.ExplorerStyleSheetsPaneClassName); var parent = this.Q("new-selector-item"); // Init text field. m_NewSelectorField = parent.Q <BuilderNewSelectorField>("new-selector-field"); m_NewSelectorTextField = m_NewSelectorField.textField; m_NewSelectorTextField.SetValueWithoutNotify(BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage); m_NewSelectorTextInputField = m_NewSelectorTextField.Q("unity-text-input"); m_NewSelectorTextInputField.RegisterCallback <KeyDownEvent>(OnEnter, TrickleDown.TrickleDown); UpdateNewSelectorFieldEnabledStateFromDocument(); m_NewSelectorTextInputField.RegisterCallback <FocusEvent>((evt) => { var input = evt.target as VisualElement; var field = input.parent as TextField; m_FieldFocusedFromStandby = true; if (field.text == BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage || m_ShouldRefocusSelectorFieldOnBlur) { m_ShouldRefocusSelectorFieldOnBlur = false; field.value = BuilderConstants.UssSelectorClassNameSymbol; } ShowTooltip(); }); m_NewSelectorTextField.RegisterCallback <ChangeEvent <string> >((evt) => { var field = evt.target as TextField; if (!m_FieldFocusedFromStandby) { return; } m_FieldFocusedFromStandby = false; // We don't want the '.' we just inserted in the FocusEvent to be highlighted, // which is the default behavior. field.SelectRange(1, 1); }); m_NewSelectorTextInputField.RegisterCallback <BlurEvent>((evt) => { var input = evt.target as VisualElement; var field = input.parent as TextField; if (m_ShouldRefocusSelectorFieldOnBlur) { field.schedule.Execute(PostEnterRefocus); evt.PreventDefault(); evt.StopImmediatePropagation(); return; } if (string.IsNullOrEmpty(field.text) || field.text == BuilderConstants.UssSelectorClassNameSymbol) { field.SetValueWithoutNotify(BuilderConstants.ExplorerInExplorerNewClassSelectorInfoMessage); m_PseudoStatesMenu.SetEnabled(false); } HideTooltip(); }); // Setup New USS Menu. m_AddUSSMenu = parent.Q <ToolbarMenu>("add-uss-menu"); SetUpAddUSSMenu(); // Setup pseudo states menu. m_PseudoStatesMenu = m_NewSelectorField.pseudoStatesMenu; // Update sub title. UpdateSubtitleFromActiveUSS(); }
public ElementHierarchyView( BuilderPaneWindow paneWindow, VisualElement documentRootElement, BuilderSelection selection, BuilderClassDragger classDragger, BuilderExplorerDragger explorerDragger, BuilderElementContextMenu contextMenuManipulator, Action <List <VisualElement> > selectElementCallback, HighlightOverlayPainter highlightOverlayPainter) { m_PaneWindow = paneWindow; m_DocumentRootElement = documentRootElement; m_Selection = selection; m_ClassDragger = classDragger; m_ExplorerDragger = explorerDragger; m_ContextMenuManipulator = contextMenuManipulator; this.focusable = true; m_SelectElementCallback = selectElementCallback; hierarchyHasChanged = true; hasUnsavedChanges = false; m_SearchResultsHightlights = new List <VisualElement>(); this.RegisterCallback <FocusEvent>(e => m_TreeView?.Focus()); // HACK: ListView/TreeView need to clear their selections when clicking on nothing. this.RegisterCallback <MouseDownEvent>(e => { var leafTarget = e.leafTarget as VisualElement; if (leafTarget.parent is ScrollView) { ClearSelection(); } }); m_TreeViewHoverOverlay = highlightOverlayPainter; m_Container = new VisualElement(); m_Container.name = "explorer-container"; m_Container.style.flexGrow = 1; m_ClassDragger.builderHierarchyRoot = m_Container; m_ExplorerDragger.builderHierarchyRoot = m_Container; Add(m_Container); m_ClassPillTemplate = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>( BuilderConstants.UIBuilderPackagePath + "/BuilderClassPill.uxml"); // Create TreeView. m_TreeRootItems = new List <ITreeViewItem>(); m_TreeView = new TreeView(m_TreeRootItems, 20, MakeItem, FillItem); #if UNITY_2020_1_OR_NEWER m_TreeView.selectionType = SelectionType.Multiple; #else m_TreeView.selectionType = SelectionType.Single; // ListView/TreeView do not support selecting mutliple items via code. #endif m_TreeView.viewDataKey = "unity-builder-explorer-tree"; m_TreeView.style.flexGrow = 1; #if UNITY_2020_1_OR_NEWER m_TreeView.onSelectionChange += OnSelectionChange; #else m_TreeView.onSelectionChanged += OnSelectionChange; #endif #if UNITY_2019_3_OR_NEWER m_TreeView.RegisterCallback <MouseDownEvent>(OnLeakedMouseClick); #endif m_Container.Add(m_TreeView); m_ContextMenuManipulator.RegisterCallbacksOnTarget(m_Container); }
public ElementHierarchyView( BuilderPaneWindow paneWindow, VisualElement documentRootElement, BuilderSelection selection, BuilderClassDragger classDragger, BuilderExplorerDragger explorerDragger, BuilderElementContextMenu contextMenuManipulator, Action <List <VisualElement> > selectElementCallback, HighlightOverlayPainter highlightOverlayPainter) { m_PaneWindow = paneWindow; m_DocumentRootElement = documentRootElement; m_Selection = selection; m_ClassDragger = classDragger; m_ExplorerDragger = explorerDragger; m_ContextMenuManipulator = contextMenuManipulator; this.focusable = true; m_SelectElementCallback = selectElementCallback; hierarchyHasChanged = true; hasUnsavedChanges = false; m_SearchResultsHightlights = new List <VisualElement>(); this.RegisterCallback <FocusEvent>(e => m_TreeView?.Focus()); // HACK: ListView/TreeView need to clear their selections when clicking on nothing. this.RegisterCallback <MouseDownEvent>(e => { var leafTarget = e.leafTarget as VisualElement; if (leafTarget.parent is ScrollView) { m_PaneWindow.primarySelection.ClearSelection(null); } }); m_TreeViewHoverOverlay = highlightOverlayPainter; m_Container = new VisualElement(); m_Container.name = "explorer-container"; m_Container.style.flexGrow = 1; m_ClassDragger.builderHierarchyRoot = m_Container; m_ExplorerDragger.builderHierarchyRoot = m_Container; Add(m_Container); m_ClassPillTemplate = BuilderPackageUtilities.LoadAssetAtPath <VisualTreeAsset>( BuilderConstants.UIBuilderPackagePath + "/BuilderClassPill.uxml"); // Create TreeView. m_TreeRootItems = new List <TreeViewItem>(); m_TreeView = new TreeView(20, MakeItem, FillItem); m_TreeView.SetRootItems(m_TreeRootItems); m_TreeViewController = m_TreeView.viewController as DefaultTreeViewController <VisualElement>; m_TreeView.selectionType = SelectionType.Multiple; m_TreeView.viewDataKey = "unity-builder-explorer-tree"; m_TreeView.style.flexGrow = 1; m_TreeView.onSelectedIndicesChange += OnSelectionChange; m_TreeView.RegisterCallback <MouseDownEvent>(OnLeakedMouseClick); m_Container.Add(m_TreeView); m_ContextMenuManipulator.RegisterCallbacksOnTarget(m_Container); }