• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Custom cell wanted
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Custom cell wanted


  • Subject: Re: Custom cell wanted
  • From: "email@hidden" <email@hidden>
  • Date: Wed, 10 Mar 2010 14:49:10 +0000

On 10 Mar 2010, at 14:35, Graham Cox wrote:

> Hi,
>
> I need a custom cell for a table/outline view that is exactly like Mail's 'unread' count - the grey lozenge with a number in it. It's probably only a few hours work but maybe someone has already done it and would be willing to share?
>
Graham

Not sure if this will prove useful or not.

Regards

Jonathan Mitchell

Developer
http://www.mugginsoft.com

//
//  MGSCapsuleTextCell.h
//
//
//  Created by Jonathan on 21/06/2008.
//  Copyright 2008 Mugginsoft. All rights reserved.
//

#import <Cocoa/Cocoa.h>


@interface MGSCapsuleTextCell : NSTextFieldCell {
	BOOL _capsuleHasShadow;
	BOOL _sizeCapsuleToFit;
}

@property BOOL capsuleHasShadow;
@property BOOL sizeCapsuleToFit;
@end

//
//  MGSCapsuleTextCell.m
//
//
//  Created by Jonathan on 21/06/2008.
//  Copyright 2008 Mugginsoft. All rights reserved.
//

#import "MGSCapsuleTextCell.h"
//#import "MGSImageAndTextCell.h"

#define kMinCapsuleWidth 20

@implementation MGSCapsuleTextCell

@synthesize capsuleHasShadow = _capsuleHasShadow;
@synthesize sizeCapsuleToFit = _sizeCapsuleToFit;

/*

init

*/
- (id)init
{
	if ((self = [super init])) {
		_capsuleHasShadow = NO;
		_sizeCapsuleToFit = NO;
	}
	return self;
}
/*

init with coder

*/
- (id)initWithCoder:(NSCoder *)decoder
{
	self = [super initWithCoder:decoder];
	if (self) {
	_capsuleHasShadow = NO;
	_sizeCapsuleToFit = YES;
	}
	return self;
}

// -------------------------------------------------------------------------------
//	drawWithFrame:inView:
// -------------------------------------------------------------------------------
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
{

	#pragma unused(controlView)

	NSString *stringValue = [self stringValue];

	// Use the current font point size as a guide for the count font size
	float pointSize = [[self font] pointSize];
	NSColor *fontColor = [self textColor];
	NSColor *capsuleColor = [self backgroundColor];

	// Create attributes for drawing the string.
	/*NSDictionary * attributes = [[NSDictionary alloc] initWithObjectsAndKeys:[NSFont boldSystemFontOfSize:pointSize],
								 NSFontAttributeName,
								 fontColor,
								 NSForegroundColorAttributeName,
								 nil];*/
	NSDictionary * attributes = [[NSDictionary alloc] initWithObjectsAndKeys:[NSFont fontWithName:@"Helvetica-Bold" size:pointSize],
								 NSFontAttributeName,
								 fontColor,
								 NSForegroundColorAttributeName,
								 nil];
	NSSize stringSize = [stringValue sizeWithAttributes:attributes];

	// Compute the dimensions of the capsule rectangle.
	int cellWidth = cellFrame.size.width;
	if (_sizeCapsuleToFit) {
		cellWidth = MAX(stringSize.width + 6, stringSize.height + 1) + 1;
	}

	if (cellWidth < kMinCapsuleWidth) {
		cellWidth = kMinCapsuleWidth;
	}

	NSRect capsuleFrame;

	// frame centre x
	CGFloat centreX = cellFrame.origin.x + cellFrame.size.width/2;

	// align left or right
	NSTextAlignment alignment = [self alignment];
	if (alignment == NSRightTextAlignment) {
		NSDivideRect(cellFrame, &capsuleFrame, &cellFrame, cellWidth + 4, NSMaxXEdge);
	} else {
		NSDivideRect(cellFrame, &capsuleFrame, &cellFrame, cellWidth + 4, NSMinXEdge);
	}

	// align centre
	if ([self alignment] == NSCenterTextAlignment) {
		capsuleFrame.origin.x = centreX - capsuleFrame.size.width/2;
	}

	CGFloat heightDelta = capsuleFrame.size.height - stringSize.height - 2;
	capsuleFrame.size.height =  stringSize.height + 2;
	capsuleFrame.origin.y += heightDelta/2;

	if ([self drawsBackground])
	{
		[[self backgroundColor] set];
		NSRectFill(capsuleFrame);
	}


	// if the  capsule is not full size there is insufficient room to display it properly.
	// so don't.
	if (capsuleFrame.size.width >= kMinCapsuleWidth) {

		if (_capsuleHasShadow) {
			// prepare to receive shadow
			[[NSGraphicsContext currentContext] saveGraphicsState];

			// Create the shadow
			NSShadow* theShadow = [[NSShadow alloc] init];
			[theShadow setShadowOffset:NSMakeSize(0, -4)];
			[theShadow setShadowBlurRadius:4.0f];

			// Use a partially transparent color for shapes that overlap.
			[theShadow setShadowColor:[[NSColor blackColor]
									   colorWithAlphaComponent:0.3f]];

			[theShadow set];
		} else {
			// draw offset capsule
			NSBezierPath *offsetBp = [NSBezierPath bezierPathWithRoundedRect:capsuleFrame xRadius:stringSize.height / 2 yRadius:stringSize.height / 2];
			NSAffineTransform *transform = [NSAffineTransform transform];
			[transform translateXBy:0.0f yBy: 1.0f];
			[offsetBp transformUsingAffineTransform:transform];
			[fontColor set];
			[offsetBp fill];
		}

		// draw capsule
		NSBezierPath *bp = [NSBezierPath bezierPathWithRoundedRect:capsuleFrame xRadius:stringSize.height / 2 yRadius:stringSize.height / 2];
		[capsuleColor set];
		[bp fill];

		if (_capsuleHasShadow) {
			[[NSGraphicsContext currentContext] restoreGraphicsState];
		}

		// Draw the string in the rounded rectangle we just created.
		NSPoint point = NSMakePoint(NSMidX(capsuleFrame) - stringSize.width / 2.0f,  NSMidY(capsuleFrame) - stringSize.height / 2.0f );
		[stringValue drawAtPoint:point withAttributes:attributes];
		[attributes release];
	}

}


Regards

Jonathan Mitchell

Developer
http://www.mugginsoft.com






_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • [SOLVED] Re: Custom cell wanted
      • From: Graham Cox <email@hidden>
  • Prev by Date: Custom cell wanted
  • Next by Date: Re: UIImageView animationImages problem
  • Previous by thread: Re: Custom cell wanted
  • Next by thread: [SOLVED] Re: Custom cell wanted
  • Index(es):
    • Date
    • Thread