picoe / Eto

Cross platform GUI framework for desktop and mobile applications in .NET
Other
3.61k stars 327 forks source link

PointToScreen() doesn't respect the spacing set in parent DynamicLayout. An eto bug. #2651

Open WileyNg opened 4 months ago

WileyNg commented 4 months ago

Expected Behavior

PointToScreen should produce accurate result.

Actual Behavior

PointToScreen() doesn't take into account of the spacing/padding and it is always shifted whenever parent DynamicLayout has padding or spacing.

Code that Demonstrates the Problem

[Paste your code here]
```C#
            var form = new Eto.Forms.Form();
            var targetButton = new Button { Text = "target button" }
            var layout = new DynamicLayout();
             layout.BeginVertical(new Padding(12, 12, 0, 0));
            layout.AddRow(new Button {Text="Testing" });
            layout.AddRow(new Button {Text="Testing2" });
            layout.EndBeginVertical(new Padding(34, 14, 16, 2), spacing: new Size(12, 6));
            layout.AddRow(targetButton);
            layout.AddRow(new Button { Text = "Testing" });

            Rhino.RhinoApp.WriteLine($"{parentControl.PointFromScreen(targetButton.PointToScreen(new PointF(0, 0)))}"); 
            // the point printed is wrong. it doesn't take into account of the spacing 

        /// <summary>
        /// PointToScreen doesn't respect the spacing set in parent DynamicLayout. An eto bug.
        /// </summary>
        /// <param name="parentControl"></param>
        /// <returns></returns>
        private PointF FindTrueTopLeftPointInControl(Control parentControl)
        {
            var yOffset = 0f;
            var xOffset = 0f;
            if (Parent is DynamicLayout dl)
            {
                foreach (var rows in dl.Rows)
                    foreach (DynamicTable row in rows)
                        for (int i = 1; i < row.Rows.Count; i++)
                            if (row.Rows[i][0] is DynamicControl dc)
                                if (dc.Control is CustomButton cb)
                                    if (cb == this)
                                    {
                                        yOffset = row.Spacing.Value.Height / 2f;
                                        break;

                                    }
                if (parentControl is Popup popup && popup.HasShadow)
                {
                    yOffset += Settings.Instance.General.ShadowPadding;
                    xOffset = Settings.Instance.General.ShadowPadding;
                }
            }
            return parentControl.PointFromScreen(PointToScreen(new PointF(-xOffset, -yOffset)));

        }
<!-- Please specify the version of Eto and all platforms this can be reproduced in -->
## Specifications

  - Version:
  - Platform(s): Rhino 7 in Windows 11
  - Operating System(s):  E.g. Windows 11