private void refreshTree() { var treeView = _treeView; if (treeView == null) { return; } var root = new AGSTreeStringNode { Text = "" }; List <ITreeStringNode> toExpand = new List <ITreeStringNode>(); foreach (var pair in _props.OrderBy(p => p.Key.Z).ThenBy(p => p.Key.Name)) { ITreeStringNode cat = addToTree(pair.Key.Name, root); foreach (var prop in pair.Value.OrderBy(p => p.Name)) { addToTree(cat, prop); } if (pair.Key.Expand) { toExpand.Add(cat); } } treeView.Tree = root; treeView.Expand(root); foreach (var node in toExpand) { treeView.Expand(node); } }
public ITreeNodeView CreateNode(ITreeStringNode item, IRenderLayer layer) { var buttonWidth = 20f; var buttonHeight = 60f; var idle = new ButtonAnimation(new EmptyImage(buttonWidth, buttonHeight)); idle.Tint = Colors.Black; var hovered = new ButtonAnimation(new EmptyImage(buttonWidth, buttonHeight)); hovered.Tint = Colors.Yellow; var pushed = new ButtonAnimation(new EmptyImage(buttonWidth, buttonHeight)); pushed.Tint = Colors.DarkSlateBlue; int nodeId = Interlocked.Increment(ref _nextNodeId); var itemTextId = (item.Text ?? "") + "_" + nodeId; var parentPanel = _factory.UI.GetPanel("TreeNodeParentPanel_" + itemTextId, 0f, 0f, 0f, 0f, addToUi: false); var horizontalPanel = _factory.UI.GetPanel("TreeNodeHorizontalPanel_" + itemTextId, 0f, 0f, 0f, 0f, parentPanel, false); var expandButton = _factory.UI.GetButton("ExpandButton_" + itemTextId, idle, hovered, pushed, 0f, 0f, horizontalPanel, addToUi: false); var label = _factory.UI.GetLabel("TreeNodeLabel_" + itemTextId, item.Text, 0f, 0f, buttonWidth, 0f, horizontalPanel, new AGSTextConfig(paddingTop: 0f, paddingBottom: 0f, autoFit: AutoFit.LabelShouldFitText), addToUi: false); var verticalPanel = _factory.UI.GetPanel("TreeNodeVerticalPanel_" + itemTextId, 0f, 0f, 0f, 0f, parentPanel, false); horizontalPanel.RenderLayer = layer; verticalPanel.RenderLayer = layer; parentPanel.RenderLayer = layer; expandButton.RenderLayer = layer; label.RenderLayer = layer; expandButton.Z = label.Z - 1; horizontalPanel.Tint = Colors.Transparent; parentPanel.Tint = Colors.Transparent; verticalPanel.Tint = Colors.Transparent; expandButton.Tint = Colors.Transparent; expandButton.TextBackgroundVisible = false; label.Tint = Colors.Transparent; label.TextBackgroundVisible = false; label.Enabled = true; expandButton.IsPixelPerfect = false; horizontalPanel.AddComponent <IBoundingBoxWithChildrenComponent>(); var layout = horizontalPanel.AddComponent <IStackLayoutComponent>(); layout.RelativeSpacing = 1f; layout.Direction = LayoutDirection.Horizontal; layout.StartLayout(); PropertyChangedEventHandler onPropertyChanged = (sender, e) => { if (e.PropertyName != nameof(ITreeStringNode.Text)) { return; } label.Text = item.Text; }; item.PropertyChanged += onPropertyChanged; label.OnDisposed(() => item.PropertyChanged -= onPropertyChanged); var nodeView = new AGSTreeNodeView(label, expandButton, parentPanel, verticalPanel, horizontalPanel); return(nodeView); }
public void BeforeDisplayingNode(ITreeStringNode item, ITreeNodeView nodeView, bool isCollapsed, bool isHovered, bool isSelected) { var textConfig = isHovered ? item.HoverTextConfig : item.IdleTextConfig; var label = nodeView.TreeItem as ITextComponent; if (label != null) { label.TextConfig = textConfig; label.Text = item.Text; label.TextBackgroundVisible = isSelected; item.PropertyChanged += (sender, e) => { if (e.PropertyName != nameof(ITreeStringNode.Text)) { return; } label.Text = item.Text; }; } nodeView.TreeItem.Tint = isSelected ? Colors.DarkSlateBlue : Colors.Transparent; var expandButton = nodeView.ExpandButton; if (expandButton != null) { expandButton.TextConfig = textConfig; expandButton.Text = isCollapsed ? "+" : "-"; expandButton.TextVisible = item.TreeNode.ChildrenCount > 0; expandButton.Enabled = expandButton.TextVisible; } }
public ITreeNodeView CreateNode(ITreeStringNode item, IRenderLayer layer) { var view = _provider.CreateNode(item, layer); var node = item as IInspectorTreeNode; if (node == null) { return(view); } var layout = view.HorizontalPanel.GetComponent <IStackLayoutComponent>(); layout.AbsoluteSpacing = 10f; int nodeId = Interlocked.Increment(ref _nextNodeId); var itemTextId = (item.Text ?? "") + "_" + nodeId; node.Editor.AddEditorUI("InspectorEditor_" + itemTextId, view, node.Property); var propertyChanged = node.Property.Object as INotifyPropertyChanged; if (propertyChanged != null) { propertyChanged.PropertyChanged += (sender, e) => { if (e.PropertyName != node.Property.Name) { return; } node.Property.Refresh(); node.Editor.RefreshUI(); }; } return(view); }
private void onTreeNodeSelected(NodeEventArgs args) { if (args.Node == _lastSelectedNode) { return; } Unselect(); _lastSelectedNode = args.Node; if (args.Node.Text == _settingsPrefix) { _inspector.Show(_editor.Game.Settings); return; } string nodeType = args.Node.Properties.Strings.GetValue(Fields.Type); if (nodeType == null) { return; } switch (nodeType) { case NodeType.Object: selectObject(args.Node); break; case NodeType.Area: selectArea(args.Node); break; } }
private void removeFromTree(string id, ITreeStringNode parent) { _addedObjects.Remove(id); var node = parent.TreeNode.Children.FirstOrDefault(c => c.Text == id); node?.TreeNode.SetParent(null); }
private void refresh() { _addedObjects.Clear(); var root = addToTree("Game", null); addToTree(_settingsPrefix, root); var ui = addToTree(_uiPrefix, root); var state = _editor.Game.State; foreach (var obj in state.UI) { addObjectToTree(getRoot(obj), ui); } addRoomToTree(state.Room, root); _moreRoomsNode = addToTree(_moreRoomsPrefix, root); foreach (var room in state.Rooms) { if (room == state.Room) { continue; } addRoomToTree(room, _moreRoomsNode); } _treeView.Tree = root; }
private void onTreeNodeSelected(NodeEventArgs args) { if (args.Node == _lastSelectedNode) { return; } Unselect(); _lastSelectedNode = args.Node; string nodeType = args.Node.Properties.Strings.GetValue(Fields.Type); if (nodeType == null) { return; } switch (nodeType) { case NodeType.Object: selectObject(args.Node); break; case NodeType.Area: selectArea(args.Node); break; } }
private void addChildrenToTree(ITreeStringNode node, IProperty prop) { foreach (var child in prop.Children) { addToTree(node, child); } }
public void BeforeDisplayingNode(ITreeStringNode item, ITreeNodeView nodeView, bool isCollapsed, bool isHovered, bool isSelected) { var textConfig = isHovered ? item.HoverTextConfig : item.IdleTextConfig; var label = nodeView.TreeItem as ITextComponent; if (label != null) { label.TextConfig = textConfig; label.Text = item.Text; label.TextBackgroundVisible = isSelected; } nodeView.TreeItem.Tint = isSelected ? Colors.DarkSlateBlue : Colors.Transparent; var expandButton = nodeView.ExpandButton; if (expandButton != null) { var expandTextConfig = textConfig; if (item.TreeNode.ChildrenCount == 0) { expandTextConfig = AGSTextConfig.ChangeColor(textConfig, textConfig.Brush.Color.WithAlpha(0), textConfig.OutlineBrush.Color, textConfig.OutlineWidth); } expandButton.TextConfig = expandTextConfig; expandButton.Text = isCollapsed ? "+" : "-"; expandButton.Enabled = expandButton.TextVisible; } }
private ITreeStringNode addReadonlyNodeToTree(IProperty property, ITreeStringNode parent) { IInspectorPropertyEditor editor = new StringPropertyEditor(_factory, false, _actions, _model); ITreeStringNode node = new InspectorTreeNode(property, editor, _font); addToTree(node, parent); if (property.Object is INotifyPropertyChanged propertyChanged) { PropertyChangedEventHandler onPropertyChanged = (sender, e) => { if (e.PropertyName != property.Name) { return; } bool isExpanded = _treeView.IsCollapsed(node) == false; if (isExpanded) { _treeView.Collapse(node); } ObjectTypeDescriptor.RefreshChildrenProperties(property); node.TreeNode.Children.Clear(); addChildrenToTree(node, property); //todo: we'd like to enable expanding a node that was previously expanded however there's a bug that needs to be investigated before that, to reproduce: //In the demo game, show the inspector for the character and expand its current room. Then move to another room. //For some reason this results in endless boundin box/matrix changes until stack overflow is reached. //if (isExpanded) // _treeView.Expand(node); }; propertyChanged.PropertyChanged += onPropertyChanged; _cleanup.Add(() => propertyChanged.PropertyChanged -= onPropertyChanged); } return(node); }
private void refreshTree() { var treeView = _treeView; if (treeView == null) { return; } var root = new AGSTreeStringNode("", _font); List <ITreeStringNode> toExpand = new List <ITreeStringNode>(); bool skipCategories = _props.Count == 1; foreach (var pair in _props.OrderBy(p => p.Key.Z).ThenBy(p => p.Key.Name)) { ITreeStringNode cat = skipCategories ? root : addToTree(pair.Key.Name, root); IEnumerable <IProperty> values = SortValues ? pair.Value.OrderBy(p => p.Name) : (IEnumerable <IProperty>)pair.Value; foreach (var prop in values) { addToTree(cat, prop); } if (pair.Key.Expand) { toExpand.Add(cat); } } treeView.Tree = root; treeView.Expand(root); foreach (var node in toExpand) { treeView.Expand(node); } }
private ITreeStringNode addReadonlyNodeToTree(InspectorProperty property, ITreeStringNode parent) { var node = addToTree(getReadonlyNodeText(property), parent); var propertyChanged = property.Object as INotifyPropertyChanged; if (propertyChanged != null) { propertyChanged.PropertyChanged += (sender, e) => { if (e.PropertyName != property.Name) { return; } bool isExpanded = _treeView.IsCollapsed(node) == false; if (isExpanded) { _treeView.Collapse(node); } property.Refresh(); node.Text = getReadonlyNodeText(property); refreshChildrenProperties(property); node.TreeNode.Children.Clear(); addChildrenToTree(node, property); //todo: we'd like to enable expanding a node that was previously expanded however there's a bug that needs to be investigated before that, to reproduce: //In the demo game, show the inspector for the character and expand its current room. Then move to another room. //For some reason this results in endless boundin box/matrix changes until stack overflow is reached. //if (isExpanded) // _treeView.Expand(node); }; } return(node); }
public void Unselect() { if (_lastSelectedNode == null) { return; } _lastSelectedNode = null; _lastSelectedEntity?.GetComponent <EntityDesigner>()?.Dispose(); _lastSelectedEntity?.RemoveComponent <EntityDesigner>(); var lastSelectedMaskVisible = _lastSelectedMaskVisible; var lastSelectedMaskImage = _lastSelectedMaskImage; var lastEnabled = _lastEnabled; if (lastSelectedMaskVisible != null) { lastSelectedMaskVisible.Visible = _lastMaskVisible; } if (lastSelectedMaskImage != null) { lastSelectedMaskImage.Opacity = _lastOpacity; } if (_lastSelectedEnabled != null) { _lastSelectedEnabled.Enabled = lastEnabled; _lastSelectedEnabled.ClickThrough = _lastClickThrough; } _lastSelectedEnabled = null; _lastMaskVisible = false; _lastOpacity = 0; }
private ITreeStringNode addToTree(string text, ITreeStringNode parent) { ITreeStringNode node = (ITreeStringNode) new AGSTreeStringNode { Text = text }; return(addToTree(node, parent)); }
private void addAreaToTree(IArea area, ITreeStringNode parent) { var node = addToTree(area.ID, parent); node.Properties.Strings.SetValue(Fields.Type, NodeType.Area); node.Properties.Entities.SetValue(Fields.Entity, area); _entitiesToNodes[area.ID] = node; }
private ITreeStringNode addToTree(ITreeStringNode node, ITreeStringNode parent) { if (parent != null) { node.TreeNode.SetParent(parent.TreeNode); } return(node); }
public void BeforeDisplayingNode(ITreeStringNode item, ITreeNodeView nodeView, bool isCollapsed, bool isHovered, bool isSelected) { isHovered |= item.Properties.Bools.GetValue(FOLDER_HOVERED); _inner.BeforeDisplayingNode(item, nodeView, isCollapsed, isHovered, isSelected); var folderIcon = (ILabel)nodeView.ExpandButton.TreeNode.Children.First(c => c.ID.StartsWith("FolderIcon", StringComparison.InvariantCulture)); folderIcon.Text = isSelected ? FontIcons.FolderOpen : FontIcons.Folder; folderIcon.TextConfig.Brush = isHovered ? GameViewColors.HoveredTextBrush : GameViewColors.TextBrush; }
private ITreeStringNode addToTree(string text, ITreeStringNode parent) { var node = new AGSTreeStringNode(text, _editor.Editor.Settings.Defaults.Fonts.Text); if (parent != null) { node.TreeNode.SetParent(parent.TreeNode); } return(node); }
public void BeforeDisplayingNode(ITreeStringNode item, ITreeNodeView nodeView, bool isCollapsed, bool isHovered, bool isSelected) { _provider.BeforeDisplayingNode(item, nodeView, isCollapsed, isHovered, isSelected); var parent = item.TreeNode.Parent; if (parent != null && parent.TreeNode.Parent == null) { displayCategoryRow(nodeView, isSelected); } }
private ITreeStringNode createFeaturesLabel(string text, ITreeStringNode parent, Func <IFeaturesPanel> panel = null) { var node = new AGSTreeStringNode(text, null); if (parent != null) { node.TreeNode.SetParent(parent.TreeNode); } _panels[text] = panel == null ? null : new Lazy <IFeaturesPanel>(panel); return(node); }
private ITreeStringNode addToTree(string text, ITreeStringNode parent) { var node = new AGSTreeStringNode { Text = text }; if (parent != null) { node.TreeNode.SetParent(parent.TreeNode); } return(node); }
private ITreeStringNode addToTree(IProperty property, ITreeStringNode parent) { if (property.IsReadonly) { return(addReadonlyNodeToTree(property, parent)); } var propType = property.PropertyType; var editor = _editorProvider.GetEditor(propType, _currentEntity); ITreeStringNode node = new InspectorTreeNode(property, editor, _font); return(addToTree(node, parent)); }
public ITreeNodeView CreateNode(ITreeStringNode item, IRenderLayer layer) { var view = _provider.CreateNode(item, layer); var parent = item.TreeNode.Parent; var node = item as IInspectorTreeNode; if (parent != null && node == null) { setupCategoryRow(view); } else if (parent != null && node != null) { var layoutId = parent.Properties.Strings.GetValue("LayoutID", Guid.NewGuid().ToString()); var tableLayout = _layouts.GetOrAdd(layoutId, () => new TreeTableLayout(_gameEvents) { ColumnPadding = 20f }); view.ParentPanel.OnDisposed(() => tableLayout.Dispose()); view.HorizontalPanel.RemoveComponent <IStackLayoutComponent>(); var rowLayout = view.HorizontalPanel.AddComponent <ITreeTableRowLayoutComponent>(); rowLayout.FixedWidthOverrides[0] = 15f; //fixed width for the expand button, as the column padding is too much for it rowLayout.Table = tableLayout; } if (node == null) { return(view); } int nodeId = Interlocked.Increment(ref _nextNodeId); var itemTextId = (item.Text ?? "") + "_" + nodeId; node.Editor.AddEditorUI($"{EDITOR_PREFIX}{itemTextId}", view, node.Property); if (node.Property.Object is INotifyPropertyChanged propertyChanged) { PropertyChangedEventHandler onPropertyChanged = (sender, e) => { if (e.PropertyName != node.Property.Name) { return; } node.Property.Refresh(); node.Editor.RefreshUI(); }; propertyChanged.PropertyChanged += onPropertyChanged; view.ParentPanel.OnDisposed(() => propertyChanged.PropertyChanged -= onPropertyChanged); } return(view); }
public ITreeNodeView CreateNode(ITreeStringNode item, IRenderLayer layer) { var view = _provider.CreateNode(item, layer); var parent = item.TreeNode.Parent; if (parent != null && parent.TreeNode.Parent == null) { setupCategoryRow(view); } else if (parent != null && parent.TreeNode.Parent != null) { var layoutId = parent.Properties.Strings.GetValue("LayoutID", Guid.NewGuid().ToString()); var tableLayout = _layouts.GetOrAdd(layoutId, () => new TreeTableLayout(_gameEvents) { ColumnPadding = 20f }); view.HorizontalPanel.RemoveComponent <IStackLayoutComponent>(); var rowLayout = view.HorizontalPanel.AddComponent <ITreeTableRowLayoutComponent>(); rowLayout.Table = tableLayout; } var node = item as IInspectorTreeNode; if (node == null) { return(view); } int nodeId = Interlocked.Increment(ref _nextNodeId); var itemTextId = (item.Text ?? "") + "_" + nodeId; node.Editor.AddEditorUI("InspectorEditor_" + itemTextId, view, node.Property); var propertyChanged = node.Property.Object as INotifyPropertyChanged; if (propertyChanged != null) { propertyChanged.PropertyChanged += (sender, e) => { if (e.PropertyName != node.Property.Name) { return; } node.Property.Refresh(); node.Editor.RefreshUI(); }; } return(view); }
public void BeforeDisplayingNode(ITreeStringNode item, ITreeNodeView nodeView, bool isCollapsed, bool isHovered, bool isSelected) { _provider.BeforeDisplayingNode(item, nodeView, isCollapsed, isHovered, isSelected); var parent = item.TreeNode.Parent; if (parent == null) { return; } if (item is IInspectorTreeNode node && !node.IsCategory) { return; } displayCategoryRow(nodeView, isSelected); }
private void addObjectToTree(IObject obj, ITreeStringNode parent) { if (obj == null || !_addedObjects.Add(obj.ID)) { return; } var node = addToTree(obj.ID, parent); node.Properties.Strings.SetValue(Fields.Type, NodeType.Object); node.Properties.Entities.SetValue(Fields.Entity, obj); foreach (var child in obj.TreeNode.Children) { addObjectToTree(child, node); } }
private void selectArea(ITreeStringNode node) { var obj = node.Properties.Entities.GetValue(Fields.Entity); _inspector.Show(obj); var area = obj.GetComponent <IAreaComponent>(); var debugMask = area.Mask.DebugDraw; if (debugMask != null) { _lastMaskVisible = debugMask.Visible; _lastSelectedMaskVisible = debugMask; debugMask.Visible = true; } }
public ITreeNodeView CreateNode(ITreeStringNode item, IRenderLayer layer) { var buttonWidth = 20f; var buttonHeight = 60f; IAnimation idle = new AGSSingleFrameAnimation(new EmptyImage(buttonWidth, buttonHeight), _factory.Graphics); idle.Sprite.Tint = Colors.Black; IAnimation hovered = new AGSSingleFrameAnimation(new EmptyImage(buttonWidth, buttonHeight), _factory.Graphics); hovered.Sprite.Tint = Colors.Yellow; IAnimation pushed = new AGSSingleFrameAnimation(new EmptyImage(buttonWidth, buttonHeight), _factory.Graphics); pushed.Sprite.Tint = Colors.DarkSlateBlue; int nodeId = Interlocked.Increment(ref _nextNodeId); var itemTextId = (item.Text ?? "") + "_" + nodeId; var parentPanel = _factory.UI.GetPanel("TreeNodeParentPanel_" + itemTextId, 0f, 0f, 0f, 0f, addToUi: false); var horizontalPanel = _factory.UI.GetPanel("TreeNodeHorizontalPanel_" + itemTextId, 0f, 0f, 0f, 0f, parentPanel, false); var expandButton = _factory.UI.GetButton("ExpandButton_" + itemTextId, idle, hovered, pushed, 0f, 0f, horizontalPanel, addToUi: false); var label = _factory.UI.GetLabel("TreeNodeLabel_" + itemTextId, item.Text, 0f, 0f, buttonWidth, 0f, horizontalPanel, new AGSTextConfig(paddingTop: 0f, paddingBottom: 0f, autoFit: AutoFit.LabelShouldFitText), addToUi: false); var verticalPanel = _factory.UI.GetPanel("TreeNodeVerticalPanel_" + itemTextId, 0f, 0f, 0f, 0f, parentPanel, false); horizontalPanel.RenderLayer = layer; verticalPanel.RenderLayer = layer; parentPanel.RenderLayer = layer; expandButton.RenderLayer = layer; label.RenderLayer = layer; expandButton.Z = label.Z - 1; horizontalPanel.Tint = Colors.Transparent; parentPanel.Tint = Colors.Transparent; verticalPanel.Tint = Colors.Transparent; expandButton.Tint = Colors.Transparent; expandButton.TextBackgroundVisible = false; label.Tint = Colors.Transparent; label.TextBackgroundVisible = false; label.Enabled = true; expandButton.PixelPerfect(false); horizontalPanel.AddComponent <IBoundingBoxWithChildrenComponent>(); var layout = horizontalPanel.AddComponent <IStackLayoutComponent>(); layout.RelativeSpacing = 1f; layout.Direction = LayoutDirection.Horizontal; layout.StartLayout(); var nodeView = new AGSTreeNodeView(label, expandButton, parentPanel, verticalPanel, horizontalPanel); return(nodeView); }
private void addRoomToTree(IRoom room, ITreeStringNode parent) { var roomNode = addToTree($"Room: {room.ID}", parent); var objects = addToTree("Objects", roomNode); var areas = addToTree("Areas", roomNode); addObjectToTree(getRoot(room.Background), objects); foreach (var obj in room.Objects) { addObjectToTree(getRoot(obj), objects); } foreach (var area in room.Areas) { var node = addToTree(area.ID, areas); node.Properties.Strings.SetValue(Fields.Type, NodeType.Area); node.Properties.Entities.SetValue(Fields.Entity, area); } }