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