diff --git a/Source/Editor/Surface/Archetypes/BehaviorTree.cs b/Source/Editor/Surface/Archetypes/BehaviorTree.cs index 63f6f5c2d..69a6e8f7e 100644 --- a/Source/Editor/Surface/Archetypes/BehaviorTree.cs +++ b/Source/Editor/Surface/Archetypes/BehaviorTree.cs @@ -189,21 +189,74 @@ namespace FlaxEditor.Surface.Archetypes public override void Draw() { - base.Draw(); + var style = Style.Current; + + var backgroundRect = new Rectangle(Float2.Zero, Size); + + // Shadow + if (DrawBasicShadow) + { + var shadowRect = backgroundRect.MakeOffsetted(ShadowOffset); + Render2D.FillRectangle(shadowRect, Color.Black.AlphaMultiplied(0.125f)); + } + + // Background + Render2D.FillRectangle(backgroundRect, ArchetypeColor); + + // Breakpoint hit + if (Breakpoint.Hit) + { + var colorTop = Color.OrangeRed; + var colorBottom = Color.Red; + var time = DateTime.Now - Engine.StartupTime; + Render2D.DrawRectangle(backgroundRect.MakeExpanded(Mathf.Lerp(3.0f, 12.0f, Mathf.Sin((float)time.TotalSeconds * 10.0f) * 0.5f + 0.5f)), colorTop, colorTop, colorBottom, colorBottom, 2.0f); + } + + // Header + var headerColor = style.BackgroundHighlighted; + if (_headerRect.Contains(ref _mousePosition) && !Surface.IsConnecting && !Surface.IsSelecting) + headerColor *= 1.07f; + Render2D.FillRectangle(_headerRect, style.BackgroundHighlighted); + Render2D.DrawText(style.FontLarge, Title, _headerTextRect, style.Foreground, TextAlignment.Near, TextAlignment.Center, TextWrapping.NoWrap, 1f, FlaxEditor.Surface.Constants.NodeHeaderTextScale); + + // Close button + if ((Archetype.Flags & NodeFlags.NoCloseButton) == 0 && Surface.CanEdit) + { + bool highlightClose = _closeButtonRect.Contains(_mousePosition) && !Surface.IsConnecting && !Surface.IsSelecting; + Render2D.DrawSprite(style.Cross, _closeButtonRect, highlightClose ? style.Foreground : style.ForegroundGrey); + } + + DrawChildren(); + + // Selection outline + if (_isSelected) + { + var colorTop = Color.Orange; + var colorBottom = Color.OrangeRed; + Render2D.DrawRectangle(backgroundRect, colorTop, colorTop, colorBottom, colorBottom, 2.5f); + } + + // Breakpoint dot + if (Breakpoint.Set) + { + var icon = Breakpoint.Enabled ? Surface.Style.Icons.BoxClose : Surface.Style.Icons.BoxOpen; + Render2D.DrawSprite(icon, new Rectangle(-7, -7, 16, 16), new Color(0.9f, 0.9f, 0.9f)); + Render2D.DrawSprite(icon, new Rectangle(-6, -6, 14, 14), new Color(0.894117647f, 0.0784313725f, 0.0f)); + } + + if (highlightBox != null) + Render2D.DrawRectangle(highlightBox.Bounds, style.BorderHighlighted, 2f); // Debug Info if (!string.IsNullOrEmpty(_debugInfo)) - { - var style = Style.Current; Render2D.DrawText(style.FontSmall, _debugInfo, new Rectangle(4, _headerRect.Bottom + 4, _debugInfoSize), style.Foreground); - } // Debug relevancy outline if (_debugRelevant) { var colorTop = Color.LightYellow; var colorBottom = Color.Yellow; - var backgroundRect = new Rectangle(Float2.One, Size - new Float2(2.0f)); + backgroundRect = new Rectangle(Float2.One, Size - new Float2(2.0f)); Render2D.DrawRectangle(backgroundRect, colorTop, colorTop, colorBottom, colorBottom); } } @@ -515,7 +568,7 @@ namespace FlaxEditor.Surface.Archetypes height += decorator.Height + DecoratorsMarginY; width = Mathf.Max(width, decorator.Width - FlaxEditor.Surface.Constants.NodeCloseButtonSize - 2 * DecoratorsMarginX); } - Size = new Float2(width + FlaxEditor.Surface.Constants.NodeMarginX * 2 + FlaxEditor.Surface.Constants.NodeCloseButtonSize, height + FlaxEditor.Surface.Constants.NodeHeaderHeight + FlaxEditor.Surface.Constants.NodeFooterSize); + Size = new Float2(width + FlaxEditor.Surface.Constants.NodeMarginX * 2 + FlaxEditor.Surface.Constants.NodeCloseButtonSize, height + FlaxEditor.Surface.Constants.NodeHeaderHeight); UpdateRectangles(); } @@ -536,13 +589,13 @@ namespace FlaxEditor.Surface.Archetypes if (decorator.IndexInParent < indexInParent) decorator.IndexInParent = indexInParent + 1; // Push elements above the node } - const float footerSize = FlaxEditor.Surface.Constants.NodeFooterSize; - const float headerSize = FlaxEditor.Surface.Constants.NodeHeaderHeight; + + const float headerHeight = FlaxEditor.Surface.Constants.NodeHeaderHeight; const float closeButtonMargin = FlaxEditor.Surface.Constants.NodeCloseButtonMargin; - const float closeButtonSize = FlaxEditor.Surface.Constants.NodeCloseButtonSize; - _headerRect = new Rectangle(0, bounds.Y - Y, bounds.Width, headerSize); + float closeButtonSize = FlaxEditor.Surface.Constants.NodeCloseButtonSize * 0.65f; + _headerRect = new Rectangle(0, bounds.Y - Y, bounds.Width, headerHeight); + _headerTextRect = _headerRect with { X = 5f, Width = Width - closeButtonSize - closeButtonMargin * 4f }; _closeButtonRect = new Rectangle(bounds.Width - closeButtonSize - closeButtonMargin, _headerRect.Y + closeButtonMargin, closeButtonSize, closeButtonSize); - _footerRect = new Rectangle(0, bounds.Height - footerSize, bounds.Width, footerSize); if (_output != null && _output.Visible) { _footerRect.Y -= ConnectionAreaHeight; @@ -684,6 +737,9 @@ namespace FlaxEditor.Surface.Archetypes base.UpdateRectangles(); _footerRect = Rectangle.Empty; + const float closeButtonMargin = FlaxEditor.Surface.Constants.NodeCloseButtonMargin; + float closeButtonSize = FlaxEditor.Surface.Constants.NodeCloseButtonSize * 0.65f; + _closeButtonRect = new Rectangle(Bounds.Width - closeButtonSize - closeButtonMargin, _headerRect.Y + closeButtonMargin, closeButtonSize, closeButtonSize); if (_dragIcon != null) _dragIcon.Bounds = new Rectangle(_closeButtonRect.X - _closeButtonRect.Width, _closeButtonRect.Y, _closeButtonRect.Size); } diff --git a/Source/Editor/Surface/SurfaceNode.cs b/Source/Editor/Surface/SurfaceNode.cs index a775d446c..0ee35e23e 100644 --- a/Source/Editor/Surface/SurfaceNode.cs +++ b/Source/Editor/Surface/SurfaceNode.cs @@ -159,7 +159,7 @@ namespace FlaxEditor.Surface public virtual string ContentSearchText => null; /// - /// Gets the color of the footer of the node. + /// Gets the color of the header of the node. /// protected virtual Color ArchetypeColor => GroupArchetype.Color; @@ -1061,7 +1061,7 @@ namespace FlaxEditor.Surface const float closeButtonMargin = Constants.NodeCloseButtonMargin; const float closeButtonSize = Constants.NodeCloseButtonSize; _headerRect = new Rectangle(0, 0, Width, headerSize); - _headerTextRect = _headerRect with { Width = _headerRect.Width - 5f, X = _headerRect.X + 5f }; + _headerTextRect = _headerRect with { X = 5f, Width = Width - closeButtonSize - closeButtonMargin * 4f }; _closeButtonRect = new Rectangle(Width - closeButtonSize - closeButtonMargin, closeButtonMargin, closeButtonSize, closeButtonSize); _footerRect = new Rectangle(0, Height - footerSize, Width, footerSize); }