From a98a76f6e5d2bce1a5b6390f882ad35ca665e1ec Mon Sep 17 00:00:00 2001 From: Saas Date: Sat, 20 Dec 2025 00:02:11 +0100 Subject: [PATCH] fix box spacing and (auto calculate) node height - Work in progress but enough progress to commit because it basically works, it's just a bit ugly - Node height is now recalculated every time a new element is added to the node - Introduced `Archetype.UseFixedSize` for special nodes like *Color Gradient* or *Curve* that must rely on hardcoded size for now because the auto sizing does not take elements like the gradient editor or curve editor into account (ideally in the future it will) - Fixed input and output box spacing (still some 1px offsets that I'm unsure where they are from, could be placebo though) --- .../Archetypes/Animation.StateMachine.cs | 2 +- Source/Editor/Surface/Archetypes/Animation.cs | 4 +-- .../Editor/Surface/Archetypes/BehaviorTree.cs | 6 ++--- Source/Editor/Surface/Archetypes/Constants.cs | 6 ++--- Source/Editor/Surface/Archetypes/Material.cs | 2 +- .../Surface/Archetypes/ParticleModules.cs | 2 +- Source/Editor/Surface/Archetypes/Particles.cs | 4 +-- Source/Editor/Surface/Archetypes/Textures.cs | 2 +- Source/Editor/Surface/Archetypes/Tools.cs | 11 +++++--- Source/Editor/Surface/Constants.cs | 16 +++++++++--- Source/Editor/Surface/Elements/InputBox.cs | 2 +- Source/Editor/Surface/Elements/OutputBox.cs | 2 +- Source/Editor/Surface/NodeArchetype.cs | 2 ++ Source/Editor/Surface/NodeElementArchetype.cs | 26 +++++++++---------- .../Editor/Surface/ParticleEmitterSurface.cs | 4 +-- Source/Editor/Surface/SurfaceComment.cs | 4 +-- Source/Editor/Surface/SurfaceNode.cs | 21 ++++++++++----- 17 files changed, 69 insertions(+), 47 deletions(-) diff --git a/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs b/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs index e66f38398..b4afff091 100644 --- a/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs +++ b/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs @@ -79,7 +79,7 @@ namespace FlaxEditor.Surface.Archetypes : base(id, context, nodeArch, groupArch) { var marginX = FlaxEditor.Surface.Constants.NodeMarginX; - var uiStartPosY = FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize; + var uiStartPosY = FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight; var editButton = new Button(marginX, uiStartPosY, 246, 20) { diff --git a/Source/Editor/Surface/Archetypes/Animation.cs b/Source/Editor/Surface/Archetypes/Animation.cs index 9f3112905..ad5e45611 100644 --- a/Source/Editor/Surface/Archetypes/Animation.cs +++ b/Source/Editor/Surface/Archetypes/Animation.cs @@ -244,7 +244,7 @@ namespace FlaxEditor.Surface.Archetypes Type = NodeElementType.Input, Position = new Float2( FlaxEditor.Surface.Constants.NodeMarginX - FlaxEditor.Surface.Constants.BoxOffsetX, - FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize + ylevel * FlaxEditor.Surface.Constants.LayoutOffsetY), + FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight + ylevel * FlaxEditor.Surface.Constants.LayoutOffsetY), Text = "Pose " + _blendPoses.Count, Single = true, ValueIndex = -1, @@ -263,7 +263,7 @@ namespace FlaxEditor.Surface.Archetypes private void UpdateHeight() { float nodeHeight = 10 + (Mathf.Max(_blendPoses.Count, 1) + 3) * FlaxEditor.Surface.Constants.LayoutOffsetY; - Height = nodeHeight + FlaxEditor.Surface.Constants.NodeMarginY * 2 + FlaxEditor.Surface.Constants.NodeHeaderSize + FlaxEditor.Surface.Constants.NodeFooterSize; + Height = nodeHeight + FlaxEditor.Surface.Constants.NodeMarginY * 2 + FlaxEditor.Surface.Constants.NodeHeaderHeight + FlaxEditor.Surface.Constants.NodeFooterSize; } /// diff --git a/Source/Editor/Surface/Archetypes/BehaviorTree.cs b/Source/Editor/Surface/Archetypes/BehaviorTree.cs index 9c9325177..63f6f5c2d 100644 --- a/Source/Editor/Surface/Archetypes/BehaviorTree.cs +++ b/Source/Editor/Surface/Archetypes/BehaviorTree.cs @@ -515,7 +515,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.NodeHeaderSize + FlaxEditor.Surface.Constants.NodeFooterSize); + Size = new Float2(width + FlaxEditor.Surface.Constants.NodeMarginX * 2 + FlaxEditor.Surface.Constants.NodeCloseButtonSize, height + FlaxEditor.Surface.Constants.NodeHeaderHeight + FlaxEditor.Surface.Constants.NodeFooterSize); UpdateRectangles(); } @@ -537,7 +537,7 @@ namespace FlaxEditor.Surface.Archetypes decorator.IndexInParent = indexInParent + 1; // Push elements above the node } const float footerSize = FlaxEditor.Surface.Constants.NodeFooterSize; - const float headerSize = FlaxEditor.Surface.Constants.NodeHeaderSize; + const float headerSize = 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); @@ -676,7 +676,7 @@ namespace FlaxEditor.Surface.Archetypes width = Mathf.Max(width, _debugInfoSize.X + 8.0f); height += _debugInfoSize.Y + 8.0f; } - return new Float2(width + FlaxEditor.Surface.Constants.NodeCloseButtonSize * 2 + DecoratorsMarginX * 2, height + FlaxEditor.Surface.Constants.NodeHeaderSize); + return new Float2(width + FlaxEditor.Surface.Constants.NodeCloseButtonSize * 2 + DecoratorsMarginX * 2, height + FlaxEditor.Surface.Constants.NodeHeaderHeight); } protected override void UpdateRectangles() diff --git a/Source/Editor/Surface/Archetypes/Constants.cs b/Source/Editor/Surface/Archetypes/Constants.cs index ad88fa56a..680cc512d 100644 --- a/Source/Editor/Surface/Archetypes/Constants.cs +++ b/Source/Editor/Surface/Archetypes/Constants.cs @@ -166,7 +166,7 @@ namespace FlaxEditor.Surface.Archetypes _picker = new EnumComboBox(type) { EnumTypeValue = Values[0], - Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize, 160, 16), + Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight, 160, 16), Parent = this, }; _picker.ValueChanged += () => SetValue(0, _picker.EnumTypeValue); @@ -218,7 +218,7 @@ namespace FlaxEditor.Surface.Archetypes _output = (OutputBox)Elements[0]; _typePicker = new TypePickerControl { - Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize, 160, 16), + Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight, 160, 16), Parent = this, }; _typePicker.ValueChanged += () => Set(3); @@ -362,7 +362,7 @@ namespace FlaxEditor.Surface.Archetypes _output = (OutputBox)Elements[0]; _keyTypePicker = new TypePickerControl { - Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize, 160, 16), + Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight, 160, 16), Parent = this, }; _keyTypePicker.ValueChanged += OnKeyTypeChanged; diff --git a/Source/Editor/Surface/Archetypes/Material.cs b/Source/Editor/Surface/Archetypes/Material.cs index e46038639..f707e4c2b 100644 --- a/Source/Editor/Surface/Archetypes/Material.cs +++ b/Source/Editor/Surface/Archetypes/Material.cs @@ -323,7 +323,7 @@ namespace FlaxEditor.Surface.Archetypes public CustomCodeNode(uint id, VisjectSurfaceContext context, NodeArchetype nodeArch, GroupArchetype groupArch) : base(id, context, nodeArch, groupArch) { - Float2 pos = new Float2(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize), size; + Float2 pos = new Float2(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight), size; if (nodeArch.TypeID == 8) { pos += new Float2(60, 0); diff --git a/Source/Editor/Surface/Archetypes/ParticleModules.cs b/Source/Editor/Surface/Archetypes/ParticleModules.cs index 4a68c31e0..debc88d59 100644 --- a/Source/Editor/Surface/Archetypes/ParticleModules.cs +++ b/Source/Editor/Surface/Archetypes/ParticleModules.cs @@ -461,7 +461,7 @@ namespace FlaxEditor.Surface.Archetypes /// /// The particle module node elements offset applied to controls to reduce default surface node header thickness. /// - private const float NodeElementsOffset = 16.0f - Surface.Constants.NodeHeaderSize; + private const float NodeElementsOffset = 16.0f - Surface.Constants.NodeHeaderHeight; private const NodeFlags DefaultModuleFlags = NodeFlags.ParticleEmitterGraph | NodeFlags.NoSpawnViaGUI | NodeFlags.NoMove; diff --git a/Source/Editor/Surface/Archetypes/Particles.cs b/Source/Editor/Surface/Archetypes/Particles.cs index 5b8c05381..d5319b875 100644 --- a/Source/Editor/Surface/Archetypes/Particles.cs +++ b/Source/Editor/Surface/Archetypes/Particles.cs @@ -74,7 +74,7 @@ namespace FlaxEditor.Surface.Archetypes /// /// The header height. /// - public const float HeaderHeight = FlaxEditor.Surface.Constants.NodeHeaderSize; + public const float HeaderHeight = FlaxEditor.Surface.Constants.NodeHeaderHeight; /// /// Gets the type of the module. @@ -199,7 +199,7 @@ namespace FlaxEditor.Surface.Archetypes DrawChildren(); // Options border - var optionsAreaStart = FlaxEditor.Surface.Constants.NodeHeaderSize + 3.0f; + var optionsAreaStart = FlaxEditor.Surface.Constants.NodeHeaderHeight + 3.0f; var optionsAreaHeight = 7 * FlaxEditor.Surface.Constants.LayoutOffsetY + 6.0f; Render2D.DrawRectangle(new Rectangle(1, optionsAreaStart, Width - 2, optionsAreaHeight), style.BackgroundSelected); diff --git a/Source/Editor/Surface/Archetypes/Textures.cs b/Source/Editor/Surface/Archetypes/Textures.cs index c1132e947..4a5bff299 100644 --- a/Source/Editor/Surface/Archetypes/Textures.cs +++ b/Source/Editor/Surface/Archetypes/Textures.cs @@ -54,7 +54,7 @@ namespace FlaxEditor.Surface.Archetypes { _textureGroupPicker = new ComboBox { - Location = new Float2(FlaxEditor.Surface.Constants.NodeMarginX + 50, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize + FlaxEditor.Surface.Constants.LayoutOffsetY * 5), + Location = new Float2(FlaxEditor.Surface.Constants.NodeMarginX + 50, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight + FlaxEditor.Surface.Constants.LayoutOffsetY * 5), Width = 100, Parent = this, }; diff --git a/Source/Editor/Surface/Archetypes/Tools.cs b/Source/Editor/Surface/Archetypes/Tools.cs index 685068986..13691a05b 100644 --- a/Source/Editor/Surface/Archetypes/Tools.cs +++ b/Source/Editor/Surface/Archetypes/Tools.cs @@ -467,6 +467,7 @@ namespace FlaxEditor.Surface.Archetypes Create = (id, context, arch, groupArch) => new CurveNode(id, context, arch, groupArch), Description = "An animation spline represented by a set of keyframes, each representing an endpoint of a Bezier curve.", Flags = NodeFlags.AllGraphs, + UseFixedSize = true, Size = new Float2(400, 180.0f), DefaultValues = new object[] { @@ -828,7 +829,7 @@ namespace FlaxEditor.Surface.Archetypes _picker = new TypePickerControl { Type = ScriptType.FlaxObject, - Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX + 20, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize, 160, 16), + Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX + 20, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight, 160, 16), Parent = this, }; _picker.ValueChanged += () => SetValue(0, _picker.ValueTypeName); @@ -897,7 +898,7 @@ namespace FlaxEditor.Surface.Archetypes _picker = new TypePickerControl { Type = ScriptType.Object, - Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize, 140, 16), + Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight, 140, 16), Parent = this, }; _picker.ValueChanged += () => SetValue(0, _picker.ValueTypeName); @@ -948,7 +949,7 @@ namespace FlaxEditor.Surface.Archetypes _picker = new TypePickerControl { Type = ScriptType.FlaxObject, - Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX + 20, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize, 160, 16), + Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX + 20, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight, 160, 16), Parent = this, }; _picker.ValueChanged += () => SetValue(0, _picker.ValueTypeName); @@ -999,7 +1000,7 @@ namespace FlaxEditor.Surface.Archetypes _picker = new TypePickerControl { Type = type, - Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX + 20, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderSize, 160, 16), + Bounds = new Rectangle(FlaxEditor.Surface.Constants.NodeMarginX + 20, FlaxEditor.Surface.Constants.NodeMarginY + FlaxEditor.Surface.Constants.NodeHeaderHeight, 160, 16), Parent = this, }; _picker.ValueChanged += () => SetValue(0, _picker.ValueTypeName); @@ -1510,6 +1511,7 @@ namespace FlaxEditor.Surface.Archetypes Description = "Linear color gradient sampler", Flags = NodeFlags.AllGraphs, Size = new Float2(400, 150.0f), + UseFixedSize = true, DefaultValues = new object[] { // Stops count @@ -1829,6 +1831,7 @@ namespace FlaxEditor.Surface.Archetypes Description = "Reroute a connection.", Flags = NodeFlags.NoCloseButton | NodeFlags.NoSpawnViaGUI | NodeFlags.AllGraphs, Size = RerouteNode.DefaultSize, + UseFixedSize = true, ConnectionsHints = ConnectionsHint.All, IndependentBoxes = new int[] { 0 }, DependentBoxes = new int[] { 1 }, diff --git a/Source/Editor/Surface/Constants.cs b/Source/Editor/Surface/Constants.cs index 80aecd3ec..58dee6084 100644 --- a/Source/Editor/Surface/Constants.cs +++ b/Source/Editor/Surface/Constants.cs @@ -23,7 +23,7 @@ namespace FlaxEditor.Surface /// /// The node header height. /// - public const float NodeHeaderSize = 20.0f; + public const float NodeHeaderHeight = 20.0f; public const float NodeHeaderTextScale = 0.65f; @@ -35,7 +35,7 @@ namespace FlaxEditor.Surface /// /// The node left margin. /// - public const float NodeMarginX = 5.0f; + public const float NodeMarginX = 8.0f; /// /// The node right margin. @@ -45,7 +45,7 @@ namespace FlaxEditor.Surface /// /// The box position offset on the x axis. /// - public const float BoxOffsetX = 2.0f; + public const float BoxOffsetX = 0.0f; /// /// The width of the row that is started by a box. @@ -61,5 +61,15 @@ namespace FlaxEditor.Surface /// The node layout offset on the y axis (height of the boxes rows, etc.). It's used to make the design more consistent. /// public const float LayoutOffsetY = 22.0f; + + /// + /// The offset between the box text and the box + /// + public const float BoxTextOffset = 4.0f; + + /// + /// The width of the rectangle used to draw the box text. + /// + public const float BoxTextRectWidth = 1410.0f; } } diff --git a/Source/Editor/Surface/Elements/InputBox.cs b/Source/Editor/Surface/Elements/InputBox.cs index 9861ebacd..113da6c68 100644 --- a/Source/Editor/Surface/Elements/InputBox.cs +++ b/Source/Editor/Surface/Elements/InputBox.cs @@ -1442,7 +1442,7 @@ namespace FlaxEditor.Surface.Elements // Draw text var style = Style.Current; - var rect = new Rectangle(Width + 4, 0, 1410, Height); + var rect = new Rectangle(Width + Constants.BoxTextOffset, 0, Constants.BoxTextRectWidth, Height); Render2D.DrawText(style.FontSmall, Text, rect, Enabled ? style.Foreground : style.ForegroundDisabled, TextAlignment.Near, TextAlignment.Center); } diff --git a/Source/Editor/Surface/Elements/OutputBox.cs b/Source/Editor/Surface/Elements/OutputBox.cs index 0673f694b..025b16f4b 100644 --- a/Source/Editor/Surface/Elements/OutputBox.cs +++ b/Source/Editor/Surface/Elements/OutputBox.cs @@ -234,7 +234,7 @@ namespace FlaxEditor.Surface.Elements // Draw text var style = Style.Current; - var rect = new Rectangle(-100, 0, 100 - 2, Height); + var rect = new Rectangle(-Constants.BoxTextRectWidth - Constants.BoxTextOffset, 0, Constants.BoxTextRectWidth, Height); Render2D.DrawText(style.FontSmall, Text, rect, Enabled ? style.Foreground : style.ForegroundDisabled, TextAlignment.Far, TextAlignment.Center); } } diff --git a/Source/Editor/Surface/NodeArchetype.cs b/Source/Editor/Surface/NodeArchetype.cs index b29dd0956..18e6ac8c9 100644 --- a/Source/Editor/Surface/NodeArchetype.cs +++ b/Source/Editor/Surface/NodeArchetype.cs @@ -129,6 +129,8 @@ namespace FlaxEditor.Surface /// public NodeFlags Flags; + public bool UseFixedSize = false; + /// /// Title text. /// diff --git a/Source/Editor/Surface/NodeElementArchetype.cs b/Source/Editor/Surface/NodeElementArchetype.cs index 1a9d4ae74..d8008f53f 100644 --- a/Source/Editor/Surface/NodeElementArchetype.cs +++ b/Source/Editor/Surface/NodeElementArchetype.cs @@ -78,12 +78,12 @@ namespace FlaxEditor.Surface /// /// Gets the actual element position on the y axis. /// - public float ActualPositionY => Position.Y + Constants.NodeMarginY + Constants.NodeHeaderSize; + public float ActualPositionY => Position.Y + Constants.NodeMarginY + Constants.NodeHeaderHeight; /// /// Gets the actual element position. /// - public Float2 ActualPosition => new Float2(Position.X + Constants.NodeMarginX, Position.Y + Constants.NodeMarginY + Constants.NodeHeaderSize); + public Float2 ActualPosition => new Float2(Position.X + Constants.NodeMarginX, Position.Y + Constants.NodeMarginY + Constants.NodeHeaderHeight); /// /// Node element archetypes factory object. Helps to build surface nodes archetypes. @@ -107,7 +107,7 @@ namespace FlaxEditor.Surface Type = NodeElementType.Input, Position = new Float2( Constants.NodeMarginX - Constants.BoxOffsetX, - Constants.NodeMarginY + Constants.NodeHeaderSize + yLevel * Constants.LayoutOffsetY), + Constants.NodeMarginY + Constants.NodeHeaderHeight + yLevel * Constants.LayoutOffsetY), Text = text, Single = single, ValueIndex = valueIndex, @@ -133,7 +133,7 @@ namespace FlaxEditor.Surface Type = NodeElementType.Input, Position = new Float2( Constants.NodeMarginX - Constants.BoxOffsetX, - Constants.NodeMarginY + Constants.NodeHeaderSize + yLevel * Constants.LayoutOffsetY), + Constants.NodeMarginY + Constants.NodeHeaderHeight + yLevel * Constants.LayoutOffsetY), Text = text, Single = single, ValueIndex = valueIndex, @@ -158,7 +158,7 @@ namespace FlaxEditor.Surface Type = NodeElementType.Output, Position = new Float2( Constants.NodeMarginX - Constants.BoxRowHeight + Constants.BoxOffsetX, - Constants.NodeMarginY + Constants.NodeHeaderSize + yLevel * Constants.LayoutOffsetY), + Constants.NodeMarginY + Constants.NodeHeaderHeight + yLevel * Constants.LayoutOffsetY), Text = text, Single = single, ValueIndex = -1, @@ -182,8 +182,8 @@ namespace FlaxEditor.Surface { Type = NodeElementType.Output, Position = new Float2( - Constants.NodeMarginX - Constants.BoxRowHeight + Constants.BoxOffsetX, - Constants.NodeMarginY + Constants.NodeHeaderSize + yLevel * Constants.LayoutOffsetY), + Constants.NodeMarginX - Constants.BoxSize + Constants.BoxOffsetX, + Constants.NodeMarginY + Constants.NodeHeaderHeight + yLevel * Constants.LayoutOffsetY), Text = text, Single = single, ValueIndex = -1, @@ -228,7 +228,7 @@ namespace FlaxEditor.Surface return new NodeElementArchetype { Type = NodeElementType.IntegerValue, - Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderSize + y), + Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderHeight + y), Text = null, Single = false, ValueIndex = valueIndex, @@ -254,7 +254,7 @@ namespace FlaxEditor.Surface return new NodeElementArchetype { Type = NodeElementType.UnsignedIntegerValue, - Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderSize + y), + Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderHeight + y), Text = null, Single = false, ValueIndex = valueIndex, @@ -280,7 +280,7 @@ namespace FlaxEditor.Surface return new NodeElementArchetype { Type = NodeElementType.FloatValue, - Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderSize + y), + Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderHeight + y), Text = null, Single = false, ValueIndex = valueIndex, @@ -359,7 +359,7 @@ namespace FlaxEditor.Surface return new NodeElementArchetype { Type = NodeElementType.ColorValue, - Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderSize + y), + Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderHeight + y), Text = null, Single = false, ValueIndex = valueIndex, @@ -530,7 +530,7 @@ namespace FlaxEditor.Surface return new NodeElementArchetype { Type = NodeElementType.TextBox, - Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderSize + y), + Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderHeight + y), Size = new Float2(width, height), Single = false, ValueIndex = valueIndex, @@ -595,7 +595,7 @@ namespace FlaxEditor.Surface return new NodeElementArchetype { Type = NodeElementType.BoxValue, - Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderSize + y), + Position = new Float2(Constants.NodeMarginX + x, Constants.NodeMarginY + Constants.NodeHeaderHeight + y), Text = null, Single = false, ValueIndex = valueIndex, diff --git a/Source/Editor/Surface/ParticleEmitterSurface.cs b/Source/Editor/Surface/ParticleEmitterSurface.cs index f332471fb..c61d4365d 100644 --- a/Source/Editor/Surface/ParticleEmitterSurface.cs +++ b/Source/Editor/Surface/ParticleEmitterSurface.cs @@ -59,7 +59,7 @@ namespace FlaxEditor.Surface var width = _rootNode.Width; var rootPos = _rootNode.Location; var pos = rootPos; - pos.Y += Constants.NodeHeaderSize + 1.0f + 7 * Constants.LayoutOffsetY + 6.0f + 4.0f; + pos.Y += Constants.NodeHeaderHeight + 1.0f + 7 * Constants.LayoutOffsetY + 6.0f + 4.0f; for (int i = 0; i < _rootNode.Headers.Length; i++) { @@ -67,7 +67,7 @@ namespace FlaxEditor.Surface var modulesStart = pos - rootPos; var modules = modulesGroups.FirstOrDefault(x => x.Key == header.ModuleType); - pos.Y += Constants.NodeHeaderSize + 2.0f; + pos.Y += Constants.NodeHeaderHeight + 2.0f; if (modules != null) { foreach (var module in modules) diff --git a/Source/Editor/Surface/SurfaceComment.cs b/Source/Editor/Surface/SurfaceComment.cs index 10e9fc776..3c04cb736 100644 --- a/Source/Editor/Surface/SurfaceComment.cs +++ b/Source/Editor/Surface/SurfaceComment.cs @@ -70,7 +70,7 @@ namespace FlaxEditor.Surface { _renameTextBox = new TextBox(false, 0, 0, Width) { - Height = Constants.NodeHeaderSize, + Height = Constants.NodeHeaderHeight, Visible = false, Parent = this, EndEditOnClick = false, // We have to handle this ourselves, otherwise the textbox instantly loses focus when double-clicking the header @@ -158,7 +158,7 @@ namespace FlaxEditor.Surface /// protected override void UpdateRectangles() { - const float headerSize = Constants.NodeHeaderSize; + const float headerSize = Constants.NodeHeaderHeight; const float buttonMargin = Constants.NodeCloseButtonMargin; const float buttonSize = Constants.NodeCloseButtonSize; _headerRect = new Rectangle(0, 0, Width, headerSize); diff --git a/Source/Editor/Surface/SurfaceNode.cs b/Source/Editor/Surface/SurfaceNode.cs index ad74f58ae..56c327f49 100644 --- a/Source/Editor/Surface/SurfaceNode.cs +++ b/Source/Editor/Surface/SurfaceNode.cs @@ -135,7 +135,7 @@ namespace FlaxEditor.Surface /// The node archetype. /// The group archetype. public SurfaceNode(uint id, VisjectSurfaceContext context, NodeArchetype nodeArch, GroupArchetype groupArch) - : base(context, nodeArch.Size.X + Constants.NodeMarginX * 2, nodeArch.Size.Y + Constants.NodeMarginY * 2 + Constants.NodeHeaderSize + Constants.NodeFooterSize) + : base(context, nodeArch.Size.X + Constants.NodeMarginX * 2, nodeArch.Size.Y + Constants.NodeMarginY * 2 + Constants.NodeHeaderHeight + Constants.NodeFooterSize) { Title = nodeArch.Title; ID = id; @@ -173,7 +173,7 @@ namespace FlaxEditor.Surface /// The node control total size. protected virtual Float2 CalculateNodeSize(float width, float height) { - return new Float2(width + Constants.NodeMarginX * 2, height + Constants.NodeMarginY * 2 + Constants.NodeHeaderSize + Constants.NodeFooterSize); + return new Float2(width + Constants.NodeMarginX * 2, height + Constants.NodeMarginY * 2 + Constants.NodeHeaderHeight + Constants.NodeFooterSize); } /// @@ -227,25 +227,28 @@ namespace FlaxEditor.Surface var child = Children[i]; if (!child.Visible) continue; + // Input boxes if (child is InputBox inputBox) { var boxWidth = boxLabelFont.MeasureText(inputBox.Text).X + 20; if (inputBox.DefaultValueEditor != null) boxWidth += inputBox.DefaultValueEditor.Width + 4; leftWidth = Mathf.Max(leftWidth, boxWidth); - leftHeight = Mathf.Max(leftHeight, inputBox.Archetype.Position.Y - Constants.NodeMarginY - Constants.NodeHeaderSize + 20.0f); + leftHeight = Mathf.Max(leftHeight, inputBox.Archetype.Position.Y - Constants.NodeMarginY - Constants.NodeHeaderHeight + 20.0f); } + // Output boxes else if (child is OutputBox outputBox) { rightWidth = Mathf.Max(rightWidth, boxLabelFont.MeasureText(outputBox.Text).X + 20); - rightHeight = Mathf.Max(rightHeight, outputBox.Archetype.Position.Y - Constants.NodeMarginY - Constants.NodeHeaderSize + 20.0f); + rightHeight = Mathf.Max(rightHeight, outputBox.Archetype.Position.Y - Constants.NodeMarginY - Constants.NodeHeaderHeight + 20.0f); } + // Other controls in the node else if (child is Control control) { if (control.AnchorPreset == AnchorPresets.TopLeft) { width = Mathf.Max(width, control.Right + 4 - Constants.NodeMarginX); - height = Mathf.Max(height, control.Bottom + 4 - Constants.NodeMarginY - Constants.NodeHeaderSize); + height = Mathf.Max(height, control.Bottom + 4 - Constants.NodeMarginY - Constants.NodeHeaderHeight); } else if (!_headerRect.Intersects(control.Bounds)) { @@ -337,6 +340,10 @@ namespace FlaxEditor.Surface Elements.Add(element); if (element is Control control) AddChild(control); + + // TODO: Perform this at a better time instead of every time an element gets added. + if (!Archetype.UseFixedSize) + ResizeAuto(); } /// @@ -377,7 +384,7 @@ namespace FlaxEditor.Surface // Sync properties for exiting box box.Text = text; box.CurrentType = type; - box.Y = Constants.NodeMarginY + Constants.NodeHeaderSize + yLevel * Constants.LayoutOffsetY; + box.Y = Constants.NodeMarginY + Constants.NodeHeaderHeight + yLevel * Constants.LayoutOffsetY; } // Update box @@ -1040,7 +1047,7 @@ namespace FlaxEditor.Surface protected override void UpdateRectangles() { const float footerSize = Constants.NodeFooterSize; - const float headerSize = Constants.NodeHeaderSize; + const float headerSize = Constants.NodeHeaderHeight; const float closeButtonMargin = Constants.NodeCloseButtonMargin; const float closeButtonSize = Constants.NodeCloseButtonSize; _headerRect = new Rectangle(0, 0, Width, headerSize);