Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 4361949

Browse files
authored
[Tizen] Optimize Shell Flyout for TV (#13833)
1 parent 24cde8e commit 4361949

20 files changed

+1250
-64
lines changed

Xamarin.Forms.Platform.Tizen/Native/CollectionView/EmptyItemAdaptor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public override EvasObject CreateNativeView(int index, EvasObject parent)
4747
View emptyView = null;
4848
if (ItemTemplate is DataTemplateSelector selector)
4949
{
50-
emptyView = selector.SelectTemplate(this[index], _itemsView).CreateContent() as View;
50+
emptyView = selector.SelectTemplate(this[index], Element).CreateContent() as View;
5151
}
5252
else
5353
{
@@ -68,7 +68,7 @@ public override EvasObject CreateNativeView(int index, EvasObject parent)
6868
layout.Children.Add(footer);
6969
}
7070

71-
layout.Parent = _itemsView;
71+
layout.Parent = Element;
7272
var renderer = Platform.GetOrCreateRenderer(layout);
7373
(renderer as ILayoutRenderer)?.RegisterOnLayoutUpdated();
7474
return renderer.NativeView;

Xamarin.Forms.Platform.Tizen/Native/CollectionView/ItemTemplateAdaptor.cs

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,24 @@ public class ItemTemplateAdaptor : ItemAdaptor
4747
{
4848
Dictionary<EvasObject, View> _nativeFormsTable = new Dictionary<EvasObject, View>();
4949
Dictionary<object, View> _dataBindedViewTable = new Dictionary<object, View>();
50-
protected ItemsView _itemsView;
5150
protected View _headerCache;
5251
protected View _footerCache;
5352

54-
bool IsSelectable { get; }
55-
56-
5753
public ItemTemplateAdaptor(ItemsView itemsView) : this(itemsView, itemsView.ItemsSource, itemsView.ItemTemplate) { }
5854

59-
protected ItemTemplateAdaptor(ItemsView itemsView, IEnumerable items, DataTemplate template) : base(items)
55+
protected ItemTemplateAdaptor(Element itemsView, IEnumerable items, DataTemplate template) : base(items)
6056
{
6157
ItemTemplate = template;
62-
_itemsView = itemsView;
58+
Element = itemsView;
6359
IsSelectable = itemsView is SelectableItemsView;
6460
}
6561

6662
protected DataTemplate ItemTemplate { get; set; }
6763

64+
protected Element Element { get; set; }
65+
66+
protected virtual bool IsSelectable { get; }
67+
6868
public View GetTemplatedView(EvasObject evasObject)
6969
{
7070
return _nativeFormsTable[evasObject];
@@ -84,7 +84,7 @@ public override object GetViewCategory(int index)
8484
{
8585
if (ItemTemplate is DataTemplateSelector selector)
8686
{
87-
return selector.SelectTemplate(this[index], _itemsView);
87+
return selector.SelectTemplate(this[index], Element);
8888
}
8989
return base.GetViewCategory(index);
9090
}
@@ -94,15 +94,16 @@ public override EvasObject CreateNativeView(int index, EvasObject parent)
9494
View view = null;
9595
if (ItemTemplate is DataTemplateSelector selector)
9696
{
97-
view = selector.SelectTemplate(this[index], _itemsView).CreateContent() as View;
97+
view = selector.SelectTemplate(this[index], Element).CreateContent() as View;
9898
}
9999
else
100100
{
101101
view = ItemTemplate.CreateContent() as View;
102102
}
103103
var renderer = Platform.GetOrCreateRenderer(view);
104104
var native = renderer.NativeView;
105-
view.Parent = _itemsView;
105+
106+
view.Parent = Element;
106107
(renderer as ILayoutRenderer)?.RegisterOnLayoutUpdated();
107108

108109
_nativeFormsTable[native] = view;
@@ -119,7 +120,7 @@ public override EvasObject GetHeaderView(EvasObject parent)
119120
_headerCache = CreateHeaderView();
120121
if (_headerCache != null)
121122
{
122-
_headerCache.Parent = _itemsView;
123+
_headerCache.Parent = Element;
123124
var renderer = Platform.GetOrCreateRenderer(_headerCache);
124125
(renderer as ILayoutRenderer)?.RegisterOnLayoutUpdated();
125126
return renderer.NativeView;
@@ -132,7 +133,7 @@ public override EvasObject GetFooterView(EvasObject parent)
132133
_footerCache = CreateFooterView();
133134
if (_footerCache != null)
134135
{
135-
_footerCache.Parent = _itemsView;
136+
_footerCache.Parent = Element;
136137
var renderer = Platform.GetOrCreateRenderer(_footerCache);
137138
(renderer as ILayoutRenderer)?.RegisterOnLayoutUpdated();
138139
return renderer.NativeView;
@@ -159,7 +160,7 @@ public override void SetBinding(EvasObject native, int index)
159160
_dataBindedViewTable[this[index]] = view;
160161

161162
view.MeasureInvalidated += OnItemMeasureInvalidated;
162-
_itemsView.AddLogicalChild(view);
163+
AddLogicalChild(view);
163164
}
164165
}
165166

@@ -187,15 +188,15 @@ public override ESize MeasureItem(int index, int widthConstraint, int heightCons
187188
View view = null;
188189
if (ItemTemplate is DataTemplateSelector selector)
189190
{
190-
view = selector.SelectTemplate(this[index], _itemsView).CreateContent() as View;
191+
view = selector.SelectTemplate(this[index], Element).CreateContent() as View;
191192
}
192193
else
193194
{
194195
view = ItemTemplate.CreateContent() as View;
195196
}
196197
using (var renderer = Platform.GetOrCreateRenderer(view))
197198
{
198-
view.Parent = _itemsView;
199+
view.Parent = Element;
199200
if (Count > index)
200201
view.BindingContext = this[index];
201202
var request = view.Measure(Forms.ConvertToScaledDP(widthConstraint), Forms.ConvertToScaledDP(heightConstraint), MeasureFlags.IncludeMargins).Request;
@@ -238,7 +239,7 @@ public override void UpdateViewState(EvasObject view, ViewHolderState state)
238239

239240
protected virtual View CreateHeaderView()
240241
{
241-
if (_itemsView is StructuredItemsView structuredItemsView)
242+
if (Element is StructuredItemsView structuredItemsView)
242243
{
243244
if (structuredItemsView.Header != null)
244245
{
@@ -264,7 +265,7 @@ protected virtual View CreateHeaderView()
264265

265266
protected virtual View CreateFooterView()
266267
{
267-
if (_itemsView is StructuredItemsView structuredItemsView)
268+
if (Element is StructuredItemsView structuredItemsView)
268269
{
269270
if (structuredItemsView.Footer != null)
270271
{
@@ -293,7 +294,7 @@ void ResetBindedView(View view)
293294
if (view.BindingContext != null && _dataBindedViewTable.ContainsKey(view.BindingContext))
294295
{
295296
_dataBindedViewTable[view.BindingContext] = null;
296-
_itemsView.RemoveLogicalChild(view);
297+
RemoveLogicalChild(view);
297298
view.BindingContext = null;
298299
}
299300
}
@@ -307,5 +308,30 @@ void OnItemMeasureInvalidated(object sender, EventArgs e)
307308
CollectionView?.ItemMeasureInvalidated(index);
308309
}
309310
}
311+
312+
void AddLogicalChild(Element element)
313+
{
314+
if (Element is ItemsView iv)
315+
{
316+
iv.AddLogicalChild(element);
317+
}
318+
else
319+
{
320+
element.Parent = Element;
321+
}
322+
}
323+
324+
void RemoveLogicalChild(Element element)
325+
{
326+
if (Element is ItemsView iv)
327+
{
328+
iv.RemoveLogicalChild(element);
329+
}
330+
else
331+
{
332+
element.Parent = null;
333+
}
334+
}
335+
310336
}
311337
}

Xamarin.Forms.Platform.Tizen/Native/CollectionView/LinearLayoutManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public LinearLayoutManager(bool isHorizontal, ItemSizingStrategy sizingStrategy,
4444

4545
public void SizeAllocated(ESize size)
4646
{
47-
Reset();
47+
_scrollCanvasSize = new ESize(0, 0);
4848
_allocatedSize = size;
4949
InitializeMeasureCache();
5050
}

Xamarin.Forms.Platform.Tizen/Native/CollectionView/ViewHolder.cs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class ViewHolder : Box
1818
EvasObject _content;
1919
ViewHolderState _state;
2020
bool _isSelected;
21+
bool _isFocused;
2122

2223
public ViewHolder(EvasObject parent) : base(parent)
2324
{
@@ -58,7 +59,13 @@ public ViewHolderState State
5859
get { return _state; }
5960
set
6061
{
61-
_state = value;
62+
if (value == ViewHolderState.Normal)
63+
_isSelected = false;
64+
else if (value == ViewHolderState.Selected)
65+
_isSelected = true;
66+
67+
_state = _isFocused ? ViewHolderState.Focused : (_isSelected ? ViewHolderState.Selected : ViewHolderState.Normal);
68+
6269
UpdateState();
6370
}
6471
}
@@ -82,7 +89,7 @@ protected void Initialize(EvasObject parent)
8289
_focusArea.SetEffectColor(EColor.Transparent);
8390
_focusArea.Clicked += OnClicked;
8491
_focusArea.Focused += OnFocused;
85-
_focusArea.Unfocused += OnFocused;
92+
_focusArea.Unfocused += OnUnfocused;
8693
_focusArea.KeyUp += OnKeyUp;
8794
_focusArea.RepeatEvents = true;
8895
_focusArea.Show();
@@ -93,14 +100,12 @@ protected void Initialize(EvasObject parent)
93100

94101
protected virtual void OnFocused(object sender, EventArgs e)
95102
{
96-
if (_focusArea.IsFocused)
97-
{
98-
State = ViewHolderState.Focused;
99-
}
100-
else
101-
{
102-
State = _isSelected ? ViewHolderState.Selected : ViewHolderState.Normal;
103-
}
103+
UpdateFocusState();
104+
}
105+
106+
protected virtual void OnUnfocused(object sender, EventArgs e)
107+
{
108+
UpdateFocusState();
104109
}
105110

106111
protected virtual void OnClicked(object sender, EventArgs e)
@@ -129,6 +134,20 @@ protected virtual void UpdateState()
129134
StateUpdated?.Invoke(this, EventArgs.Empty);
130135
}
131136

137+
void UpdateFocusState()
138+
{
139+
if (_focusArea.IsFocused)
140+
{
141+
_isFocused = true;
142+
State = ViewHolderState.Focused;
143+
}
144+
else
145+
{
146+
_isFocused = false;
147+
State = _isSelected ? ViewHolderState.Selected : ViewHolderState.Normal;
148+
}
149+
}
150+
132151
void OnKeyUp(object sender, EvasKeyEventArgs e)
133152
{
134153
if (e.KeyName == "Enter" && _focusArea.IsFocused)

Xamarin.Forms.Platform.Tizen/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
[assembly: ExportHandler(typeof(DropGestureRecognizer), typeof(DropGestureHandler))]
7070

7171
[assembly: ExportRenderer(typeof(Shell), typeof(Xamarin.Forms.Platform.Tizen.Watch.ShellRenderer), TargetIdiom.Watch)]
72+
[assembly: ExportRenderer(typeof(Shell), typeof(Xamarin.Forms.Platform.Tizen.TV.TVShellRenderer), TargetIdiom.TV)]
7273

7374
[assembly: ExportRenderer(typeof(Ellipse), typeof(EllipseRenderer))]
7475
[assembly: ExportRenderer(typeof(Line), typeof(LineRenderer))]

Xamarin.Forms.Platform.Tizen/Shell/ShellItemRenderer.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,23 @@ protected virtual void Dispose(bool disposing)
132132
_disposed = true;
133133
}
134134

135+
protected virtual void UpdateTabsItems()
136+
{
137+
ResetTabs();
138+
if (ShellItem.Items.Count > 1)
139+
{
140+
InitializeTabs();
141+
foreach (ShellSection section in ShellItem.Items)
142+
{
143+
AddTabsItem(section);
144+
}
145+
}
146+
else
147+
{
148+
DeinitializeTabs();
149+
}
150+
}
151+
135152
protected virtual IShellTabs CreateTabs()
136153
{
137154
return new ShellTabs(Forms.NativeParent);
@@ -287,23 +304,6 @@ void UpdateTabBarTitleColor(EColor color)
287304
}
288305
}
289306

290-
void UpdateTabsItems()
291-
{
292-
ResetTabs();
293-
if (ShellItem.Items.Count > 1)
294-
{
295-
InitializeTabs();
296-
foreach (ShellSection section in ShellItem.Items)
297-
{
298-
AddTabsItem(section);
299-
}
300-
}
301-
else
302-
{
303-
DeinitializeTabs();
304-
}
305-
}
306-
307307
void ResetTabs()
308308
{
309309
if (!HasTabs)

Xamarin.Forms.Platform.Tizen/Shell/ShellNavBar.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ void OnMenuClicked(object sender, EventArgs e)
267267
}
268268
else if (_flyoutBehavior == FlyoutBehavior.Flyout)
269269
{
270-
Shell.Current.FlyoutIsPresented = true;
270+
Shell.Current.FlyoutIsPresented = !Shell.Current.FlyoutIsPresented;
271271
}
272272
}
273273

Xamarin.Forms.Platform.Tizen/Shell/ShellRenderer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public ShellRenderer()
2424
RegisterPropertyHandler(Shell.FlyoutHeaderBehaviorProperty, UpdateFlyoutHeaderBehavior);
2525
}
2626

27+
protected INavigationDrawer NavigationDrawer => _drawer;
28+
2729
protected override void OnElementChanged(ElementChangedEventArgs<Shell> e)
2830
{
2931
if (_drawer == null)
@@ -130,7 +132,7 @@ void UpdateFlyoutBackgroundImage()
130132
_navigationView.BackgroundImageSource = Element.FlyoutBackgroundImage;
131133
}
132134

133-
void UpdateFlyoutIsPresented()
135+
protected virtual void UpdateFlyoutIsPresented()
134136
{
135137
// It is workaround of Panel.IsOpen bug, Panel.IsOpen property is not working when layouting was triggered
136138
Device.BeginInvokeOnMainThread(() =>

Xamarin.Forms.Platform.Tizen/Shell/ShellSectionRenderer.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99

1010
namespace Xamarin.Forms.Platform.Tizen
1111
{
12-
public class ShellSectionRenderer : IAppearanceObserver, IDisposable
12+
public interface IShellSectionRenderer : IDisposable
13+
{
14+
EvasObject NativeView { get; }
15+
}
16+
17+
public class ShellSectionRenderer : IAppearanceObserver, IShellSectionRenderer
1318
{
1419
EBox _mainLayout = null;
1520
EBox _contentArea = null;
@@ -51,7 +56,7 @@ public ShellSectionRenderer(ShellSection section)
5156

5257
bool _tabBarIsVisible = true;
5358

54-
bool TabBarIsVisible
59+
protected virtual bool TabBarIsVisible
5560
{
5661
get => _tabBarIsVisible;
5762
set

0 commit comments

Comments
 (0)