From dccfe8d8808a21f5af393f5c165ff31bdbc502d1 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Fri, 13 Jul 2018 21:48:36 -0500 Subject: Draw icons if the image is set --- .../Controls/Custom/UnderlinedTabViewController.cs | 109 +++++++++++++++++---- 1 file changed, 90 insertions(+), 19 deletions(-) (limited to 'Xamarin.PropertyEditing.Mac/Controls/Custom/UnderlinedTabViewController.cs') diff --git a/Xamarin.PropertyEditing.Mac/Controls/Custom/UnderlinedTabViewController.cs b/Xamarin.PropertyEditing.Mac/Controls/Custom/UnderlinedTabViewController.cs index 8225319..3526287 100644 --- a/Xamarin.PropertyEditing.Mac/Controls/Custom/UnderlinedTabViewController.cs +++ b/Xamarin.PropertyEditing.Mac/Controls/Custom/UnderlinedTabViewController.cs @@ -3,40 +3,111 @@ using AppKit; namespace Xamarin.PropertyEditing.Mac { + internal class SegmentStack : NSView + { + class SegmentItem + { + public NSImage Image { get; set; } + public string Label { get; set; } + public NSView View { get; set; } + } + + + private SegmentItem[] segments = new SegmentItem[0]; + private NSStackView stackView = new NSStackView () { + Spacing = 3 + }; + + public void SetImage (NSImage image, int segment) + { + var item = this.segments[segment]; + + item.Image = image; + if (item.Image != null) + return; + + item.View = new UnderlinedImageView (image.Name) { + // Image = image + }; + this.stackView.AddView (item.View, NSStackViewGravity.Leading); + } + + public NSImage GetImage (int segment) + { + return this.segments[segment].Image; + } + + public void SetLabel (string label, int segment) + { + var item = this.segments[segment]; + item.Label = label; + if (item.Image != null) + return; + + item.View = new UnderlinedTextField () { + BackgroundColor = NSColor.Clear, + Editable = false, + Bezeled = false, + StringValue = label + }; + this.stackView.AddView (item.View, NSStackViewGravity.Leading); + } + + public string GetLabel (int segment) + { + return this.segments[segment].Label; + } + + public int SegmentCount + { + get => this.segments.Length; + set + { + this.segments = new SegmentItem[value]; + } + } + } + internal class UnderlinedTabViewController : NotifyingTabViewController where TViewModel : NotifyingObject { - private NSStackView labelStack = new NSStackView () { + private NSStackView tabStack = new NSStackView () { Spacing = 4f, }; public override void NumberOfItemsChanged (NSTabView tabView) { base.NumberOfItemsChanged (tabView); - var items = this.labelStack.Views.ToList (); + var items = this.tabStack.Views.ToList (); foreach (var view in items) { - this.labelStack.RemoveView (view); + this.tabStack.RemoveView (view); } var i = 0; foreach (var item in TabViewItems) { - this.labelStack.AddView (new UnderlinedTextField () { - BackgroundColor = NSColor.Clear, - Editable = false, - Bezeled = false, - StringValue = item.Label, - Selected = i == SelectedTabViewItemIndex, - }, NSStackViewGravity.Leading); + if (item.Image != null) { + this.tabStack.AddView (new UnderlinedImageView (item.Image.Name) { + Selected = i == SelectedTabViewItemIndex + }, NSStackViewGravity.Leading); + } else { + this.tabStack.AddView (new UnderlinedTextField () { + BackgroundColor = NSColor.Clear, + Editable = false, + Bezeled = false, + StringValue = item.Label, + Selected = i == SelectedTabViewItemIndex, + }, NSStackViewGravity.Leading); + } i++; } } public override void MouseDown (NSEvent theEvent) { - var hit = View.HitTest (View.Superview.ConvertPointFromView (theEvent.LocationInWindow, null)); - if (!(hit is UnderlinedTextField)) + NSView hit = View.HitTest (View.Superview.ConvertPointFromView (theEvent.LocationInWindow, null)); + if (!(hit is ISelectable)) return; int i = 0; - foreach (var label in labelStack.Views) { + foreach (var label in tabStack.Views) { if (hit == label) { SelectedTabViewItemIndex = i; break; @@ -48,10 +119,10 @@ namespace Xamarin.PropertyEditing.Mac public override void DidSelect (NSTabView tabView, NSTabViewItem item) { base.DidSelect (tabView, item); - for (int i = 0; i < this.labelStack.Views.Length; i++) { - var underlined = this.labelStack.Views[i] as UnderlinedTextField; - if (underlined != null) - underlined.Selected = SelectedTabViewItemIndex == i; + for (int i = 0; i < this.tabStack.Views.Length; i++) { + var tabItem = this.tabStack.Views[i] as ISelectable; + if (tabItem != null) + tabItem.Selected = SelectedTabViewItemIndex == i; } } @@ -59,11 +130,11 @@ namespace Xamarin.PropertyEditing.Mac { var stack = new NSStackView () { Spacing = 0, - Alignment = NSLayoutAttribute.Width, + Alignment = NSLayoutAttribute.Left, Orientation = NSUserInterfaceLayoutOrientation.Vertical }; - stack.AddView (this.labelStack, NSStackViewGravity.Leading); + stack.AddView (this.tabStack, NSStackViewGravity.Top); stack.AddView (TabView, NSStackViewGravity.Bottom); View = stack; } -- cgit v1.2.3