private void CreateColourPallette() { var subViews = Subviews; if (subViews.Length > 0) { foreach (var sv in subViews) { if (sv is FocusableButton fb) { fb.Activated -= MaterialColourButton_Activated; } sv.RemoveFromSuperview(); sv.Dispose(); } } if (ViewModel == null) { return; } var colors = ViewModel.Palettes.Select(p => new { p.Name, Color = p.MainColor }).ToArray(); int col = 0; nfloat x = 0; nfloat y = 6; const int FrameWidth = 430; // TODO Get proper Frame.Width, but hacking to get this working const int FrameHeight = 202; // TODO Get proper Frame.Height, but hacking to get this working var width = (FrameWidth - 54) / 10; var height = (FrameHeight - 49) / 4; MaterialColorLayer CreateLayer(CommonColor color) { var selectedColor = color.Lightness > 0.58 ? NSColor.Black : NSColor.White; return(new MaterialColorLayer { BackgroundColor = color, ForegroundColor = selectedColor.CGColor, Text = color.Label, FontSize = 12, ContentsScale = NSScreen.MainScreen.BackingScaleFactor, TextAlignmentMode = CATextLayerAlignmentMode.Center, }); } foreach (var p in colors) { var frame = new CGRect(x, y, width, height); var selectedColor = p.Color.Lightness > 0.58 ? NSColor.Black : NSColor.White; var isSelected = ViewModel.Color == p.Color || ViewModel.ColorName == p.Name; var l = new MaterialColorLayer { Frame = new CGRect(0, 0, width, height), ForegroundColor = selectedColor.CGColor, BackgroundColor = p.Color, CornerRadius = 3, BorderColor = new CGColor(.5f, .5f, .5f, .5f), MasksToBounds = false, IsSelected = isSelected }; var materialColourButton = new FocusableButton { Frame = frame, WantsLayer = true, Layer = l, ToolTip = p.Name, Transparent = false, TranslatesAutoresizingMaskIntoConstraints = true, }; if (isSelected) { SelectedButton = materialColourButton; } materialColourButton.Activated += MaterialColourButton_Activated; AddSubview(materialColourButton); x += width + 6; col++; if (col >= 10) { x = 0; y += height + 6; col = 0; } } var colourName = new UnfocusableTextField { Frame = new CGRect(x, y + 6, FrameWidth, PropertyEditorControl.DefaultControlHeight), StringValue = ViewModel.ColorName, TranslatesAutoresizingMaskIntoConstraints = true, }; AddSubview(colourName); y += 25; x = 0; width = FrameWidth / ViewModel.NormalColorScale.Count(); foreach (var color in ViewModel.NormalColorScale) { var l = CreateLayer(color.Value); var isSelected = color.Value == ViewModel.NormalColor || color.Value == ViewModel.Color; l.ColorType = MaterialColorType.Normal; l.IsSelected = isSelected; l.Frame = new CGRect(0, 0, width, height); var normalColourButton = new FocusableButton { Frame = new CGRect(x, y, width, height), WantsLayer = true, Layer = l, ToolTip = color.ToString(), Transparent = false, TranslatesAutoresizingMaskIntoConstraints = true, }; if (isSelected) { SelectedButton = normalColourButton; } normalColourButton.Activated += MaterialColourButton_Activated; AddSubview(normalColourButton); x += width; } var window = Window; if (!ViewModel.AccentColorScale.Any()) { if (window != null) { window.RecalculateKeyViewLoop(); // Still needs to be called for the Buttons above. if (SelectedButton != null) { window.MakeFirstResponder(SelectedButton); } } return; } y += height + 6; x = 0; width = FrameWidth / ViewModel.AccentColorScale.Count(); foreach (var color in ViewModel.AccentColorScale) { var l = CreateLayer(color.Value); var isSelected = color.Value == ViewModel.AccentColor || color.Value == ViewModel.Color; l.ColorType = MaterialColorType.Accent; l.IsSelected = isSelected; l.Frame = new CGRect(0, 0, width, height); var accentColourButton = new FocusableButton { Frame = new CGRect(x, y, width, height), WantsLayer = true, Layer = l, ToolTip = color.ToString(), Transparent = false, TranslatesAutoresizingMaskIntoConstraints = true, }; if (isSelected) { SelectedButton = accentColourButton; } accentColourButton.Activated += MaterialColourButton_Activated; AddSubview(accentColourButton); x += width; } if (window != null) { window.RecalculateKeyViewLoop(); if (SelectedButton != null) { window.MakeFirstResponder(SelectedButton); } } }
public override void Layout() { if (Layer?.Sublayers != null) { foreach (var l in Layer.Sublayers) { l.RemoveFromSuperLayer(); l.Dispose(); } } if (ViewModel == null) { return; } var colors = ViewModel.Palettes.Select(p => new { p.Name, Color = p.MainColor }).ToArray(); int col = 0; nfloat x = 0; nfloat y = 6; var width = (Frame.Width - 54) / 10; var height = (Frame.Height - 49) / 4; MaterialColorLayer CreateLayer(CommonColor color) { var selectedColor = color.Lightness > 0.58 ? NSColor.Black : NSColor.White; return(new MaterialColorLayer { BackgroundColor = color, ForegroundColor = selectedColor.CGColor, Text = color.Label, FontSize = 12, ContentsScale = NSScreen.MainScreen.BackingScaleFactor, TextAlignmentMode = CATextLayerAlignmentMode.Center, }); } foreach (var p in colors) { var frame = new CGRect(x, y, width, height); var selectedColor = p.Color.Lightness > 0.58 ? NSColor.Black : NSColor.White; var l = new MaterialColorLayer { Frame = frame, ForegroundColor = selectedColor.CGColor, BackgroundColor = p.Color, CornerRadius = 3, BorderColor = new CGColor(.5f, .5f, .5f, .5f), MasksToBounds = false, IsSelected = ViewModel.Color == p.Color || ViewModel.ColorName == p.Name }; l.BorderColor = new CGColor(.5f, .5f, .5f, .5f); l.Frame = new CGRect(x, y, width, height); Layer.AddSublayer(l); x += width + 6; col++; if (col >= 10) { x = 0; y += height + 6; col = 0; } } Layer.AddSublayer(new CATextLayer { ForegroundColor = NSColor.ControlText.CGColor, Frame = new CGRect(x, y + 6, Frame.Width, 25), String = ViewModel.ColorName, FontSize = NSFont.SmallSystemFontSize, ContentsScale = Window?.Screen?.BackingScaleFactor ?? NSScreen.MainScreen.BackingScaleFactor }); y += 25; x = 0; width = Frame.Width / ViewModel.NormalColorScale.Count(); var normal = new CALayer { CornerRadius = 3, MasksToBounds = true, Frame = new CGRect(x, y, Frame.Width, height), BorderColor = new CGColor(.5f, .5f, .5f, .5f), BorderWidth = 1 }; Layer.AddSublayer(normal); foreach (var color in ViewModel.NormalColorScale) { var l = CreateLayer(color.Value); l.ColorType = MaterialColorType.Normal; l.IsSelected = color.Value == ViewModel.NormalColor || color.Value == ViewModel.Color; l.Frame = new CGRect(x, 0, width, height); normal.AddSublayer(l); x += width; } if (ViewModel.AccentColorScale.Count() <= 0) { return; } y += height + 6; x = 0; var accent = new CALayer { CornerRadius = 3, MasksToBounds = true, Frame = new CGRect(x, y, Frame.Width, height), BorderColor = new CGColor(.5f, .5f, .5f, .5f), BorderWidth = 1 }; Layer.AddSublayer(accent); width = Frame.Width / ViewModel.AccentColorScale.Count(); foreach (var color in ViewModel.AccentColorScale) { var l = CreateLayer(color.Value); l.ColorType = MaterialColorType.Accent; l.IsSelected = color.Value == ViewModel.AccentColor || color.Value == ViewModel.Color; l.Frame = new CGRect(x, 0, width, height); accent.AddSublayer(l); x += width; } }