[Shell][Tizen] Add the MaterialShellRenderer on Tizen (#6196)

* [Shell][Tizen] Add the MaterialShellRenderer on Tizen

* Fixed the build fail

* Update namespace
This commit is contained in:
yourina 2019-08-29 10:12:00 -04:00 коммит произвёл Rui Marinho
Родитель f566b85523
Коммит b77de4d77d
37 изменённых файлов: 543 добавлений и 225 удалений

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/bell.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.2 KiB

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/books.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 629 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/booksflyout.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 629 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/card.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 480 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/film.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 923 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/filmflyout.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 923 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/games.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/gamesflyout.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/grid.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 320 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/headphone.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.2 KiB

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/headphoneflyout.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.2 KiB

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/homeflyout.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 544 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/jet.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/loop.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/newspaper.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 484 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/newspaperflyout.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 484 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/person.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 708 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/star.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 671 B

Двоичные данные
Xamarin.Forms.ControlGallery.Tizen/res/xamarinstore.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 16 KiB

Просмотреть файл

@ -0,0 +1,19 @@
using ElmSharp;
using Tizen.NET.MaterialComponents;
using Xamarin.Forms.Platform.Tizen;
namespace Xamarin.Forms.Material.Tizen
{
public class MaterialNavigationDrawer : MNavigationDrawer, INavigationDrawer
{
public MaterialNavigationDrawer(EvasObject parent) : base(parent)
{
}
EvasObject INavigationDrawer.NavigationView
{
get => NavigationView;
set => NavigationView = value as MNavigationView;
}
}
}

Просмотреть файл

@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using ElmSharp;
using Tizen.NET.MaterialComponents;
using Xamarin.Forms.Platform.Tizen;
namespace Xamarin.Forms.Material.Tizen
{
public class MaterialNavigationView : MNavigationView, INavigationView
{
IDictionary<MItem, Element> _flyoutMenu = new Dictionary<MItem, Element>();
public MaterialNavigationView(EvasObject parent) : base(parent)
{
MenuItemSelected += OnSelectedItemChanged;
}
public event EventHandler<SelectedItemChangedEventArgs> SelectedItemChanged;
public void BuildMenu(List<List<Element>> flyoutGroups)
{
var groups = new List<MGroup>();
_flyoutMenu.Clear();
for (int i = 0; i < flyoutGroups.Count; i++)
{
var flyoutGroup = flyoutGroups[i];
var items = new List<MItem>();
for (int j = 0; j < flyoutGroup.Count; j++)
{
string title = null;
string icon = null;
if (flyoutGroup[j] is BaseShellItem shellItem)
{
title = shellItem.Title;
if (shellItem.FlyoutIcon is FileImageSource flyoutIcon)
{
icon = flyoutIcon.File;
}
}
else if (flyoutGroup[j] is MenuItem menuItem)
{
title = menuItem.Text;
if (menuItem.IconImageSource != null && menuItem.IconImageSource is FileImageSource fileImageSource)
{
icon = fileImageSource.File;
}
}
MItem item = new MItem(title, icon);
items.Add(item);
_flyoutMenu.Add(item, flyoutGroup[j]);
}
var group = new MGroup(items);
groups.Add(group);
}
GroupMenu = groups;
}
void OnSelectedItemChanged(object sender, GenListItemEventArgs e)
{
_flyoutMenu.TryGetValue(e.Item.Data as MItem, out Element element);
SelectedItemChanged?.Invoke(this, new SelectedItemChangedEventArgs(element, -1));
}
}
}

Просмотреть файл

@ -0,0 +1,21 @@
using Xamarin.Forms.Platform.Tizen;
namespace Xamarin.Forms.Material.Tizen
{
public class MaterialShellItemRenderer : ShellItemRenderer
{
public MaterialShellItemRenderer(IFlyoutController flyoutController, ShellItem item) : base(flyoutController, item)
{
}
protected override IShellTabs CreateTabs()
{
return new MaterialShellTabs(Forms.NativeParent);
}
protected override ShellSectionNavigation CreateShellSectionNavigation(IFlyoutController flyoutController, ShellSection section)
{
return new MaterialShellSectionNavigation(flyoutController, section);
}
}
}

Просмотреть файл

@ -0,0 +1,25 @@
using Xamarin.Forms;
using Xamarin.Forms.Material.Tizen;
using Xamarin.Forms.Platform.Tizen;
[assembly: ExportRenderer(typeof(Shell), typeof(MaterialShellRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
namespace Xamarin.Forms.Material.Tizen
{
public class MaterialShellRenderer : ShellRenderer
{
protected override INavigationDrawer CreateNavigationDrawer()
{
return new MaterialNavigationDrawer(Forms.NativeParent);
}
protected override INavigationView CreateNavigationView()
{
return new MaterialNavigationView(Forms.NativeParent);
}
protected override ShellItemRenderer CreateShellItem(ShellItem item)
{
return new MaterialShellItemRenderer(this, item);
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using Xamarin.Forms.Platform.Tizen;
namespace Xamarin.Forms.Material.Tizen
{
public class MaterialShellSectionNavigation : ShellSectionNavigation
{
public MaterialShellSectionNavigation(IFlyoutController flyoutController, ShellSection section) : base(flyoutController, section)
{
}
protected override ShellSectionRenderer CreateShellSection(ShellSection section)
{
return new MaterialShellSectionRenderer(section);
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using Xamarin.Forms.Platform.Tizen;
namespace Xamarin.Forms.Material.Tizen
{
public class MaterialShellSectionRenderer : ShellSectionRenderer
{
public MaterialShellSectionRenderer(ShellSection section) : base(section)
{
}
protected override IShellTabs CreateToolbar()
{
return new MaterialShellTabs(Forms.NativeParent);
}
}
}

Просмотреть файл

@ -0,0 +1,30 @@
using System;
using ElmSharp;
using Tizen.NET.MaterialComponents;
namespace Xamarin.Forms.Platform.Tizen
{
public class MaterialShellTabs : MTabs, IShellTabs
{
public MaterialShellTabs(EvasObject parent) : base(parent)
{
}
ShellTabsType IShellTabs.Type
{
get => (ShellTabsType)Type;
set
{
Type = (MTabsType)value;
}
}
public EvasObject TargetView
{
get
{
return this;
}
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using ElmSharp;
namespace Xamarin.Forms.Platform.Tizen
{
public interface INavigationDrawer
{
event EventHandler Toggled;
EvasObject NavigationView { get; set; }
EvasObject Main { get; set; }
bool IsOpen { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,20 @@
using System;
using System.Collections;
using System.Collections.Generic;
using ElmSharp;
using EColor = ElmSharp.Color;
using Xamarin.Forms;
namespace Xamarin.Forms.Platform.Tizen
{
public interface INavigationView
{
EvasObject Header { get; set; }
EColor BackgroundColor { get; set; }
void BuildMenu(List<List<Element>> flyout);
event EventHandler<SelectedItemChangedEventArgs> SelectedItemChanged;
}
}

Просмотреть файл

@ -0,0 +1,30 @@
using System;
using ElmSharp;
using EColor = ElmSharp.Color;
using EToolbarItem = ElmSharp.ToolbarItem;
namespace Xamarin.Forms.Platform.Tizen
{
public interface IShellTabs
{
ShellTabsType Type { get; set; }
EvasObject TargetView { get; }
EColor BackgroundColor { get; set; }
EToolbarItem SelectedItem { get; }
event EventHandler<ToolbarItemEventArgs> Selected;
EToolbarItem Append(string label, string icon);
EToolbarItem InsertBefore(EToolbarItem before, string label, string icon);
}
public enum ShellTabsType
{
Fixed,
Scrollable
}
}

Просмотреть файл

@ -1,11 +1,12 @@
using System;
using ElmSharp;
using EBox = ElmSharp.Box;
namespace Xamarin.Forms.Platform.Tizen
{
public class NavigationDrawer : Native.Box
public class NavigationDrawer : Native.Box, INavigationDrawer
{
NavigationView _navigationView;
EvasObject _navigationView;
Box _mainContainer;
Box _dimArea;
EvasObject _main;
@ -25,16 +26,10 @@ namespace Xamarin.Forms.Platform.Tizen
public event EventHandler Toggled;
public NavigationView NavigationView
public EvasObject NavigationView
{
get
{
return _navigationView;
}
set
{
UpdateNavigationView(value);
}
get => _navigationView;
set => UpdateNavigationView(value);
}
public EvasObject Main
@ -113,7 +108,7 @@ namespace Xamarin.Forms.Platform.Tizen
PackEnd(_drawer);
}
void UpdateNavigationView(NavigationView navigationView)
void UpdateNavigationView(EvasObject navigationView)
{
if (_navigationView != null)
{

Просмотреть файл

@ -1,19 +1,21 @@
using System;
using System.Collections;
using System.Collections.Generic;
using ElmSharp;
using EColor = ElmSharp.Color;
namespace Xamarin.Forms.Platform.Tizen
{
public class NavigationView : Native.Box
public class NavigationView : Native.Box, INavigationView
{
EvasObject _header;
GenList _menu;
GenItemClass _defaultClass;
EColor _backgroundColor;
EColor _defaultBackgroundColor = EColor.White;
IList<Group> _groups;
GenItemClass _defaultClass;
List<Group> _groups;
IDictionary<Item, Element> _flyoutMenu = new Dictionary<Item, Element>();
public NavigationView(EvasObject parent) : base(parent)
{
@ -26,7 +28,7 @@ namespace Xamarin.Forms.Platform.Tizen
_menu.BackgroundColor = _defaultBackgroundColor;
}
public event EventHandler<GenListItemEventArgs> MenuItemSelected;
public event EventHandler<SelectedItemChangedEventArgs> SelectedItemChanged;
public override EColor BackgroundColor
{
@ -72,17 +74,46 @@ namespace Xamarin.Forms.Platform.Tizen
}
}
public IList<Group> Menu
public void BuildMenu(List<List<Element>> flyoutGroups)
{
get
var groups = new List<Group>();
_flyoutMenu.Clear();
for (int i = 0; i < flyoutGroups.Count; i++)
{
return _groups;
}
set
{
_groups = value;
UpdateMenu();
var flyoutGroup = flyoutGroups[i];
var items = new List<Item>();
for (int j = 0; j < flyoutGroup.Count; j++)
{
string title = null;
ImageSource icon = null;
if (flyoutGroup[j] is BaseShellItem shellItem)
{
title = shellItem.Title;
if (shellItem.FlyoutIcon is FileImageSource flyoutIcon)
{
icon = flyoutIcon;
}
}
else if (flyoutGroup[j] is MenuItem menuItem)
{
title = menuItem.Text;
if (menuItem.IconImageSource != null)
{
icon = menuItem.IconImageSource;
}
}
Item item = new Item(title, icon);
items.Add(item);
_flyoutMenu.Add(item, flyoutGroup[j]);
}
var group = new Group(items);
groups.Add(group);
}
_groups = groups;
UpdateMenu();
}
void Initialize(EvasObject parent)
@ -95,7 +126,9 @@ namespace Xamarin.Forms.Platform.Tizen
_menu.ItemSelected += (s, e) =>
{
MenuItemSelected?.Invoke(this, e);
_flyoutMenu.TryGetValue(e.Item.Data as Item, out Element element);
SelectedItemChanged?.Invoke(this, new SelectedItemChangedEventArgs(element, -1));
};
_menu.Show();
@ -119,15 +152,14 @@ namespace Xamarin.Forms.Platform.Tizen
if (part == "elm.swallow.icon")
{
var icon = ((Item)obj).Icon;
if (icon != null)
{
var image = new ElmSharp.Image(parent)
var image = new Native.Image(parent)
{
MinimumWidth = Forms.ConvertToScaledPixel(24),
MinimumHeight = Forms.ConvertToScaledPixel(24)
};
var result = image.Load(ResourcePath.GetPath(icon));
var result = image.LoadFromImageSourceAsync(icon);
return image;
}
else
@ -181,9 +213,9 @@ namespace Xamarin.Forms.Platform.Tizen
{
public string Title { get; set; }
public string Icon { get; set; }
public ImageSource Icon { get; set; }
public Item(string title, string icon = null)
public Item(string title, ImageSource icon = null)
{
Title = title;
Icon = icon;

Просмотреть файл

@ -13,25 +13,25 @@ namespace Xamarin.Forms.Platform.Tizen
{
public class ShellItemRenderer : IAppearanceObserver, IDisposable
{
IShellTabs _tabs = null;
IFlyoutController _flyoutController = null;
ShellItem _shellItem = null;
Native.Box _box = null;
Toolbar _toolbar = null;
Panel _drawer = null;
ShellMoreToolbar _more = null;
EToolbarItem _moreToolbarItem = null;
IFlyoutController _flyoutController = null;
ShellSectionNavigation _currentSection = null;
Dictionary<EToolbarItem, ShellSection> _itemToSection = new Dictionary<EToolbarItem, ShellSection>();
Dictionary<ShellSection, EToolbarItem> _sectionToitem = new Dictionary<ShellSection, EToolbarItem>();
Dictionary<ShellSection, ShellSectionNavigation> _sectionToPage = new Dictionary<ShellSection, ShellSectionNavigation>();
LinkedList<EToolbarItem> _toolbarItemList = new LinkedList<EToolbarItem>();
EColor _backgroudColor = ShellRenderer.DefaultBackgroundColor.ToNative();
ShellItem _shellItem = null;
ShellSectionNavigation _currentSection = null;
bool _disposed = false;
EColor _backgroudColor = ShellRenderer.DefaultBackgroundColor.ToNative();
// The source of icon resources is https://materialdesignicons.com/
const string _dotsIcon = "Xamarin.Forms.Platform.Tizen.Resource.dots_horizontal.png";
public ShellItemRenderer(IFlyoutController flyoutController, ShellItem item)
{
@ -44,8 +44,21 @@ namespace Xamarin.Forms.Platform.Tizen
_box.LayoutUpdated += OnLayoutUpdated;
_box.Show();
CreateToolbar();
CreateMoreToolbar();
// Create Tabs
_tabs = CreateTabs();
_tabs.TargetView.Show();
Control.PackEnd(_tabs as EvasObject);
InitializeTabs();
// Create More Tabs
_more = CreateMoreToolbar();
_more.Show();
_drawer = CreateDrawer();
_drawer.Show();
Control.PackEnd(_drawer);
InitialzeDrawer(_more);
ResetToolbarItems();
UpdateCurrentShellSection(_shellItem.CurrentItem);
@ -136,9 +149,9 @@ namespace Xamarin.Forms.Platform.Tizen
navi.Dispose();
}
if (_toolbar != null)
if (_tabs != null)
{
_toolbar.Selected -= OnTabsSelected;
_tabs.Selected -= OnTabsSelected;
}
_itemToSection.Clear();
_sectionToitem.Clear();
@ -150,6 +163,16 @@ namespace Xamarin.Forms.Platform.Tizen
_disposed = true;
}
protected virtual IShellTabs CreateTabs()
{
return new ShellTabs(Forms.NativeParent);
}
protected virtual ShellSectionNavigation CreateShellSectionNavigation(IFlyoutController flyoutController, ShellSection section)
{
return new ShellSectionNavigation(flyoutController, section);
}
void OnShellItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "CurrentItem")
@ -175,39 +198,30 @@ namespace Xamarin.Forms.Platform.Tizen
}
}
void CreateMoreToolbar()
Panel CreateDrawer()
{
if (_more != null)
return;
return new Panel(Forms.NativeParent);
}
_more = new ShellMoreToolbar(this);
_more.Show();
_drawer = new Panel(Forms.NativeParent);
void InitialzeDrawer(EvasObject content)
{
_drawer.SetScrollable(true);
_drawer.SetScrollableArea(1.0);
_drawer.Direction = PanelDirection.Bottom;
_drawer.IsOpen = false;
_drawer.SetContent(_more, true);
_drawer.Show();
Control.PackEnd(_drawer);
_drawer.SetContent(content, true);
}
void CreateToolbar()
ShellMoreToolbar CreateMoreToolbar()
{
if (_toolbar != null)
return;
return new ShellMoreToolbar(this);
}
_toolbar = new Toolbar(Forms.NativeParent)
{
AlignmentX = -1,
WeightX = 1,
BackgroundColor = _backgroudColor,
ShrinkMode = ToolbarShrinkMode.Expand,
Style = "material"
};
_toolbar.Show();
_toolbar.Selected += OnTabsSelected;
Control.PackEnd(_toolbar);
void InitializeTabs()
{
_tabs.BackgroundColor = _backgroudColor;
_tabs.Type = ShellTabsType.Fixed;
_tabs.Selected += OnTabsSelected;
}
void ResetToolbarItems()
@ -303,9 +317,9 @@ namespace Xamarin.Forms.Platform.Tizen
{
EToolbarItem item = null;
if (_moreToolbarItem == null)
item = _toolbar.Append(section.Title, GetIconPath(section.Icon));
item = _tabs.Append(section.Title, GetIconPath(section.Icon));
else
item = _toolbar.InsertBefore(_moreToolbarItem, section.Title, GetIconPath(section.Icon));
item = _tabs.InsertBefore(_moreToolbarItem, section.Title, GetIconPath(section.Icon));
if (item != null)
{
@ -327,7 +341,9 @@ namespace Xamarin.Forms.Platform.Tizen
_sectionToitem.Remove(lastSection);
last.Delete();
CreateMoreToolbarItem();
_moreToolbarItem = CreateTabsItem("More");
_toolbarItemList.AddLast(_moreToolbarItem);
InitializeTabsItem(_moreToolbarItem, _dotsIcon);
_more.AddItem(lastSection);
_more.AddItem(section);
@ -338,21 +354,21 @@ namespace Xamarin.Forms.Platform.Tizen
}
}
void CreateMoreToolbarItem()
void InitializeTabsItem(EToolbarItem item, string resource)
{
if (_moreToolbarItem != null)
return;
//The source of icon resources is https://materialdesignicons.com/
ImageSource src = ImageSource.FromResource("Xamarin.Forms.Platform.Tizen.Resource.dots_horizontal.png", typeof(ShellItemRenderer).GetTypeInfo().Assembly);
ImageSource src = ImageSource.FromResource(resource, typeof(ShellItemRenderer).GetTypeInfo().Assembly);
Native.Image icon = new Native.Image(Forms.NativeParent);
var task = icon.LoadFromImageSourceAsync(src);
_moreToolbarItem = _toolbar.Append("More", null);
_moreToolbarItem.SetPartContent("elm.swallow.icon", icon);
_moreToolbarItem.SetPartColor("bg", _backgroudColor);
_moreToolbarItem.SetPartColor("underline", EColor.Transparent);
_toolbarItemList.AddLast(_moreToolbarItem);
item.SetPartContent("elm.swallow.icon", icon);
item.SetPartColor("bg", _backgroudColor);
item.SetPartColor("underline", EColor.Transparent);
}
EToolbarItem CreateTabsItem(string text)
{
return _tabs.Append(text, null);
}
void UpdateCurrentShellSection(ShellSection section)
@ -372,7 +388,7 @@ namespace Xamarin.Forms.Platform.Tizen
}
else
{
native = new ShellSectionNavigation(_flyoutController, section);
native = CreateShellSectionNavigation(_flyoutController, section);
_sectionToPage[section] = native;
Control.PackEnd(native);
}
@ -383,7 +399,7 @@ namespace Xamarin.Forms.Platform.Tizen
void OnTabsSelected(object sender, ToolbarItemEventArgs e)
{
if (_toolbar.SelectedItem == null)
if (_tabs.SelectedItem == null)
return;
if (e.Item == _moreToolbarItem)
@ -392,7 +408,7 @@ namespace Xamarin.Forms.Platform.Tizen
}
else
{
ShellSection section = _itemToSection[_toolbar.SelectedItem];
ShellSection section = _itemToSection[_tabs.SelectedItem];
SetCurrentItem(section);
}
}
@ -404,11 +420,11 @@ namespace Xamarin.Forms.Platform.Tizen
void OnLayoutUpdated(object sender, LayoutEventArgs e)
{
int toolbarHeight = _toolbar.MinimumHeight;
int toolbarHeight = _tabs.TargetView.MinimumHeight;
if (_shellItem.Items.Count <= 1)
{
toolbarHeight = 0;
_toolbar?.Hide();
_tabs?.TargetView.Hide();
_drawer?.Hide();
}
@ -416,9 +432,9 @@ namespace Xamarin.Forms.Platform.Tizen
_currentSection?.Resize(e.Geometry.Width, e.Geometry.Height - toolbarHeight);
if (_shellItem.Items.Count > 1)
{
_toolbar.Show();
_toolbar.Move(e.Geometry.X, e.Geometry.Y + e.Geometry.Height - toolbarHeight);
_toolbar.Resize(e.Geometry.Width, toolbarHeight);
_tabs.TargetView.Show();
_tabs.TargetView.Move(e.Geometry.X, e.Geometry.Y + e.Geometry.Height - toolbarHeight);
_tabs.TargetView.Resize(e.Geometry.Width, toolbarHeight);
if (_drawer != null)
{
_drawer.Show();

Просмотреть файл

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using ElmSharp;
@ -6,11 +6,10 @@ namespace Xamarin.Forms.Platform.Tizen
{
public class ShellRenderer : VisualElementRenderer<Shell>, IFlyoutController
{
NavigationDrawer _native;
INavigationDrawer _native;
INavigationView _navigationView;
ShellItemRenderer _shellItem;
IDictionary<int, Element> _flyoutMenu = new Dictionary<int, Element>();
public static readonly Color DefaultBackgroundColor = Color.FromRgb(33, 150, 243);
public static readonly Color DefaultForegroundColor = Color.White;
public static readonly Color DefaultTitleColor = Color.White;
@ -34,17 +33,14 @@ namespace Xamarin.Forms.Platform.Tizen
{
if (_native == null)
{
_native = new NavigationDrawer(Forms.NativeParent)
{
NavigationView = new NavigationView(Forms.NativeParent)
};
SetNativeView(_native);
_native = CreateNavigationDrawer();
_navigationView = CreateNavigationView();
_native.NavigationView = _navigationView as ElmSharp.EvasObject;
_native.Toggled += OnFlyoutIsPresentedChanged;
SetNativeView(_native as ElmSharp.EvasObject);
InitializeFlyout();
}
base.OnElementChanged(e);
}
@ -56,13 +52,13 @@ namespace Xamarin.Forms.Platform.Tizen
if (_native != null)
{
_native.Toggled -= OnFlyoutIsPresentedChanged;
_native.NavigationView.MenuItemSelected -= OnItemSelected;
_navigationView.SelectedItemChanged -= OnItemSelected;
}
}
base.Dispose(disposing);
}
void InitializeFlyout()
protected void InitializeFlyout()
{
((IShellController)Element).StructureChanged += OnShellStructureChanged;
@ -72,14 +68,34 @@ namespace Xamarin.Forms.Platform.Tizen
var headerView = Platform.GetOrCreateRenderer(flyoutHeader);
(headerView as LayoutRenderer)?.RegisterOnLayoutUpdated();
Size request = flyoutHeader.Measure(Forms.ConvertToScaledDP(_native.NavigationView.MinimumWidth), Forms.ConvertToScaledDP(_native.NavigationView.MinimumHeight)).Request;
Size request = flyoutHeader.Measure(Forms.ConvertToScaledDP(_native.NavigationView.MinimumWidth),
Forms.ConvertToScaledDP(_native.NavigationView.MinimumHeight)).Request;
headerView.NativeView.MinimumHeight = Forms.ConvertToScaledPixel(request.Height);
_native.NavigationView.Header = headerView.NativeView;
_navigationView.Header = headerView.NativeView;
}
_navigationView.BuildMenu(((IShellController)Element).GenerateFlyoutGrouping());
_navigationView.SelectedItemChanged += OnItemSelected;
}
BuildMenu();
_native.NavigationView.MenuItemSelected += OnItemSelected;
protected void OnFlyoutIsPresentedChanged(object sender, EventArgs e)
{
Element.SetValueFromRenderer(Shell.FlyoutIsPresentedProperty, _native.IsOpen);
}
protected virtual ShellItemRenderer CreateShellItem(ShellItem item)
{
return new ShellItemRenderer(this, item);
}
protected virtual INavigationDrawer CreateNavigationDrawer()
{
return new NavigationDrawer(Forms.NativeParent);
}
protected virtual INavigationView CreateNavigationView()
{
return new NavigationView(Forms.NativeParent);
}
void UpdateCurrentItem()
@ -87,7 +103,7 @@ namespace Xamarin.Forms.Platform.Tizen
_shellItem?.Dispose();
if (Element.CurrentItem != null)
{
_shellItem = new ShellItemRenderer(this, Element.CurrentItem);
_shellItem = CreateShellItem(Element.CurrentItem);
_shellItem.Control.SetAlignment(-1, -1);
_shellItem.Control.SetWeight(1, 1);
_native.Main = _shellItem.Control;
@ -100,7 +116,7 @@ namespace Xamarin.Forms.Platform.Tizen
void UpdateFlyoutBackgroundColor()
{
_native.NavigationView.BackgroundColor = Element.FlyoutBackgroundColor.ToNative();
_navigationView.BackgroundColor = Element.FlyoutBackgroundColor.ToNative();
}
void UpdateFlyoutIsPresented()
@ -108,71 +124,14 @@ namespace Xamarin.Forms.Platform.Tizen
_native.IsOpen = Element.FlyoutIsPresented;
}
void OnFlyoutIsPresentedChanged(object sender, EventArgs e)
{
Element.SetValueFromRenderer(Shell.FlyoutIsPresentedProperty, _native.IsOpen);
}
void OnItemSelected(object sender, GenListItemEventArgs e)
{
_flyoutMenu.TryGetValue(e.Item.Index - 1, out Element element);
if (element != null)
{
((IShellController)Element).OnFlyoutItemSelected(element);
}
}
void OnShellStructureChanged(object sender, EventArgs e)
{
BuildMenu();
_navigationView.BuildMenu(((IShellController)Element).GenerateFlyoutGrouping());
}
void BuildMenu()
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var groups = new List<Group>();
var flyoutGroups = ((IShellController)Element).GenerateFlyoutGrouping();
_flyoutMenu.Clear();
int index = 0;
for (int i = 0; i < flyoutGroups.Count; i++)
{
var flyoutGroup = flyoutGroups[i];
var items = new List<Item>();
for (int j = 0; j < flyoutGroup.Count; j++)
{
string title = null;
string icon = null;
if (flyoutGroup[j] is BaseShellItem shellItem)
{
title = shellItem.Title;
if (shellItem.FlyoutIcon is FileImageSource flyoutIcon)
{
icon = flyoutIcon.File;
}
}
else if (flyoutGroup[j] is MenuItem menuItem)
{
title = menuItem.Text;
if (menuItem.IconImageSource is FileImageSource source)
{
icon = source.File;
}
}
items.Add(new Item(title, icon));
_flyoutMenu.Add(index, flyoutGroup[j]);
index++;
}
var group = new Group(items);
groups.Add(group);
}
_native.NavigationView.Menu = groups;
((IShellController)Element).OnFlyoutItemSelected(e.SelectedItem as Element);
}
void IFlyoutController.Open()
@ -180,4 +139,4 @@ namespace Xamarin.Forms.Platform.Tizen
_native.IsOpen = true;
}
}
}
}

Просмотреть файл

@ -33,7 +33,7 @@ namespace Xamarin.Forms.Platform.Tizen
_navBar = new ShellNavBar(flyoutController, this);
_navBar.Show();
var renderer = new ShellSectionRenderer(section);
var renderer = CreateShellSection(section);
renderer.Control.Show();
_navigationStack.AddLast(renderer.Control);
_pageToNative[_rootPage] = renderer.Control;
@ -106,6 +106,11 @@ namespace Xamarin.Forms.Platform.Tizen
_disposed = true;
}
protected virtual ShellSectionRenderer CreateShellSection(ShellSection section)
{
return new ShellSectionRenderer(section);
}
void UpdateDisplayedPage(Page page)
{
if (_currentPage != null)

Просмотреть файл

@ -1,18 +1,18 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Collections.Generic;
using System.Collections.Specialized;
using ElmSharp;
using EToolbarItem = ElmSharp.ToolbarItem;
using EColor = ElmSharp.Color;
using Xamarin.Forms.Platform.Tizen.Native;
using System.Collections.Specialized;
namespace Xamarin.Forms.Platform.Tizen
{
public class ShellSectionRenderer : IAppearanceObserver
{
Native.Box _box = null;
Toolbar _toolbar = null;
IShellTabs _tabs = null;
Native.Page _currentContent = null;
ShellSection _section = null;
@ -35,7 +35,12 @@ namespace Xamarin.Forms.Platform.Tizen
_box = new Native.Box(Forms.NativeParent);
_box.LayoutUpdated += OnLayoutUpdated;
CreateToolbar();
_tabs = CreateToolbar();
_tabs.TargetView.Show();
Control.PackEnd(_tabs as EvasObject);
InitializeTabs();
ResetToolbarItem();
UpdateCurrentShellContent(_section.CurrentItem);
((IShellController)_section.Parent.Parent).AddAppearanceObserver(this, _section);
@ -60,6 +65,32 @@ namespace Xamarin.Forms.Platform.Tizen
}
}
public EColor BackgroundColor
{
get
{
return _backgroundColor;
}
set
{
_backgroundColor = value;
UpdateToolbarBackgroudColor(_backgroundColor);
}
}
public EColor ForegroundColor
{
get
{
return _foregroundCollor;
}
set
{
_foregroundCollor = value;
UpdateToolbarForegroundColor(_foregroundCollor);
}
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
@ -80,9 +111,9 @@ namespace Xamarin.Forms.Platform.Tizen
content.Unrealize();
}
if (_toolbar != null)
if (_tabs != null)
{
_toolbar.Selected -= OnTabsSelected;
_tabs.Selected -= OnTabsSelected;
}
_contentToPage.Clear();
_contentToItem.Clear();
@ -94,6 +125,18 @@ namespace Xamarin.Forms.Platform.Tizen
_disposed = true;
}
protected virtual IShellTabs CreateToolbar()
{
return new ShellTabs(Forms.NativeParent);
}
void InitializeTabs()
{
_tabs.BackgroundColor = _backgroundColor;
_tabs.Type = ShellTabsType.Fixed;
_tabs.Selected += OnTabsSelected;
}
void OnSectionPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "CurrentItem")
@ -136,32 +179,6 @@ namespace Xamarin.Forms.Platform.Tizen
}
}
public EColor BackgroundColor
{
get
{
return _backgroundColor;
}
set
{
_backgroundColor = value;
UpdateToolbarBackgroudColor(_backgroundColor);
}
}
public EColor ForegroundColor
{
get
{
return _foregroundCollor;
}
set
{
_foregroundCollor = value;
UpdateToolbarForegroundColor(_foregroundCollor);
}
}
void UpdateToolbarBackgroudColor(EColor color)
{
foreach (EToolbarItem item in _toolbarItemList)
@ -174,7 +191,7 @@ namespace Xamarin.Forms.Platform.Tizen
{
foreach (EToolbarItem item in _toolbarItemList)
{
if (item != _toolbar.SelectedItem)
if (item != _tabs.SelectedItem)
{
item.SetPartColor("underline", EColor.Transparent);
}
@ -185,24 +202,6 @@ namespace Xamarin.Forms.Platform.Tizen
}
}
void CreateToolbar()
{
if (_toolbar != null)
return;
_toolbar = new Toolbar(Forms.NativeParent)
{
BackgroundColor = _backgroundColor,
ShrinkMode = ToolbarShrinkMode.Expand,
Style = "material"
};
_toolbar.Show();
_toolbar.Selected += OnTabsSelected;
Control.PackEnd(_toolbar);
ResetToolbarItem();
}
void ResetToolbarItem()
{
foreach (ShellContent content in _section.Items)
@ -211,13 +210,13 @@ namespace Xamarin.Forms.Platform.Tizen
}
if (_section.Items.Count > 3)
{
_toolbar.ShrinkMode = ToolbarShrinkMode.Scroll;
_tabs.Type = ShellTabsType.Scrollable;
}
}
EToolbarItem InsertToolbarItem(ShellContent content)
{
EToolbarItem item = _toolbar.Append(content.Title, null);
EToolbarItem item = _tabs.Append(content.Title, null);
item.SetPartColor("bg", _backgroundColor);
_toolbarItemList.AddLast(item);
@ -276,12 +275,12 @@ namespace Xamarin.Forms.Platform.Tizen
void OnTabsSelected(object sender, ToolbarItemEventArgs e)
{
if (_toolbar.SelectedItem == null)
if (_tabs.SelectedItem == null)
{
return;
}
ShellContent content = _itemToContent[_toolbar.SelectedItem];
ShellContent content = _itemToContent[_tabs.SelectedItem];
if (_section.CurrentItem != content)
{
_section.SetValueFromRenderer(ShellSection.CurrentItemProperty, content);
@ -336,10 +335,10 @@ namespace Xamarin.Forms.Platform.Tizen
}
else
{
toolbarHeight = _toolbar.MinimumHeight;
toolbarHeight = _tabs.TargetView.MinimumHeight;
}
_toolbar.Move(e.Geometry.X, e.Geometry.Y);
_toolbar.Resize(e.Geometry.Width, toolbarHeight);
_tabs.TargetView.Move(e.Geometry.X, e.Geometry.Y);
_tabs.TargetView.Resize(e.Geometry.Width, toolbarHeight);
_currentContent?.Move(e.Geometry.X, e.Geometry.Y + toolbarHeight);
_currentContent?.Resize(e.Geometry.Width, e.Geometry.Height - toolbarHeight);
}

Просмотреть файл

@ -0,0 +1,40 @@
using System;
using ElmSharp;
namespace Xamarin.Forms.Platform.Tizen
{
public class ShellTabs : Toolbar, IShellTabs
{
ShellTabsType _type;
public ShellTabs(EvasObject parent) : base(parent)
{
Style = "material";
}
public ShellTabsType Type
{
get => _type;
set
{
switch (value)
{
case ShellTabsType.Fixed:
this.ShrinkMode = ToolbarShrinkMode.Expand;
break;
case ShellTabsType.Scrollable:
this.ShrinkMode = ToolbarShrinkMode.Scroll;
break;
}
_type = value;
}
}
public EvasObject TargetView
{
get
{
return this;
}
}
}
}

Просмотреть файл

@ -7,6 +7,16 @@
<TargetFrameworkIdentifier>Tizen</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
</PropertyGroup>
<ItemGroup>
<None Remove="Resource\arrow_left.png" />
<None Remove="Resource\dots_horizontal.png" />
<None Remove="Resource\menu.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resource\arrow_left.png" />
<EmbeddedResource Include="Resource\dots_horizontal.png" />
<EmbeddedResource Include="Resource\menu.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Tizen.NET" Version="4.0.0" />
@ -15,4 +25,5 @@
<ItemGroup>
<ProjectReference Include="..\Xamarin.Forms.Core\Xamarin.Forms.Core.csproj" />
</ItemGroup>
</Project>