Drawing a “mail like” border on items in an NSTableView

Apple, Cocoa, General

Mail has a cool way of making unread messages stand out. It is really easy to do this type of thing with NSTableView/NSOutlineView. Subclass the one you want, and override drawRow. Toss in the code you see below, and it should give a cool highlight on all expandable rows in an NSOutlineView (you will have to modify it to have it work in NSTableView — just remove the call to isExpandable).


- (void)drawRow:(int)row clipRect:(NSRect)clipRect {
    if (([self isExpandable:[self itemAtRow:row]]) && (![self isRowSelected:row])) {
        // Draw a light-blue “mail like” border around the row, if not selected
        NSRect rect = [self rectOfRow:row];
        [[[NSColor blueColor] colorWithAlphaComponent:50/255.0] set];
        NSBezierPath *path = [NSBezierPath bezierPath];
        [path setLineCapStyle:NSRoundLineCapStyle];
        [path setLineWidth:rect.size.height - 3];
        int rowLevel = [self levelForRow:row];
        float x = rect.origin.x + 10.0 + (rowLevel * [self indentationPerLevel]);
        float y = rect.origin.y + (rect.size.height / 2.0);
        [path moveToPoint:NSMakePoint(x,y)];
        [path lineToPoint:NSMakePoint(x + rect.size.width - 2*10.0, y)];
        [path stroke];
    [super drawRow:row clipRect:clipRect];

NOTE: use this at your own risk. I think resizing the thing doesn’t quite work.

Next in Apple
Greener AAPLs

Leave a Reply

1 Comment threads
0 Thread replies
Most reacted comment
Hottest comment thread
1 Comment authors
Steve Recent comment authors
Notify of

If it does not work in all cases, ie is robust, then it is not actually easy is it? Since of course you have not accomplished the task.

(c) 2008-2019 Corbin Dunn

Privacy Policy

Subscribe to RSS feeds for entries.

81 queries. 0.128 seconds.

Log in