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.


Notify of

1 Comment
Inline Feedbacks
View all comments

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.

Subscribe to new posts:

You'll get an email whenever a I publish a new post to my blog and nothing more. -- Corbin

As an Amazon Associate I earn from qualifying purchases.

(c) 2008-2024 Corbin Dunn

Privacy Policy

Subscribe to RSS feeds for entries.

67 queries. 0.147 seconds.

Log in