summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.MacOS/NativeToolbarTracker.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.MacOS/NativeToolbarTracker.cs')
-rw-r--r--Xamarin.Forms.Platform.MacOS/NativeToolbarTracker.cs460
1 files changed, 0 insertions, 460 deletions
diff --git a/Xamarin.Forms.Platform.MacOS/NativeToolbarTracker.cs b/Xamarin.Forms.Platform.MacOS/NativeToolbarTracker.cs
deleted file mode 100644
index fc24b770..00000000
--- a/Xamarin.Forms.Platform.MacOS/NativeToolbarTracker.cs
+++ /dev/null
@@ -1,460 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using AppKit;
-using CoreGraphics;
-using Xamarin.Forms.Internals;
-using Xamarin.Forms.PlatformConfiguration.macOSSpecific;
-
-namespace Xamarin.Forms.Platform.MacOS
-{
- class NativeToolbarGroup
- {
- public class Item
- {
- public NSToolbarItem ToolbarItem;
- public NSButton Button;
- public ToolbarItem Element;
- }
-
- public NativeToolbarGroup(NSToolbarItemGroup itemGroup)
- {
- Group = itemGroup;
- Items = new List<Item>();
- }
-
- public NSToolbarItemGroup Group { get; }
-
- public List<Item> Items { get; }
- }
-
- internal class NativeToolbarTracker : NSToolbarDelegate
- {
- const string ToolBarId = "AwesomeBarToolbar";
-
- INavigationPageController NavigationController => _navigation;
-
- readonly string _defaultBackButtonTitle = "Back";
- readonly ToolbarTracker _toolbarTracker;
-
- NSToolbar _toolbar;
- NavigationPage _navigation;
-
- bool _hasTabs;
-
- const double BackButtonItemWidth = 36;
- const double ToolbarItemWidth = 44;
- const double ToolbarItemHeight = 25;
- const double ToolbarItemSpacing = 6;
- const double ToolbarHeight = 30;
- const double NavigationTitleMinSize = 300;
-
- const string NavigationGroupIdentifier = "NavigationGroup";
- const string TabbedGroupIdentifier = "TabbedGroup";
- const string ToolbarItemsGroupIdentifier = "ToolbarGroup";
- const string TitleGroupIdentifier = "TitleGroup";
-
- NativeToolbarGroup _navigationGroup;
- NativeToolbarGroup _tabbedGroup;
- NativeToolbarGroup _toolbarGroup;
- NativeToolbarGroup _titleGroup;
-
- NSView _nsToolbarItemViewer;
-
- public NativeToolbarTracker()
- {
- _toolbarTracker = new ToolbarTracker();
- _toolbarTracker.CollectionChanged += ToolbarTrackerOnCollectionChanged;
- }
-
- public NavigationPage Navigation
- {
- get { return _navigation; }
- set
- {
- if (_navigation == value)
- return;
-
- if (_navigation != null)
- _navigation.PropertyChanged -= NavigationPagePropertyChanged;
-
- _navigation = value;
-
- if (_navigation != null)
- {
- var parentTabbedPage = _navigation.Parent as TabbedPage;
- if (parentTabbedPage != null)
- {
- _hasTabs = parentTabbedPage.OnThisPlatform().GetTabsStyle() == TabsStyle.OnNavigation;
- }
- _toolbarTracker.Target = _navigation.CurrentPage;
- _navigation.PropertyChanged += NavigationPagePropertyChanged;
- }
-
- UpdateToolBar();
- }
- }
-
- public void TryHide(NavigationPage navPage = null)
- {
- if (navPage == null || navPage == _navigation)
- {
- Navigation = null;
- }
- }
-
- public override string[] AllowedItemIdentifiers(NSToolbar toolbar)
- {
- return new string[] { };
- }
-
- public override string[] DefaultItemIdentifiers(NSToolbar toolbar)
- {
- return new string[] { };
- }
-
- public override NSToolbarItem WillInsertItem(NSToolbar toolbar, string itemIdentifier, bool willBeInserted)
- {
- var group = new NSToolbarItemGroup(itemIdentifier);
- var view = new NSView();
- group.View = view;
-
- if (itemIdentifier == NavigationGroupIdentifier)
- _navigationGroup = new NativeToolbarGroup(group);
- else if (itemIdentifier == TitleGroupIdentifier)
- _titleGroup = new NativeToolbarGroup(group);
- else if (itemIdentifier == TabbedGroupIdentifier)
- _tabbedGroup = new NativeToolbarGroup(group);
- else if (itemIdentifier == ToolbarItemsGroupIdentifier)
- _toolbarGroup = new NativeToolbarGroup(group);
-
- return group;
- }
-
- protected virtual bool HasTabs => _hasTabs;
-
- protected virtual NSToolbar ConfigureToolbar()
- {
- var toolbar = new NSToolbar(ToolBarId)
- {
- DisplayMode = NSToolbarDisplayMode.Icon,
- AllowsUserCustomization = false,
- ShowsBaselineSeparator = true,
- SizeMode = NSToolbarSizeMode.Regular,
- Delegate = this
- };
-
- return toolbar;
- }
-
- internal void UpdateToolBar()
- {
- if (NSApplication.SharedApplication.MainWindow == null)
- return;
-
- if (NavigationController == null)
- {
- if (_toolbar != null)
- _toolbar.Visible = false;
- _toolbar = null;
- return;
- }
-
- var currentPage = NavigationController.Peek();
-
- if (NavigationPage.GetHasNavigationBar(currentPage))
- {
- if (_toolbar == null)
- {
- _toolbar = ConfigureToolbar();
- NSApplication.SharedApplication.MainWindow.Toolbar = _toolbar;
-
- _toolbar.InsertItem(NavigationGroupIdentifier, 0);
- _toolbar.InsertItem(
- HasTabs ? NSToolbar.NSToolbarSpaceItemIdentifier : NSToolbar.NSToolbarFlexibleSpaceItemIdentifier, 1);
- _toolbar.InsertItem(HasTabs ? TabbedGroupIdentifier : TitleGroupIdentifier, 2);
- _toolbar.InsertItem(NSToolbar.NSToolbarFlexibleSpaceItemIdentifier, 3);
- _toolbar.InsertItem(ToolbarItemsGroupIdentifier, 4);
- }
-
- _toolbar.Visible = true;
- UpdateToolbarItems();
- UpdateTitle();
- UpdateNavigationItems();
- if (HasTabs)
- UpdateTabbedItems();
- UpdateBarBackgroundColor();
- }
- else
- {
- if (_toolbar != null)
- {
- _toolbar.Visible = false;
- }
- }
- }
-
- void UpdateBarBackgroundColor()
- {
- var bgColor = GetBackgroundColor().CGColor;
-
- if (_nsToolbarItemViewer?.Superview?.Superview == null ||
- _nsToolbarItemViewer.Superview.Superview.Superview == null) return;
- // NSTitlebarView
- _nsToolbarItemViewer.Superview.Superview.Superview.WantsLayer = true;
- _nsToolbarItemViewer.Superview.Superview.Superview.Layer.BackgroundColor = bgColor;
- }
-
- void NavigationPagePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
- {
- if (e.PropertyName.Equals(NavigationPage.BarTextColorProperty.PropertyName) ||
- e.PropertyName.Equals(NavigationPage.BarBackgroundColorProperty.PropertyName))
- UpdateToolBar();
- }
-
- void ToolbarTrackerOnCollectionChanged(object sender, EventArgs eventArgs)
- {
- UpdateToolbarItems();
- }
-
- async Task NavigateBackFrombackButton()
- {
- var popAsyncInner = NavigationController?.PopAsyncInner(true, true);
- if (popAsyncInner != null)
- await popAsyncInner;
- }
-
- bool ShowBackButton()
- {
- if (_navigation == null)
- return false;
-
- return NavigationPage.GetHasBackButton(_navigation.CurrentPage) && !IsRootPage();
- }
-
- bool IsRootPage()
- {
- if (NavigationController == null)
- return true;
- return NavigationController.StackDepth <= 1;
- }
-
- NSColor GetBackgroundColor()
- {
- var backgroundNSColor = NSColor.Clear;
- if (Navigation != null && Navigation.BarBackgroundColor != Color.Default)
- backgroundNSColor = Navigation.BarBackgroundColor.ToNSColor();
- return backgroundNSColor;
- }
-
- NSColor GetTitleColor()
- {
- var titleNSColor = NSColor.Black;
- if (Navigation != null && Navigation?.BarTextColor != Color.Default)
- titleNSColor = Navigation.BarTextColor.ToNSColor();
-
- return titleNSColor;
- }
-
- string GetCurrentPageTitle()
- {
- if (NavigationController == null)
- return string.Empty;
- return NavigationController.Peek().Title ?? "";
- }
-
- string GetPreviousPageTitle()
- {
- if (NavigationController == null || NavigationController.StackDepth <= 1)
- return string.Empty;
-
- return NavigationController.Peek(1).Title ?? _defaultBackButtonTitle;
- }
-
- List<ToolbarItem> GetToolbarItems()
- {
- return _toolbarTracker.ToolbarItems.ToList();
- }
-
- void UpdateTitle()
- {
- if (_toolbar == null || _navigation == null || _titleGroup == null)
- return;
-
- var title = GetCurrentPageTitle();
- var item = new NSToolbarItem(title);
- var view = new NSView();
- var titleField = new NSTextField
- {
- AllowsEditingTextAttributes = true,
- Bordered = false,
- DrawsBackground = false,
- Bezeled = false,
- Editable = false,
- Selectable = false,
- Cell = new VerticallyCenteredTextFieldCell(0f, NSFont.TitleBarFontOfSize(18)),
- StringValue = title
- };
- titleField.Cell.TextColor = GetTitleColor();
- titleField.SizeToFit();
- _titleGroup.Group.MinSize = new CGSize(NavigationTitleMinSize, ToolbarHeight);
- _titleGroup.Group.Subitems = new NSToolbarItem[] { item };
- view.AddSubview(titleField);
- _titleGroup.Group.View = view;
- //save a reference so we can paint this for the background
- _nsToolbarItemViewer = _titleGroup.Group.View.Superview;
- //position is hard .. we manually set the title to be centered
- var totalWidth = _titleGroup.Group.View.Superview.Superview.Frame.Width;
- var fieldWidth = titleField.Frame.Width;
- var x = ((totalWidth - fieldWidth) / 2) - _nsToolbarItemViewer.Frame.X;
- titleField.Frame = new CGRect(x, 0, fieldWidth, ToolbarHeight);
- }
-
- void UpdateToolbarItems()
- {
- if (_toolbar == null || _navigation == null || _toolbarGroup == null)
- return;
-
- var currentPage = NavigationController.Peek();
- UpdateGroup(_toolbarGroup, currentPage.ToolbarItems, ToolbarItemWidth, ToolbarItemSpacing);
- }
-
- void UpdateNavigationItems()
- {
- if (_toolbar == null || _navigation == null || _navigationGroup == null)
- return;
- var items = new List<ToolbarItem>();
- if (ShowBackButton())
- {
- var backButtonItem = new ToolbarItem
- {
- Text = GetPreviousPageTitle(),
- Command = new Command(async () => await NavigateBackFrombackButton())
- };
- items.Add(backButtonItem);
- }
-
- UpdateGroup(_navigationGroup, items, BackButtonItemWidth, -1);
-
- var navItemBack = _navigationGroup.Items.FirstOrDefault();
- if (navItemBack != null)
- {
- navItemBack.Button.Image = NSImage.ImageNamed(NSImageName.GoLeftTemplate);
- navItemBack.Button.SizeToFit();
- navItemBack.Button.AccessibilityTitle = "NSBackButton";
- }
- }
-
- void UpdateTabbedItems()
- {
- if (_toolbar == null || _navigation == null || _tabbedGroup == null)
- return;
-
- var items = new List<ToolbarItem>();
-
- var tabbedPage = _navigation.Parent as TabbedPage;
- if (tabbedPage != null)
- {
- foreach (var item in tabbedPage.Children)
- {
- var tbI = new ToolbarItem
- {
- Text = item.Title,
- Icon = item.Icon,
- Command = new Command(() => tabbedPage.SelectedItem = item)
- };
- items.Add(tbI);
- }
- }
-
- UpdateGroup(_tabbedGroup, items, ToolbarItemWidth, ToolbarItemSpacing);
- }
-
- void UpdateGroup(NativeToolbarGroup group, IList<ToolbarItem> toolbarItems, double itemWidth,
- double itemSpacing)
- {
- int count = toolbarItems.Count;
- group.Items.Clear();
- if (count > 0)
- {
- var subItems = new NSToolbarItem[count];
- var view = new NSView();
- nfloat totalWidth = 0;
- var currentX = 0.0;
- for (int i = 0; i < toolbarItems.Count; i++)
- {
- var element = toolbarItems[i];
-
- var item = new NSToolbarItem(element.Text ?? "");
- item.Activated += (sender, e) => (element as IMenuItemController).Activate();
-
- var button = new NSButton();
- button.Title = element.Text ?? "";
-
- button.SizeToFit();
- var buttonWidth = itemWidth;
- if (button.FittingSize.Width > itemWidth)
- {
- buttonWidth = button.FittingSize.Width + 10;
- }
- button.Frame = new CGRect(currentX + i * itemSpacing, 0, buttonWidth, ToolbarItemHeight);
- currentX += buttonWidth;
- totalWidth += button.Frame.Width;
- button.Activated += (sender, e) => (element as IMenuItemController).Activate();
-
- button.BezelStyle = NSBezelStyle.TexturedRounded;
- if (!string.IsNullOrEmpty(element.Icon))
- button.Image = new NSImage(element.Icon);
-
- button.SizeToFit();
-
- button.Enabled = item.Enabled = element.IsEnabled;
- element.PropertyChanged -= ToolBarItemPropertyChanged;
- element.PropertyChanged += ToolBarItemPropertyChanged;
-
- view.AddSubview(button);
- //item.Label = item.PaletteLabel = item.ToolTip = element.Text ?? "";
-
- subItems[i] = item;
-
- group.Items.Add(new NativeToolbarGroup.Item { ToolbarItem = item, Button = button, Element = element });
- }
- view.Frame = new CGRect(0, 0, totalWidth + (itemSpacing * (count - 1)), ToolbarItemHeight);
-
- group.Group.Subitems = subItems;
- group.Group.View = view;
- }
- else
- {
- group.Group.Subitems = new NSToolbarItem[] { };
- group.Group.View = new NSView();
- }
- }
-
- void ToolBarItemPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
- {
- var nativeToolbarItem = _toolbarGroup.Items.FirstOrDefault((NativeToolbarGroup.Item arg1) => arg1.Element == sender);
- if (nativeToolbarItem != null)
- {
- if (e.PropertyName.Equals(VisualElement.IsEnabledProperty.PropertyName))
- {
- nativeToolbarItem.Button.Enabled = nativeToolbarItem.ToolbarItem.Enabled = nativeToolbarItem.Element.IsEnabled;
- }
-
- if (e.PropertyName.Equals(ToolbarItem.TextProperty.PropertyName))
- {
- nativeToolbarItem.Button.Title = nativeToolbarItem.ToolbarItem.Label = nativeToolbarItem.Element.Text;
- }
- }
- }
-
- class ToolBarItemNSButton : NSView
- {
- public ToolBarItemNSButton(string automationID)
- {
- AccessibilityIdentifier = automationID;
- }
- }
- }
-} \ No newline at end of file