3 using System.Collections.Generic;
5 using System.Threading.Tasks;
7 using Xamarin.Forms.Internals;
8 using Xamarin.Forms.Platform.Tizen;
9 using XForms = Xamarin.Forms.Forms;
11 namespace Tizen.Wearable.CircularUI.Forms.Renderer
13 class SimpleViewStack : Box
17 public SimpleViewStack(EvasObject parent) : base(parent)
19 InternalStack = new List<EvasObject>();
20 SetLayoutCallback(OnLayout);
23 List<EvasObject> InternalStack { get; set; }
25 public IReadOnlyList<EvasObject> Stack => InternalStack;
27 public void Push(EvasObject view)
29 InternalStack.Add(view);
38 var tobeRemoved = _lastTop;
39 InternalStack.Remove(tobeRemoved);
43 // if Pop was called by removed page,
44 // Unrealize cause deletation of NativeCallback, it could be a cause of crash
45 Device.BeginInvokeOnMainThread(() =>
47 tobeRemoved.Unrealize();
52 public void PopToRoot()
54 while (InternalStack.Count > 1)
60 public void Insert(EvasObject before, EvasObject view)
63 var idx = InternalStack.IndexOf(before);
64 InternalStack.Insert(idx, view);
69 public void Remove(EvasObject view)
71 InternalStack.Remove(view);
74 Device.BeginInvokeOnMainThread(() =>
82 if (_lastTop != InternalStack.LastOrDefault())
85 _lastTop = InternalStack.LastOrDefault();
92 foreach (var view in Stack)
94 view.Geometry = Geometry;
100 public class ShellSectionNavigationRenderer : IShellItemRenderer
102 SimpleViewStack _viewStack;
103 IShellItemRenderer _rootPageRenderer;
105 public ShellSectionNavigationRenderer(ShellSection item)
108 (ShellSection as IShellSectionController).NavigationRequested += OnNavigationRequested;
109 InitializeComponent();
112 public ShellSection ShellSection { get; protected set; }
114 public BaseShellItem Item => ShellSection;
116 public EvasObject NativeView => _viewStack;
118 public void Dispose()
123 protected virtual void Dispose(bool disposing)
127 _rootPageRenderer?.Dispose();
128 _viewStack?.Unrealize();
129 (ShellSection as IShellSectionController).NavigationRequested -= OnNavigationRequested;
133 void InitializeComponent()
135 _viewStack = new SimpleViewStack(XForms.NativeParent);
138 _rootPageRenderer = ShellRendererFactory.Default.CreateItemRenderer(ShellSection);
139 _viewStack.Push(_rootPageRenderer.NativeView);
142 void OnInsertRequest(NavigationRequestedEventArgs request)
144 var before = Platform.GetRenderer(request.BeforePage)?.NativeView ?? null;
147 request.Task = Task.FromException<bool>(new ArgumentException("Can't found page on stack", nameof(request.BeforePage)));
150 var renderer = Platform.GetOrCreateRenderer(request.Page);
151 _viewStack.Insert(before, renderer.NativeView);
152 request.Task = Task.FromResult(true);
155 void OnPushRequest(NavigationRequestedEventArgs request)
157 var renderer = Platform.GetOrCreateRenderer(request.Page);
158 _viewStack.Push(renderer.NativeView);
159 request.Task = Task.FromResult(true);
162 void OnPopRequest(NavigationRequestedEventArgs request)
165 request.Task = Task.FromResult(true);
168 void OnPopToRootRequest(NavigationRequestedEventArgs request)
170 _viewStack.PopToRoot();
171 request.Task = Task.FromResult(true);
174 void OnRemoveRequest(NavigationRequestedEventArgs request)
176 var renderer = Platform.GetRenderer(request.Page);
177 if (renderer == null)
179 request.Task = Task.FromException<bool>(new ArgumentException("Can't found page on stack", nameof(request.Page)));
182 _viewStack.Remove(renderer.NativeView);
183 request.Task = Task.FromResult(true);
186 void OnNavigationRequested(object sender, NavigationRequestedEventArgs e)
188 switch (e.RequestType)
190 case NavigationRequestType.Insert:
193 case NavigationRequestType.Push:
196 case NavigationRequestType.Pop:
199 case NavigationRequestType.PopToRoot:
200 OnPopToRootRequest(e);
202 case NavigationRequestType.Remove: