public void BuildTree(Entity target, TreeNode parent) { var thisEntityNode = parent.AddSubNode(target.Tag); thisEntityNode.TouchDown += (s, a) => { _entityEditWidget = CreateEditWidget(target); _editorScrollPane.Content = _entityEditWidget; }; foreach (var(_, component) in target.Components) { var componentNode = thisEntityNode.AddSubNode(component.GetType().Name); componentNode.TouchDown += (s, a) => { if (component is BrainComponent) { _editorScrollPane.Content = new BrainEditor((BrainComponent)component); } else { _componentEditor.Object = component; _editorScrollPane.Content = _componentEditor; } }; } foreach (var(_, child) in target.Children) { child.Parent = target; BuildTree(child, thisEntityNode); } }
private void BuildUI() { _saveEntity = new MenuItem(); _saveEntity.Text = "Save Entity"; _saveEntity.Id = "_saveEntity"; _newEntity = new MenuItem(); _newEntity.Text = "New Entity"; _newEntity.Id = "_newEntity"; _quit = new MenuItem(); _quit.Text = "Quit"; _quit.Id = "_quit"; var verticalMenu1 = new VerticalMenu(); verticalMenu1.Background = new SolidBrush("#404040FF"); verticalMenu1.Items.Add(_saveEntity); verticalMenu1.Items.Add(_newEntity); verticalMenu1.Items.Add(_quit); var mainGrid = new Grid(); //mainGrid.ShowGridLines = true; //mainGrid.ColumnSpacing = 8; //mainGrid.RowSpacing = 8; mainGrid.ColumnsProportions.Add(new Proportion { Type = Myra.Graphics2D.UI.ProportionType.Auto, }); mainGrid.ColumnsProportions.Add(new Proportion { Type = Myra.Graphics2D.UI.ProportionType.Fill, }); mainGrid.RowsProportions.Add(new Proportion { Type = Myra.Graphics2D.UI.ProportionType.Part, }); mainGrid.RowsProportions.Add(new Proportion { Type = Myra.Graphics2D.UI.ProportionType.Fill, }); mainGrid.Widgets.Add(verticalMenu1); target = Entity.FromDefinition(Critter.GetCritter(TextureAtlas.Circle, Color.White)); target.Tag = "Foo"; _simulation.EditTarget = target; _componentEditor = new PropertyGrid(); _editorScrollPane = new ScrollViewer(); _editorScrollPane.MinHeight = 250; _editorScrollPane.Background = new SolidBrush("#202020FF"); _editorScrollPane.VerticalAlignment = VerticalAlignment.Bottom; _editorScrollPane.Content = _componentEditor; _editorScrollPane.GridRow = 1; _editorScrollPane.GridColumn = 1; mainGrid.Widgets.Add(_editorScrollPane); _entityTreeScroller = new ScrollViewer(); _entityTreeScroller.MinHeight = 250; _entityTreeScroller.MinWidth = 250; _entityTreeScroller.Background = new SolidBrush("#202020FF"); _entityTreeScroller.Content = new Tree(); _entityTreeScroller.GridRow = 1; mainGrid.Widgets.Add(_entityTreeScroller); RebuildTree(); _entityEditWidget = new EntityEditWidget(target, this); //BuildTree(target, (CustomTree)root, "", entityTree); Panel previewPanel = new Panel(); previewPanel.GridColumn = 1; previewPanel.MinWidth = 4000; previewPanel.MinHeight = 4000; Widgets.Add(previewPanel); Widgets.Add(mainGrid); }
public EntityEditWidget CreateEditWidget(Entity target) { var widget = new EntityEditWidget(target, this); widget._removeComponentButton.Click += (s, a) => { if (target.Components.Count <= 0) { return; } Grid grid = new Grid(); // Make list of all components that are removable ListBox box = new ListBox(); box.Width = 200; box.GridColumn = 0; box.GridRow = 0; box.GridColumnSpan = 2; foreach ((int id, AbstractComponent comp) in target.Components) { // Logic for removing components if (!(comp is TransformComponent)) { var item = new ListItem(comp.GetType().Name, Color.White, comp.GetType()); box.Items.Add(item); } } box.SelectedIndex = 0; grid.Widgets.Add(box); Dialog removeComponentWindow = new Dialog() { Content = grid, Title = "Select Component To Remove", Left = 676, Top = 205, Id = "_removeComponent", }; removeComponentWindow.Closed += (s, a) => { if (!removeComponentWindow.Result) { // Dialog was either closed or "Cancel" clicked return; } // "Ok" was clicked or Enter key pressed // Remove item from list target.RemoveComponent((Type)box.SelectedItem.Tag); RebuildTree(); }; removeComponentWindow.ShowModal(Desktop); }; widget._deleteEntityButton.Click += (s, a) => { var dialogue = Dialog.CreateMessageBox("Delete Entity", $"Are you sure you would like to delete entity {target.Tag}?"); dialogue.Closed += (s, a) => { if (!dialogue.Result) { // Escape or "Cancel" return; } ; target.Parent.Children.Remove(target.Tag); _simulation.Manager.DestroyEntity(target); RebuildTree(); }; dialogue.ShowModal(Desktop); }; widget._addChildButton.Click += (s, a) => { Grid grid = new Grid(); Dialog dialog = new Dialog { Title = "New Entity" }; var stackPanel = new HorizontalStackPanel { Spacing = 8 }; stackPanel.Proportions.Add(new Proportion { Type = ProportionType.Auto, }); stackPanel.Proportions.Add(new Proportion { Type = ProportionType.Fill, }); var label1 = new Label { Text = "Tag:" }; stackPanel.Widgets.Add(label1); var textBox1 = new TextBox(); stackPanel.Widgets.Add(textBox1); dialog.Content = stackPanel; dialog.Closed += (s, a) => { if (!dialog.Result) { // Dialog was either closed or "Cancel" clicked return; } if (!EntityPool.IsValidTag(textBox1.Text)) { Dialog.CreateMessageBox("Error", "Invalid tag.").ShowModal(Desktop); return; } if (target.Children.ContainsKey(textBox1.Text)) { Dialog.CreateMessageBox("Error", $"Already a child with tag {textBox1.Text}").ShowModal(Desktop); return; } // "Ok" was clicked or Enter key pressed Entity newChild = new Entity(textBox1.Text); newChild.AddComponents(new TransformComponent(newChild)); target.AddChild(newChild); }; dialog.ShowModal(Desktop); }; widget._addComponentButton.Click += (s, a) => { Grid grid = new Grid(); // Make list of all components that are removable ListBox box = new ListBox(); box.Width = 200; box.GridColumn = 0; box.GridRow = 0; box.GridColumnSpan = 2; foreach (Type component in _addableComponentTypes) { if (target.HasComponent(component)) { continue; } var item = new ListItem(component.Name, Color.White, component); box.Items.Add(item); } if (box.Items.Count > 0) { box.SelectedIndex = 0; } grid.Widgets.Add(box); Dialog addComponentWindow = new Dialog() { Content = grid, Title = "Select component to add...", Left = 676, Top = 205, Id = "_selectAddComponent", }; addComponentWindow.Closed += (s, a) => { if (!addComponentWindow.Result) { // Dialog was either closed or "Cancel" clicked return; } if (box.SelectedItem is null) { // No more types of component to add. return; } // "Ok" was clicked or Enter key pressed // Add selected component if exists. var componentType = (Type)box.SelectedItem.Tag; // Create a new component instance using the tagged type. var component = Activator.CreateInstance(componentType, target); target.AddComponents((AbstractComponent)component); RebuildTree(); }; addComponentWindow.ShowModal(Desktop); }; return(widget); }