Beispiel #1
0
 public Toolbar()
 {
     Padding      = new Thickness(4);
     MinMaxHeight = Metrics.ToolbarHeight;
     MinWidth     = 50;        // TimelineMetrics.ToolbarMinWidth;
     Presenter    = new SyncDelegatePresenter <Widget>(Render);
     Layout       = new HBoxLayout {
         Spacing = 2, DefaultCell = new DefaultLayoutCell(Alignment.Center)
     };
 }
Beispiel #2
0
 public ColorBoxButton(Color4 color)
 {
     Nodes.Clear();
     Size          = MinMaxSize = new Vector2(12, 12);
     PostPresenter = new SyncDelegatePresenter <Widget>(widget => {
         widget.PrepareRendererState();
         Renderer.DrawRect(Vector2.Zero, widget.Size, Color4.White);
         var checkSize = new Vector2(widget.Width / 4, widget.Height / 3);
         for (int i = 0; i < 3; i++)
         {
             var checkPos = new Vector2(widget.Width / 2 + ((i == 1) ? widget.Width / 4 : 0), i * checkSize.Y);
             Renderer.DrawRect(checkPos, checkPos + checkSize, Color4.Black);
         }
         Renderer.DrawRect(Vector2.Zero, widget.Size, color);
         Renderer.DrawRectOutline(Vector2.Zero, widget.Size, ColorTheme.Current.Inspector.BorderAroundKeyframeColorbox);
     });
 }
Beispiel #3
0
            public ColorBoxButton(IDataflowProvider <Color4> colorProvider)
            {
                Nodes.Clear();
                Size = MinMaxSize = new Vector2(25, Theme.Metrics.DefaultButtonSize.Y);
                var color = colorProvider.GetDataflow();

                PostPresenter = new SyncDelegatePresenter <Widget>(widget => {
                    widget.PrepareRendererState();
                    Renderer.DrawRect(Vector2.Zero, widget.Size, Color4.White);
                    color.Poll();
                    var checkSize = new Vector2(widget.Width / 4, widget.Height / 3);
                    for (int i = 0; i < 3; i++)
                    {
                        var checkPos = new Vector2(widget.Width / 2 + ((i == 1) ? widget.Width / 4 : 0), i * checkSize.Y);
                        Renderer.DrawRect(checkPos, checkPos + checkSize, Color4.Black);
                    }
                    Renderer.DrawRect(Vector2.Zero, widget.Size, color.Value);
                    Renderer.DrawRectOutline(Vector2.Zero, widget.Size, ColorTheme.Current.Inspector.BorderAroundKeyframeColorbox);
                });
            }
Beispiel #4
0
        public IEnumerator <object> Task()
        {
            var widget = curveEditor.MainAreaWidget;
            var input  = CommonWindow.Current.Input;

            while (true)
            {
                if (widget.IsMouseOver() && input.WasKeyPressed(Key.Mouse0))
                {
                    input.ConsumeKey(Key.Mouse0);
                    using (Document.Current.History.BeginTransaction()) {
                        var initialMousePos    = curveEditor.ContentWidget.LocalMousePosition();
                        var currentMousePos    = initialMousePos;
                        var rectanglePresenter = new SyncDelegatePresenter <Widget>(w => {
                            w.PrepareRendererState();
                            Renderer.DrawRectOutline(initialMousePos, currentMousePos, ColorTheme.Current.TimelineCurveEditor.Selection);
                        });
                        curveEditor.ContentWidget.CompoundPostPresenter.Add(rectanglePresenter);
                        while (input.IsMousePressed())
                        {
                            currentMousePos = curveEditor.ContentWidget.LocalMousePosition();
                            var rect = new Rectangle(initialMousePos, currentMousePos);
                            foreach (var c in curveEditor.Curves)
                            {
                                SelectKeysWithinRectangle(c, rect);
                            }
                            Window.Current.Invalidate();
                            yield return(null);
                        }
                        curveEditor.ContentWidget.CompoundPostPresenter.Remove(rectanglePresenter);
                        Window.Current.Invalidate();
                        Document.Current.History.CommitTransaction();
                    }
                }
                yield return(null);
            }
        }
Beispiel #5
0
 public Toolbar()
 {
     Padding      = new Thickness(4);
     MinMaxHeight = Metrics.ToolbarHeight;
     MinWidth     = 50;
     Presenter    = new SyncDelegatePresenter <Widget>(Render);
     Layout       = new HBoxLayout {
         Spacing     = 2,
         DefaultCell = new DefaultLayoutCell(Alignment.Center)
     };
     Nodes.AddRange(
         new Widget {
         Layout = new VBoxLayout(),
         Nodes  =
         {
             (Content        = new Widget     {
                 Layout      = new HBoxLayout {
                     Spacing = 2
                 }
             })
         }
     }
         );
 }
        public IEnumerator <object> Task()
        {
            var sceneView = SceneView.Instance;
            var input     = sceneView.Input;

            while (true)
            {
                if (input.WasMousePressed() && !input.IsKeyPressed(Key.Shift))
                {
                    var rect      = new Rectangle(sceneView.MousePosition, sceneView.MousePosition);
                    var presenter = new SyncDelegatePresenter <Widget>(w => {
                        w.PrepareRendererState();
                        var t = sceneView.Scene.CalcTransitionToSpaceOf(sceneView.Frame);
                        Renderer.DrawRectOutline(rect.A * t, rect.B * t, ColorTheme.Current.SceneView.MouseSelection);
                    });
                    sceneView.Frame.CompoundPostPresenter.Add(presenter);
                    using (Document.Current.History.BeginTransaction()) {
                        var clicked       = true;
                        var selectedNodes = Document.Current.SelectedNodes().Editable().ToList();
                        while (input.IsMousePressed())
                        {
                            rect.B   = sceneView.MousePosition;
                            clicked &= (rect.B - rect.A).Length <= 5;
                            if (!clicked)
                            {
                                RefreshSelectedNodes(rect, selectedNodes);
                            }
                            CommonWindow.Current.Invalidate();
                            yield return(null);
                        }
                        // Evgenii Polikutin: this covers for the edge case, when no nodes
                        // were selected on click, therefore Inspector.Rebuild() wasn't called.
                        Document.Current.InspectRootNode = false;

                        if (clicked)
                        {
                            var controlPressed = SceneView.Instance.Input.IsKeyPressed(Key.Control);
                            if (!controlPressed)
                            {
                                Core.Operations.ClearRowSelection.Perform();
                            }
                            Node selectedNode = null;
                            foreach (var widget in WidgetsPivotMarkPresenter.WidgetsWithDisplayedPivot())
                            {
                                var pos = widget.GlobalPivotPosition;
                                if (widget.GloballyVisible && SceneView.Instance.HitTestControlPoint(pos))
                                {
                                    selectedNode = widget;
                                    break;
                                }
                            }
                            if (selectedNode == null)
                            {
                                foreach (var node in Document.Current.Container.Nodes.Editable())
                                {
                                    if (Probe(node, rect.A))
                                    {
                                        selectedNode = node;
                                        break;
                                    }
                                }
                            }
                            if (selectedNode != null)
                            {
                                Core.Operations.SelectNode.Perform(selectedNode, !controlPressed || !Document.Current.SelectedNodes().Contains(selectedNode));
                            }
                        }
                        sceneView.Frame.CompoundPostPresenter.Remove(presenter);
                        CommonWindow.Current.Invalidate();
                        input.ConsumeKey(Key.Mouse0);
                        Document.Current.History.CommitTransaction();
                    }
                }
                yield return(null);
            }
        }
Beispiel #7
0
        private IEnumerator <object> DragTask(Widget panelContainer, WidgetInput input, int rowIndex, int panelIndex)
        {
            var rootWidget    = widget.GetRoot().AsWidget;
            var newRowIndex   = rowIndex;
            var newPanelIndex = panelIndex;
            var presenter     = new SyncDelegatePresenter <Widget>(w => {
                w.PrepareRendererState();
                if (panelContainer == null)
                {
                    return;
                }
                var aabb = panelContainer.CalcAABBInSpaceOf(rootWidget);
                Renderer.DrawRect(aabb.A, aabb.B, ColorTheme.Current.Toolbar.PanelPlacementHighlightBackground);
                Renderer.DrawRectOutline(aabb.A, aabb.B, ColorTheme.Current.Toolbar.PanelPlacementHighlightBorder);
            });

            while (true)
            {
                if (!input.WasMousePressed() || Core.Project.Current == Core.Project.Null)
                {
                    yield return(null);

                    continue;
                }
                rootWidget.CompoundPostPresenter.Add(presenter);
                while (input.IsMousePressed())
                {
                    Vector2 pos;
                    Utils.ChangeCursorIfDefault(MouseCursor.Hand);
                    for (var i = 0; i < widget.Nodes.Count; ++i)
                    {
                        var rowWidget = (Widget)widget.Nodes[i];
                        if (!IsMouseOver(rowWidget, out pos))
                        {
                            continue;
                        }
                        for (var j = 0; j < rowWidget.Nodes.Count; ++j)
                        {
                            var panelWidget = (Widget)rowWidget.Nodes[j];
                            if (!IsMouseOver(panelWidget, out pos))
                            {
                                continue;
                            }
                            if ((newRowIndex != i || newPanelIndex != j) && (rowIndex != i || j != rowWidget.Nodes.Count - 1))
                            {
                                panelContainer = panelWidget;
                                newRowIndex    = i;
                                newPanelIndex  = j;
                            }
                            goto Next;
                        }
                    }

                    panelContainer = null;
                    if (!IsMouseOver(widget, out pos))
                    {
                        newPanelIndex = 0;
                        if (pos.Y < 0)
                        {
                            newRowIndex = -1;
                        }
                        if (pos.Y > widget.Height)
                        {
                            newRowIndex = toolbarModel.Rows.Count;
                        }
                    }
Next:
                    yield return(null);
                }
                rootWidget.CompoundPostPresenter.Remove(presenter);
                if (newRowIndex == rowIndex && newPanelIndex == panelIndex)
                {
                    continue;
                }
                ToolbarModel.ToolbarRow row;
                if (newRowIndex < 0 || newRowIndex == toolbarModel.Rows.Count)
                {
                    row = new ToolbarModel.ToolbarRow();
                    toolbarModel.InsertRow(row, newRowIndex < 0 ? 0 : newRowIndex);
                    if (newRowIndex < 0)
                    {
                        ++rowIndex;
                    }
                }
                else
                {
                    row = toolbarModel.Rows[newRowIndex];
                }
                var oldRow = toolbarModel.Rows[rowIndex];
                var panel  = oldRow.Panels[panelIndex];
                if (newRowIndex != rowIndex)
                {
                    toolbarModel.RemovePanel(panel);
                    toolbarModel.InsertPanel(row, panel, newPanelIndex);
                }
                else
                {
                    toolbarModel.SwapPanels(row.Panels[newPanelIndex], panel);
                }
                if (oldRow.Panels.Count == 0)
                {
                    toolbarModel.RemoveRow(oldRow);
                }
                toolbarModel.RefreshAfterLoad();
                Rebuild();
                yield break;
            }
        }
        public IEnumerator <object> Task()
        {
            ICommand command        = new Command();
            Type     nodeTypeActive = null;

            while (true)
            {
                if (sv.Input.WasKeyPressed(Key.Escape) || sv.Input.WasMousePressed(1))
                {
                    nodeTypeActive = null;
                }
                Type     nodeTypeIncome;
                ICommand newCommand;
                if (CreateNodeRequestComponent.Consume <Widget>(sv.Components, out nodeTypeIncome, out newCommand))
                {
                    nodeTypeActive  = nodeTypeIncome;
                    command.Checked = false;
                    command         = newCommand;
                    command.Checked = true;
                }

                if (nodeTypeActive == null)
                {
                    command.Checked = false;
                    yield return(null);

                    continue;
                }

                if (sv.InputArea.IsMouseOver())
                {
                    Utils.ChangeCursorIfDefault(MouseCursor.Hand);
                }
                var container = Document.Current.Container as Widget;
                CreateNodeRequestComponent.Consume <Node>(sv.Components);
                if (sv.Input.WasMousePressed() && container != null)
                {
                    sv.Input.ConsumeKey(Key.Mouse0);
                    var t         = sv.Scene.CalcTransitionToSpaceOf(container);
                    var rect      = new Rectangle(sv.MousePosition * t, sv.MousePosition * t);
                    var presenter = new SyncDelegatePresenter <Widget>(w => {
                        w.PrepareRendererState();
                        var t2 = container.CalcTransitionToSpaceOf(sv.Frame);
                        DrawRectOutline(rect.A, (rect.A + rect.B) / 2, t2);
                        DrawRectOutline(rect.A, rect.B, t2);
                    });
                    sv.Frame.CompoundPostPresenter.Add(presenter);
                    using (Document.Current.History.BeginTransaction()) {
                        while (sv.Input.IsMousePressed())
                        {
                            rect.B = sv.MousePosition * t;
                            CommonWindow.Current.Invalidate();
                            yield return(null);
                        }
                        sv.Frame.CompoundPostPresenter.Remove(presenter);
                        try {
                            var widget = (Widget)Core.Operations.CreateNode.Perform(nodeTypeActive);
                            Core.Operations.SetProperty.Perform(widget, nameof(Widget.Size), rect.B - rect.A);
                            Core.Operations.SetProperty.Perform(widget, nameof(Widget.Position), rect.A + widget.Size / 2);
                            Core.Operations.SetProperty.Perform(widget, nameof(Widget.Pivot), Vector2.Half);
                        } catch (InvalidOperationException e) {
                            AlertDialog.Show(e.Message);
                        }
                        Document.Current.History.CommitTransaction();
                    }

                    nodeTypeActive = null;
                    Utils.ChangeCursorIfDefault(MouseCursor.Default);
                }

                yield return(null);
            }
        }