Refactor NavigationStack
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Wed, 23 Dec 2020 10:24:10 +0000 (11:24 +0100)
committerPiotr Czaja <p.czaja@samsung.com>
Tue, 14 Sep 2021 11:01:34 +0000 (13:01 +0200)
Fitness/Controls/NavigationStack.cs
Fitness/Services/NavigationService.cs

index 9126ab3e12bdecfc76082f325e169d1c092fbeff..274b3b62075782f4b02fbaa637103a3ef500fbf0 100644 (file)
@@ -1,4 +1,6 @@
+using System;
 using System.Collections.Generic;
+using System.Linq;
 using Fitness.Services;
 using Tizen.NUI;
 using Tizen.NUI.BaseComponents;
@@ -11,8 +13,6 @@ namespace Fitness.Controls
     /// </summary>
     public class NavigationStack : Control, INavigationStack
     {
-        private Stack<Page> pages = new Stack<Page>();
-
         public NavigationStack()
             : base()
         {
@@ -20,55 +20,83 @@ namespace Fitness.Controls
             HeightResizePolicy = ResizePolicyType.FillToParent;
         }
 
-        public List<Page> Pages { get => new List<Page>(pages); }
+        public List<Page> Pages { get => Children.ConvertAll(x => (Page)x); }
 
         public void Push(Page page)
         {
-            if (pages.TryPeek(out Page last))
-            {
-                last.ConnectedPage = page;
-                last.InvokeDisappearing();
-            }
-
-            page.ConnectedPage = last;
             Add(page);
-            pages.Push(page);
-            page.InvokeAppearing();
         }
 
         public void Pop()
         {
-            PopLast();
-            ShowLast();
+            if (Children.Count > 0)
+            {
+                Remove(Children[Children.Count - 1]);
+            }
         }
 
         public void PopToRoot()
         {
-            while (pages.Count > 1)
+            while (Children.Count > 1)
             {
-                PopLast();
+                Pop();
             }
+        }
+
+        public override void Add(View child)
+        {
+            if (child is Page page)
+            {
+                var last = PeekPage();
+                if (last != null)
+                {
+                    ConnectPages(last, page);
+                    HideLast();
+                }
 
-            ShowLast();
+                base.Add(child);
+                ShowLast();
+            }
+            else
+            {
+                throw new ArgumentException("Only Pages can be added to NavigationStack");
+            }
         }
 
-        private void PopLast()
+        public override void Remove(View child)
         {
-            if (pages.TryPeek(out Page last))
+            if (child is Page page)
             {
-                last.InvokeDisappearing();
-                Remove(last);
-                pages.Pop();
+                HideLast();
+                base.Remove(child);
+                ShowLast();
             }
         }
 
         private void ShowLast()
         {
-            if (pages.TryPeek(out Page current))
+            PeekPage()?.InvokeAppearing();
+        }
+
+        private void HideLast()
+        {
+            PeekPage()?.InvokeDisappearing();
+        }
+
+        private Page PeekPage()
+        {
+            if (Children.Count > 0)
             {
-                current.InvokeAppearing();
-                current.Show();
+                return Children[Children.Count - 1] as Page;
             }
+
+            return null;
+        }
+
+        private void ConnectPages(Page page1, Page page2)
+        {
+            page1.ConnectedPage = page2;
+            page2.ConnectedPage = page1;
         }
     }
 }
index 239b28567240da923cb00070e7c9bd78a927d236..0e4dce98782fe4cd22b80fb2925e57dfc4c36ea3 100644 (file)
@@ -92,7 +92,7 @@ namespace Fitness.Services
         {
             var pages = navigation.Pages;
 
-            for (int i = pages.Count - 1; i > 0; i--)
+            for (int i = 0; i < pages.Count - 1; i++)
             {
                 navigation.Remove(pages[i]);
             }