diff options
author | Kangho Hur <kangho.hur@samsung.com> | 2016-12-16 11:00:07 +0900 |
---|---|---|
committer | Kangho Hur <kangho.hur@samsung.com> | 2017-04-24 13:36:43 +0900 |
commit | 18ad8a74707a1b36581f7123be74d2b34510e016 (patch) | |
tree | 92eeac43c2cd01690a321a80e123e957053c4d7d /Xamarin.Forms.Platform.Tizen/Renderers/TabbedPageRenderer.cs | |
parent | 80e5482487f8a37d89b620f54f4ff3c12bcc5b83 (diff) | |
download | xamarin-forms-18ad8a74707a1b36581f7123be74d2b34510e016.tar.gz xamarin-forms-18ad8a74707a1b36581f7123be74d2b34510e016.tar.bz2 xamarin-forms-18ad8a74707a1b36581f7123be74d2b34510e016.zip |
Add Tizen backend renderer
- Xamarin.Forms.Platform.Tizen has been added
- Xamarin.Forms.Maps.Tizen has been added
- RPM build spec has been added
Change-Id: I0021e0f040d97345affc87512ee0f6ce437f4e6d
Diffstat (limited to 'Xamarin.Forms.Platform.Tizen/Renderers/TabbedPageRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Tizen/Renderers/TabbedPageRenderer.cs | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Tizen/Renderers/TabbedPageRenderer.cs b/Xamarin.Forms.Platform.Tizen/Renderers/TabbedPageRenderer.cs new file mode 100644 index 00000000..db97b339 --- /dev/null +++ b/Xamarin.Forms.Platform.Tizen/Renderers/TabbedPageRenderer.cs @@ -0,0 +1,190 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using ElmSharp; +using EToolbarItem = ElmSharp.ToolbarItem; +using EToolbarItemEventArgs = ElmSharp.ToolbarItemEventArgs; + +namespace Xamarin.Forms.Platform.Tizen +{ + public class TabbedPageRenderer : VisualElementRenderer<TabbedPage>, IVisualElementRenderer + { + Box _box; + Toolbar _tpage; + EvasObject _tcontent; + Dictionary<EToolbarItem, Page> _itemToItemPage = new Dictionary<EToolbarItem, Page>(); + + public TabbedPageRenderer () + { + //Register for title change property + RegisterPropertyHandler(TabbedPage.TitleProperty, UpdateTitle); + //Register for current page change property + RegisterPropertyHandler("CurrentPage", CurrentPageChanged); + //TODO renderer should add item on EFL toolbar when new Page is added to TabbedPage + } + + protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) + { + if (_tpage == null) + { + //Create box that holds toolbar and selected content + _box = new Box(Forms.Context.MainWindow) + { + AlignmentX = -1, + AlignmentY = -1, + WeightX = 1, + WeightY = 1, + IsHorizontal = false, + }; + _box.Show(); + + //Create toolbar that is placed inside the _box + _tpage = new Toolbar(Forms.Context.MainWindow) + { + AlignmentX = -1, + WeightX = 1, + ShrinkMode = ToolbarShrinkMode.Expand, + SelectionMode = ToolbarSelectionMode.Always, + }; + _tpage.Show(); + //Add callback for item selection + _tpage.Selected += OnCurrentPageChanged; + _box.PackEnd(_tpage); + + SetNativeControl(_box); + UpdateTitle(); + } + + base.OnElementChanged(e); + } + + protected override void Dispose(bool disposing) + { + if (_box != null) + { + _box.Unrealize(); + _box = null; + } + if (_tpage != null) + { + _tpage.Selected -= OnCurrentPageChanged; + + _tpage.Unrealize(); + _tpage = null; + } + base.Dispose(disposing); + } + + protected override void OnElementReady() + { + FillToolbar(); + base.OnElementReady(); + } + + void UpdateTitle() + { + _tpage.Text = Element.Title; + } + + void UpdateTitle(Page page) + { + if (_itemToItemPage.ContainsValue(page)) + { + var pair = _itemToItemPage.FirstOrDefault(x => x.Value == page); + pair.Key.SetPartText(null, pair.Value.Title); + } + } + + void OnPageTitleChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == Page.TitleProperty.PropertyName) + { + UpdateTitle(sender as Page); + } + } + + void FillToolbar() + { + var logicalChildren = (Element as IElementController).LogicalChildren; + bool hasIcon = false; + + //add items to toolbar + foreach (Page child in logicalChildren) + { + var childRenderer = Platform.GetRenderer(child); + if (childRenderer != null) + { + childRenderer.NativeView.Hide(); + } + + EToolbarItem toolbarItem; + if (string.IsNullOrEmpty(child.Icon)) + { + toolbarItem = _tpage.Append(child.Title); + } + else + { + //elm_toobar style and size hint must be changed at least once before adding the toolbar item having icon. + if (!hasIcon) + { + int windowHeight = Forms.Context.MainWindow.Geometry.Height; + //This value is from efl-theme-tizen-mobile theme. (NAVIFRAME_TABBAR_HEIGHT_WITH_TITLE_INC 80) + double requiredToolbarHeight = 80.0; + double toolBarWeight = requiredToolbarHeight/windowHeight; + _tpage.Style="tabbar"; + _tpage.TransverseExpansion = true; + _tpage.SetAlignment(-1,-1); + _tpage.SetWeight(1, toolBarWeight); + _box.SetAlignment(-1,-1); + _box.SetWeight(1, 1- toolBarWeight); + hasIcon = true; + } + toolbarItem = _tpage.Append(child.Title, ResourcePath.GetPath(child.Icon)); + } + _itemToItemPage.Add(toolbarItem, child); + if (Element.CurrentPage == child) + { + //select item on the toolbar and fill content + toolbarItem.IsSelected = true; + OnCurrentPageChanged(null, null); + } + child.PropertyChanged += OnPageTitleChanged; + } + } + + void OnCurrentPageChanged(object sender, EToolbarItemEventArgs e) + { + if (_tpage.SelectedItem == null) + return; + Element.CurrentPage = _itemToItemPage[_tpage.SelectedItem]; + + //detach content from view without EvasObject changes + if (_tcontent != null) + { + //hide content that should not be visible + _tcontent.Hide(); + //unpack content that is hiden an prepare for new content + _box.UnPack(_tcontent); + } + //create EvasObject using renderer and remember to not destroy + //it for better performance (creat once) + _tcontent = Platform.GetOrCreateRenderer(Element.CurrentPage).NativeView; + _tcontent.SetAlignment(-1, -1); + _tcontent.SetWeight(1, 1); + _tcontent.Show(); + _box.PackEnd(_tcontent); + } + + void CurrentPageChanged() + { + foreach (KeyValuePair<EToolbarItem, Page> pair in _itemToItemPage) + { + if (pair.Value == Element.CurrentPage) + { + pair.Key.IsSelected = true; + return; + } + } + } + } +} |