New way of layout 12/125912/8
authorPiotr Bereza <p.bereza@samsung.com>
Wed, 22 Mar 2017 15:45:27 +0000 (16:45 +0100)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Tue, 25 Apr 2017 05:07:54 +0000 (07:07 +0200)
Change-Id: I827d199fdc9be0f62a2a149ed2bd943c5ab76056
Signed-off-by: Piotr Bereza <p.bereza@samsung.com>
Xamarin.Forms.Platform.Tizen/Cells/EntryCellRenderer.cs
Xamarin.Forms.Platform.Tizen/Cells/ViewCellRenderer.cs
Xamarin.Forms.Platform.Tizen/Native/Box.cs
Xamarin.Forms.Platform.Tizen/Native/LayoutEventArgs.cs
Xamarin.Forms.Platform.Tizen/Native/ListView.cs
Xamarin.Forms.Platform.Tizen/Native/SearchBar.cs
Xamarin.Forms.Platform.Tizen/Renderers/ContentPageRenderer.cs
Xamarin.Forms.Platform.Tizen/Renderers/FrameRenderer.cs
Xamarin.Forms.Platform.Tizen/Renderers/LayoutRenderer.cs
Xamarin.Forms.Platform.Tizen/Renderers/VisualElementRenderer.cs

index 5db9239..1088d5c 100644 (file)
@@ -54,17 +54,21 @@ namespace Xamarin.Forms.Platform.Tizen
                                                entry
                                        }
                                };
-                               layout.Parent = cell.Parent;
+                               layout.Parent = cell;
                                layout.BindingContext = entryCell;
                                layout.MinimumHeightRequest = Forms.ConvertToScaledDP(pixelHeight);
 
-                               var nativeView = Platform.GetOrCreateRenderer(layout).NativeView;
+                               var renderer = Platform.GetOrCreateRenderer(layout);
+                               (renderer as LayoutRenderer)?.RegisterOnLayoutUpdated();
+
+                               var nativeView = renderer.NativeView;
                                nativeView.MinimumHeight = pixelHeight;
                                _cacheCandidate[nativeView] = layout;
                                nativeView.Deleted += (sender, e) =>
                                {
                                        _cacheCandidate.Remove(sender as EvasObject);
                                };
+
                                return nativeView;
                        }
                        return null;
index 38062c7..261c717 100644 (file)
@@ -49,6 +49,8 @@ namespace Xamarin.Forms.Platform.Tizen
                                height = height > 0 ? height : FindCellContentHeight(viewCell);
 
                                renderer.NativeView.MinimumHeight = Forms.ConvertToScaledPixel(height);
+                               (renderer as LayoutRenderer)?.RegisterOnLayoutUpdated();
+
                                return renderer.NativeView;
                        }
                        return null;
@@ -80,6 +82,7 @@ namespace Xamarin.Forms.Platform.Tizen
                        {
                                _cacheCandidate.Remove((EvasObject)sender);
                        };
+                       (renderer as LayoutRenderer)?.RegisterOnLayoutUpdated();
 
                        return renderer.NativeView;
                }
index 2f55190..e2550e1 100644 (file)
@@ -40,24 +40,24 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                /// </remarks>
                void NotifyOnLayout()
                {
-                       var g = Geometry;
-
-                       if (0 == g.Width || 0 == g.Height)
-                       {
-                               // ignore irrelevant dimensions
-                               return;
-                       }
                        if (null != LayoutUpdated)
                        {
+                               var g = Geometry;
+
+                               if (0 == g.Width || 0 == g.Height || g == _previousGeometry)
+                               {
+                                       // ignore irrelevant dimensions
+                                       return;
+                               }
+
                                LayoutUpdated(this, new LayoutEventArgs()
                                        {
-                                               HasChanged = g != _previousGeometry,
                                                Geometry = g,
                                        }
                                );
-                       }
 
-                       _previousGeometry = g;
+                               _previousGeometry = g;
+                       }
                }
        }
 }
index 060a121..ddad803 100644 (file)
@@ -9,21 +9,12 @@ namespace Xamarin.Forms.Platform.Tizen.Native
        public class LayoutEventArgs : EventArgs
        {
                /// <summary>
-               /// Whether or not the dimensions have changed.
-               /// </summary>
-               public bool HasChanged
-               {
-                       get;
-                       internal set;
-               }
-
-               /// <summary>
                /// Geometry of the layout area, absolute coordinate
                /// </summary>
                public Rect Geometry
                {
                        get;
-                       set;
+                       internal set;
                }
        }
 }
index fed9910..8501df1 100644 (file)
@@ -595,6 +595,8 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                                                        renderer.NativeView.MinimumHeight = Forms.ConvertToScaledPixel(element.MinimumHeightRequest);
                                                }
 
+                                               (renderer as LayoutRenderer)?.RegisterOnLayoutUpdated();
+
                                                return renderer.NativeView;
                                        }
                                };
index db597ed..42ada16 100644 (file)
@@ -399,25 +399,20 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                /// <param name="e">Event arguments.</param>
                void SearchBarLayoutUpdated(object sender, LayoutEventArgs e)
                {
-                       if (!e.HasChanged)
-                       {
-                               return;
-                       }
-
-                       _underlineRectangle.Geometry = new ERect(Geometry.Left + RectanglePaddingHorizontal,
-                                                                                                                        Geometry.Top + EntryPaddingVertical + EntryHeight + RectanglePaddingTop,
-                                                                                                                        Geometry.Width - (RectanglePaddingHorizontal * 2),
-                                                                                                                        RectangleHeight);
-
-                       _entry.Geometry = new ERect(Geometry.Left + EntryPaddingHorizontal,
-                                                                                               Geometry.Top + EntryPaddingVertical,
-                                                                                               Geometry.Width - (EntryPaddingHorizontal + (CancelButtonPaddingHorizontal * 2) + CancelButtonSize),
-                                                                                               EntryHeight);
-
-                       _cancelButton.Geometry = new ERect(Geometry.Right - CancelButtonSize - CancelButtonPaddingHorizontal,
-                                                                                                          Geometry.Top + RectanglePaddingBottom,
-                                                                                                          CancelButtonSize,
-                                                                                                          CancelButtonSize);
+                       _underlineRectangle.Geometry = new ERect(e.Geometry.Left + RectanglePaddingHorizontal,
+                               e.Geometry.Top + EntryPaddingVertical + EntryHeight + RectanglePaddingTop,
+                               e.Geometry.Width - (RectanglePaddingHorizontal * 2),
+                               RectangleHeight);
+
+                       _entry.Geometry = new ERect(e.Geometry.Left + EntryPaddingHorizontal,
+                               e.Geometry.Top + EntryPaddingVertical,
+                               e.Geometry.Width - (EntryPaddingHorizontal + (CancelButtonPaddingHorizontal * 2) + CancelButtonSize),
+                               EntryHeight);
+
+                       _cancelButton.Geometry = new ERect(e.Geometry.Right - CancelButtonSize - CancelButtonPaddingHorizontal,
+                               e.Geometry.Top + RectanglePaddingBottom,
+                               CancelButtonSize,
+                               CancelButtonSize);
                }
        }
 }
index c4f7965..81a00a4 100644 (file)
@@ -43,6 +43,11 @@ namespace Xamarin.Forms.Platform.Tizen
                                _page.Color = Element.BackgroundColor.ToNative();
                }
 
+               protected override void UpdateLayout()
+               {
+                       // empty on purpose
+               }
+
                void UpdateBackgroundImage()
                {
                        if (string.IsNullOrWhiteSpace(Element.BackgroundImage))
@@ -62,4 +67,3 @@ namespace Xamarin.Forms.Platform.Tizen
                }
        }
 }
-
index 0684c4a..0c81577 100644 (file)
@@ -49,34 +49,7 @@ namespace Xamarin.Forms.Platform.Tizen
                        base.OnElementChanged(e);
                }
 
-               void OnLayoutUpdated(object sender, Native.LayoutEventArgs e)
-               {
-                       UpdateGeometry();
-                       // TODO: why is this DoLayout() required?
-                       if (Element.Content != null)
-                               base.DoLayout(e);
-               }
-
-               void UpdateGeometry()
-               {
-                       var geometry = NativeView.Geometry;
-                       DrawFrame(_frame,
-                               geometry.X,
-                               geometry.Y,
-                               geometry.Right,
-                               geometry.Bottom,
-                               _thickness
-                       );
-                       DrawFrame(_shadow,
-                               geometry.X + _shadow_shift,
-                               geometry.Y + _shadow_shift,
-                               geometry.Right - _thickness + _shadow_shift + _shadow_thickness,
-                               geometry.Bottom - _thickness + _shadow_shift + _shadow_thickness,
-                               _shadow_thickness
-                       );
-               }
-
-               void DrawFrame(Polygon frame, int left, int top, int right, int bottom, int thickness)
+               static void DrawFrame(Polygon frame, int left, int top, int right, int bottom, int thickness)
                {
                        frame.ClearPoints();
                        if (left + thickness >= right || top + thickness >= bottom)
@@ -104,6 +77,30 @@ namespace Xamarin.Forms.Platform.Tizen
                        frame.AddPoint(left, top + thickness);
                }
 
+               void OnLayoutUpdated(object sender, Native.LayoutEventArgs e)
+               {
+                       UpdateGeometry();
+               }
+
+               void UpdateGeometry()
+               {
+                       var geometry = NativeView.Geometry;
+                       DrawFrame(_frame,
+                               geometry.X,
+                               geometry.Y,
+                               geometry.Right,
+                               geometry.Bottom,
+                               _thickness
+                       );
+                       DrawFrame(_shadow,
+                               geometry.X + _shadow_shift,
+                               geometry.Y + _shadow_shift,
+                               geometry.Right - _thickness + _shadow_shift + _shadow_thickness,
+                               geometry.Bottom - _thickness + _shadow_shift + _shadow_thickness,
+                               _shadow_thickness
+                       );
+               }
+
                void UpdateColor()
                {
                        if (Element.OutlineColor.IsDefault)
@@ -119,6 +116,5 @@ namespace Xamarin.Forms.Platform.Tizen
                        else
                                _shadow.Hide();
                }
-
        }
 }
index bf36afa..2f723f3 100644 (file)
@@ -7,6 +7,8 @@ namespace Xamarin.Forms.Platform.Tizen
        /// </summary>
        public class LayoutRenderer : ViewRenderer<Layout, Native.Canvas>
        {
+               bool _isLayoutUpdatedRegistered = false;
+
                /// <summary>
                /// Default constructor.
                /// </summary>
@@ -14,12 +16,20 @@ namespace Xamarin.Forms.Platform.Tizen
                {
                }
 
+               public void RegisterOnLayoutUpdated()
+               {
+                       if (!_isLayoutUpdatedRegistered)
+                       {
+                               Control.LayoutUpdated += OnLayoutUpdated;
+                               _isLayoutUpdatedRegistered = true;
+                       }
+               }
+
                protected override void OnElementChanged(ElementChangedEventArgs<Layout> e)
                {
                        if (null == Control)
                        {
                                var canvas = new Native.Canvas(Forms.Context.MainWindow);
-                               canvas.LayoutUpdated += OnLayoutUpdated;
                                SetNativeControl(canvas);
                        }
 
@@ -28,7 +38,10 @@ namespace Xamarin.Forms.Platform.Tizen
 
                protected override void Dispose(bool disposing)
                {
-                       Control.LayoutUpdated -= OnLayoutUpdated;
+                       if (_isLayoutUpdatedRegistered)
+                       {
+                               Control.LayoutUpdated -= OnLayoutUpdated;
+                       }
 
                        base.Dispose(disposing);
                }
index 512e304..59b5fde 100644 (file)
@@ -44,9 +44,7 @@ namespace Xamarin.Forms.Platform.Tizen
 
                HashSet<string> _batchedProperties = new HashSet<string>();
 
-               int _layoutCallback = 0;
                bool _movedCallbackEnabled = false;
-
                /// <summary>
                /// Default constructor.
                /// </summary>
@@ -256,21 +254,10 @@ namespace Xamarin.Forms.Platform.Tizen
 
                protected virtual void UpdateLayout()
                {
-                       // we're updating the coordinates of native control only if they were modified
-                       // via Xamarin (IsNativeLayouting() returns false);
-                       // otherwise native control is already in the right place
-                       if (!IsNativeLayouting() && null != NativeView)
+                       if (null != NativeView)
                        {
                                UpdateNativeGeometry();
                        }
-
-                       // we're updating just immediate children
-                       // To update the relative postion of children
-                       var logicalChildren = (Element as IElementController).LogicalChildren;
-                       foreach (var child in logicalChildren)
-                       {
-                               Platform.GetRenderer(child)?.UpdateNativeGeometry();
-                       }
                }
 
                /// <summary>
@@ -470,12 +457,10 @@ namespace Xamarin.Forms.Platform.Tizen
                {
                        if (_flags.HasFlag(VisualElementRendererFlags.NeedsLayout))
                        {
-                               if (!IsNativeLayouting())
-                               {
-                                       UpdateNativeGeometry();
-                                       // UpdateLayout already updates transformation, clear NeedsTranformation flag then
-                                       _flags &= ~VisualElementRendererFlags.NeedsTransformation;
-                               }
+                               UpdateLayout();
+                               // UpdateLayout already updates transformation, clear NeedsTranformation flag then
+                               _flags &= ~VisualElementRendererFlags.NeedsTransformation;
+
                                _flags ^= VisualElementRendererFlags.NeedsLayout;
                        }
                        if (_flags.HasFlag(VisualElementRendererFlags.NeedsTransformation))
@@ -558,16 +543,7 @@ namespace Xamarin.Forms.Platform.Tizen
 
                protected void DoLayout(Native.LayoutEventArgs e)
                {
-                       EnterNativeLayoutCallback();
-                       if (e.HasChanged)
-                       {
-                               var bound = e.Geometry.ToDP();
-                               bound.X = Element.X;
-                               bound.Y = Element.Y;
-                               Element.Layout(bound);
-                               UpdateLayout();
-                       }
-                       LeaveNativeLayoutCallback();
+                       Element.Layout(e.Geometry.ToDP());
                }
 
                protected virtual Size MinimumSize()
@@ -610,12 +586,12 @@ namespace Xamarin.Forms.Platform.Tizen
 
                static double ComputeAbsoluteX(VisualElement e)
                {
-                       return e.X + (e.RealParent is VisualElement ? Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).NativeView.Geometry.X) : 0.0);
+                       return e.X + ((e.RealParent is VisualElement) && !(e.RealParent is ListView) ? Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).NativeView.Geometry.X) : 0.0);
                }
 
                static double ComputeAbsoluteY(VisualElement e)
                {
-                       return e.Y + (e.RealParent is VisualElement ? Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).NativeView.Geometry.Y) : 0.0);
+                       return e.Y + ((e.RealParent is VisualElement) && !(e.RealParent is ListView) ? Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).NativeView.Geometry.Y) : 0.0);
                }
 
                static Point ComputeAbsolutePoint(VisualElement e)
@@ -1048,18 +1024,5 @@ namespace Xamarin.Forms.Platform.Tizen
 
                        return EFocusDirection.Next;
                }
-
-               void EnterNativeLayoutCallback()
-               {
-                       _layoutCallback++;
-               }
-               void LeaveNativeLayoutCallback()
-               {
-                       _layoutCallback--;
-               }
-               bool IsNativeLayouting()
-               {
-                       return _layoutCallback > 0;
-               }
        }
 }