Beispiel #1
0
        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);
        }