Skip to content

Commit

Permalink
Mac: Fix Tree/GridView header tooltips when setting the background color
Browse files Browse the repository at this point in the history
  • Loading branch information
cwensley committed Nov 16, 2023
1 parent 7cafd8a commit 6f4e4e7
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 59 deletions.
2 changes: 1 addition & 1 deletion lib/monomac
89 changes: 31 additions & 58 deletions src/Eto.Mac/Forms/Controls/GridHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,57 +71,23 @@ public override void MouseDown(NSEvent theEvent)
}
}

class EtoTableHeaderViewWithBackground : EtoTableHeaderView
class EtoBackgroundView : NSView
{
[Export("backgroundColor")]
public NSColor BackgroundColor { get; set; }

public EtoBackgroundView()
{
}

public EtoBackgroundView(NativeHandle handle) : base(handle)
{
}

public override void DrawRect(CGRect dirtyRect)
{
if (BackgroundColor == null)
{
base.DrawRect(dirtyRect);
return;
}

// gotta draw header cells manually to get a custom background color without tinting...
var bounds = Bounds;
BackgroundColor.SetFill();
NSBezierPath.FillRect(bounds);

NSBezierPath path;
nfloat? position = null;
var dividerSize = ConvertSizeToBacking(new CGSize(1, 1));
var spacing = TableView.IntercellSpacing.Width;
var columns = TableView.TableColumns();
for (int i = 0; i < columns.Length; i++)
{
var cellFrame = GetHeaderRect(i);
var col = columns[i];
var cell = col.HeaderCell;
if (col.Hidden || cell == null)
continue;
cell.DrawWithFrame(cellFrame, this);
if (position == null)
{
// draw separator up to first column
NSColor.Separator.Set();
path = new NSBezierPath();
path.MoveTo(new CGPoint(bounds.X, bounds.Bottom));
path.LineTo(new CGPoint(cellFrame.X, bounds.Bottom));
path.LineWidth = dividerSize.Height;
path.Stroke();
path.Dispose();
}
position = cellFrame.Right;
}
// draw separator from last column
NSColor.Separator.Set();
path = new NSBezierPath();
path.MoveTo(new CGPoint(position ?? bounds.X, bounds.Bottom));
path.LineTo(new CGPoint(bounds.Right, bounds.Bottom));
path.LineWidth = dividerSize.Height;
path.Stroke();
path.Dispose();
NSBezierPath.FillRect(Bounds);
}
}

Expand Down Expand Up @@ -530,10 +496,7 @@ public bool ShowHeader
{
if (value && Control.HeaderView == null)
{
if (HasBackgroundColor && !UseNSBoxBackgroundColor)
headerView = new EtoTableHeaderViewWithBackground { Handler = this, BackgroundColor = BackgroundColor.ToNSUI(), Menu = ContextMenu.ToNS() };
else
headerView = new EtoTableHeaderView { Handler = this, Menu = ContextMenu.ToNS() };
headerView = new EtoTableHeaderView { Handler = this, Menu = ContextMenu.ToNS() };
Control.HeaderView = headerView;
}
else if (!value && Control.HeaderView != null)
Expand Down Expand Up @@ -975,17 +938,27 @@ protected override void SetBackgroundColor(Color? color)
Control.BackgroundColor = bg;
if (!UseNSBoxBackgroundColor)
{
var currentHeader = Control.HeaderView;
if (currentHeader is EtoTableHeaderViewWithBackground backgroundHeaderView)
{
backgroundHeaderView.BackgroundColor = bg;
backgroundHeaderView.SetNeedsDisplay();
}
else if (currentHeader != null)
var clip = ScrollView.Subviews.OfType<NSClipView>().FirstOrDefault(r => r.DocumentView == headerView);
var banner = clip?.Subviews.FirstOrDefault(r => r.Class.Name == "NSBannerView");
var effectView = banner?.Subviews.OfType<NSVisualEffectView>().FirstOrDefault();
if (effectView == null || banner == null)
return;

// inject a view above the effectView with our desired background color
var backgroundView = banner.Subviews.OfType<EtoBackgroundView>().FirstOrDefault();
if (backgroundView == null)
{
headerView = new EtoTableHeaderViewWithBackground { Handler = this, BackgroundColor = bg, Menu = ContextMenu.ToNS() };
Control.HeaderView = headerView;
backgroundView = new EtoBackgroundView
{
Frame = banner.Bounds,
AutoresizingMask = NSViewResizingMask.WidthSizable | NSViewResizingMask.HeightSizable,
TranslatesAutoresizingMaskIntoConstraints = true
};
banner.AddSubview(backgroundView, NSWindowOrderingMode.Above, effectView);
}

backgroundView.BackgroundColor = bg;
backgroundView.SetNeedsDisplay();
}
}

Expand Down

0 comments on commit 6f4e4e7

Please sign in to comment.