[NUI] Calculate correct MatchParent size for ContentPage and TabView
authorJaehyun Cho <jae_hyun.cho@samsung.com>
Mon, 17 May 2021 12:18:01 +0000 (21:18 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Fri, 21 May 2021 07:37:43 +0000 (16:37 +0900)
Currently, WidthSpecification and HeightSpecification are updated
internally.

e.g.
In the beginning, WidthSpecification = LayoutParamPolicies.MatchParent;
After size calculation, WidthSpecification = 1280;

Until the above issue is resolved, ContentPage and TabView changes its
size calculation logic to calculate its MatchParent children size
correctly.

src/Tizen.NUI.Components/Controls/Navigation/ContentPage.cs
src/Tizen.NUI.Components/Controls/TabView.cs

index 2a0be89..33e68ea 100755 (executable)
@@ -168,17 +168,20 @@ namespace Tizen.NUI.Components
 
                 appBar.Position2D = new Position2D(appBarPosX, appBarPosY);
 
-                if ((appBar.WidthSpecification == LayoutParamPolicies.MatchParent) || (appBar.HeightSpecification == LayoutParamPolicies.MatchParent))
+                // FIXME: Now, WidthSpecification/HeightSpecification are updated internally.
+                //        When this is resolved, comparing Specification with Size is removed.
+                if ((appBar.WidthSpecification == LayoutParamPolicies.MatchParent) || (appBar.HeightSpecification == LayoutParamPolicies.MatchParent) ||
+                    (appBar.WidthSpecification > Size2D.Width) || (appBar.HeightSpecification > Size2D.Height))
                 {
                     int appBarSizeW = appBar.Size2D.Width;
                     int appBarSizeH = appBar.Size2D.Height;
 
-                    if (appBar.WidthSpecification == LayoutParamPolicies.MatchParent)
+                    if ((appBar.WidthSpecification == LayoutParamPolicies.MatchParent) || (appBar.WidthSpecification > Size2D.Width))
                     {
                         appBarSizeW = Size2D.Width - Padding.Start - Padding.End - appBar.Margin.Start - appBar.Margin.End;
                     }
 
-                    if (appBar.HeightSpecification == LayoutParamPolicies.MatchParent)
+                    if ((appBar.HeightSpecification == LayoutParamPolicies.MatchParent) || (appBar.HeightSpecification > Size2D.Height))
                     {
                         appBarSizeH = Size2D.Height - Padding.Top - Padding.Bottom - appBar.Margin.Top - appBar.Margin.Bottom;
                     }
@@ -194,7 +197,10 @@ namespace Tizen.NUI.Components
 
                 content.Position2D = new Position2D(contentPosX, contentPosY);
 
-                if ((content.WidthSpecification == LayoutParamPolicies.MatchParent) || (content.HeightSpecification == LayoutParamPolicies.MatchParent))
+                // FIXME: Now, WidthSpecification/HeightSpecification are updated internally.
+                //        When this is resolved, comparing Specification with Size is removed.
+                if ((content.WidthSpecification == LayoutParamPolicies.MatchParent) || (content.HeightSpecification == LayoutParamPolicies.MatchParent) ||
+                    (content.WidthSpecification > Size2D.Width) || (content.HeightSpecification > Size2D.Height))
                 {
                     int contentSizeW = content.Size2D.Width;
                     int contentSizeH = content.Size2D.Height;
index c8fbfc1..fd8d216 100755 (executable)
@@ -91,12 +91,16 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 9 </since_tizen>
         public TabView()
         {
-            Layout = new LinearLayout() { LinearOrientation = LinearLayout.Orientation.Vertical };
+            // FIXME: Now, WidthSpecification/HeightSpecification are updated internally.
+            //        When this is resolved, LinearLayout can be used.
+            Layout = new AbsoluteLayout();
             WidthSpecification = LayoutParamPolicies.MatchParent;
             HeightSpecification = LayoutParamPolicies.MatchParent;
 
-            InitTabBar();
             InitContent();
+            InitTabBar();
+
+            CalculatePosition();
         }
 
         private void InitTabBar()
@@ -202,6 +206,15 @@ namespace Tizen.NUI.Components
 
         /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
+        public override void OnRelayout(Vector2 size, RelayoutContainer container)
+        {
+            base.OnRelayout(size, container);
+
+            CalculatePosition();
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void Dispose(DisposeTypes type)
         {
             if (disposed)
@@ -225,5 +238,75 @@ namespace Tizen.NUI.Components
 
             base.Dispose(type);
         }
+
+        private void CalculatePosition()
+        {
+            // If TabView size has not been set yet, then content size cannot be calculated.
+            if ((Size2D.Width == 0) && (Size2D.Height == 0))
+            {
+                return;
+            }
+
+            if (tabBar != null)
+            {
+                // FIXME: Now, WidthSpecification/HeightSpecification are updated internally.
+                //        When this is resolved, comparing Specification with Size is removed.
+                if ((tabBar.WidthSpecification == LayoutParamPolicies.MatchParent) || (tabBar.HeightSpecification == LayoutParamPolicies.MatchParent) ||
+                    (tabBar.WidthSpecification > Size.Width) || (tabBar.HeightSpecification > Size.Height))
+                {
+                    int tabBarSizeW = tabBar.Size2D.Width;
+                    int tabBarSizeH = tabBar.Size2D.Height;
+
+                    if ((tabBar.WidthSpecification == LayoutParamPolicies.MatchParent) || (tabBar.WidthSpecification > Size.Width))
+                    {
+                        tabBarSizeW = Size2D.Width - Padding.Start - Padding.End - tabBar.Margin.Start - tabBar.Margin.End;
+                    }
+
+                    if ((tabBar.HeightSpecification == LayoutParamPolicies.MatchParent) || (tabBar.HeightSpecification > Size.Height))
+                    {
+                        tabBarSizeH = Size2D.Height - Padding.Top - Padding.Bottom - tabBar.Margin.Top - tabBar.Margin.Bottom;
+                    }
+
+                    tabBar.Size2D = new Size2D(tabBarSizeW, tabBarSizeH);
+                }
+            }
+
+            if (content != null)
+            {
+                int contentPosX = Padding.Start + content.Margin.Start;
+                int contentPosY = Padding.Top + content.Margin.Top;
+
+                content.Position = new Position(contentPosX, contentPosY);
+
+                // FIXME: Now, WidthSpecification/HeightSpecification are updated internally.
+                //        When this is resolved, comparing Specification with Size is removed.
+                if ((content.WidthSpecification == LayoutParamPolicies.MatchParent) || (content.HeightSpecification == LayoutParamPolicies.MatchParent) ||
+                    (content.WidthSpecification > Size.Width) || (content.HeightSpecification > Size.Height))
+                {
+                    int contentSizeW = content.Size2D.Width;
+                    int contentSizeH = content.Size2D.Height;
+
+                    if ((content.WidthSpecification == LayoutParamPolicies.MatchParent) || (content.WidthSpecification > Size.Width))
+                    {
+                        contentSizeW = Size2D.Width - Padding.Start - Padding.End - content.Margin.Start - content.Margin.End;
+                    }
+
+                    if ((content.HeightSpecification == LayoutParamPolicies.MatchParent) || (content.HeightSpecification > Size.Height))
+                    {
+                        contentSizeH = Size2D.Height - Padding.Top - Padding.Bottom - content.Margin.Top - content.Margin.Bottom - (tabBar?.Size2D.Height ?? 0);
+                    }
+
+                    content.Size2D = new Size2D(contentSizeW, contentSizeH);
+                }
+            }
+
+            if (tabBar != null)
+            {
+                int tabBarPosX = Padding.Start + tabBar.Margin.Start;
+                int tabBarPosY = /*Padding.Top +*/ tabBar.Margin.Top + (content?.Size2D.Height ?? 0);
+
+                tabBar.Position = new Position(tabBarPosX, tabBarPosY);
+            }
+        }
     }
 }