• 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: Source list with counter next to item title
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Source list with counter next to item title


  • Subject: Re: Source list with counter next to item title
  • From: GbT <email@hidden>
  • Date: Tue, 20 Nov 2007 15:38:08 +0100

Thanks very much!
Right before this approach I subclassed nstextfieldcell and draw a filled
oval to contain the textual count, it works well, but not as much as this
solution I suppose. What's the difference with mine solution, the final
effect or what else? In your case you use NSImageCell as a base, I choosed
NSTextFieldCell, maybe the rendering of the oval is much different and
elegant.


2007/11/20, Conor <email@hidden>:
>
> You can use bindings or a data source; either way return an NSNumber with
> the count and then draw it in your custom cell. DVDpedia, Bookpedia,
> CDpedia
> and Gamepedia use bindings directly to a core data managed object that
> returns the count of a relationship:
>
> return [NSNumber numberWithInt:[[self entries] count]];
>
> For the custom cell a subclass of an NSImageCell:
>
> @interface MyCountImageCell : NSImageCell {
>     @private
>     NSColor *blueOvalColor;
>     NSDictionary *selectedFontAttribute, *fontAttribute;
>     int previousCount;
> }
> @end
>
> // http://www.cocoadev.com/index.pl?NSBezierPathCategory
> @interface NSBezierPath (CocoaDevCategory)
> + (NSBezierPath*)bezierPathWithRoundRectInRect:(NSRect)aRect
> radius:(float)radius;
> @end
>
>
> @implementation MyCountImageCell
>
> - (id)init {
>     self = [super init];
>     if (self != nil) {
>         blueOvalColor = [[NSColor colorWithDeviceRed:154.0/255.0
> green:171.0/255.0 blue:201.0/255.0 alpha:1.0] retain];
>         selectedFontAttribute = [[NSDictionary
> dictionaryWithObjectsAndKeys:
> [NSFont fontWithName:@"Helvetica-Bold" size:13], NSFontAttributeName,
> [NSColor colorWithDeviceRed:150.0/255.0 green:161.0/255.0 blue:183.0/255.0
> alpha:1.0], NSForegroundColorAttributeName, nil] retain];
>         fontAttribute = [[NSDictionary dictionaryWithObjectsAndKeys:
> [NSFont
> fontWithName:@"Helvetica-Bold" size:13], NSFontAttributeName,  [NSColor
> whiteColor], NSForegroundColorAttributeName, nil] retain];
>     }
>     return self;
> }
>
>
> - (void)setObjectValue:(id)aValue {
>
>     if ([aValue isKindOfClass:[NSImage class]]) {
>         [super setObjectValue:aValue];
>         return;
>     }
>
>     unsigned int count = [aValue intValue];
>     if (previousCount != count) {
>
>         if (count == -1) { // a Group colelction don't draw
>             [super setObjectValue:nil];
>             return;
>         }
>
>         int additonalSpace;
>         if (count < 10)
>             additonalSpace = 0;
>         else if (count < 100)
>             additonalSpace = 8;
>         else if (count < 1000)
>             additonalSpace = 16;
>         else
>             additonalSpace = 24 ;
>
>         NSString *numberString = [NSString stringWithFormat:@"%d", count];
>         NSSize imageSize = NSMakeSize(22 + additonalSpace, 18);
>         NSImage *dragImage = [[NSImage alloc] initWithSize:imageSize];
>
>         [dragImage lockFocus];
>
>         [blueOvalColor set];
>         NSBezierPath *p = [NSBezierPath
> bezierPathWithRoundRectInRect:NSMakeRect(0, 2, imageSize.width - 2, 15)
> radius:9.0];
>         [p fill];
>
>         [numberString drawInRect:NSMakeRect(6, 1, imageSize.width, 18)
> withAttributes:fontAttribute];
>
>         [dragImage unlockFocus];
>
>         [super setObjectValue:[dragImage autorelease]];
>         previousCount = count;
>     }
> }
>
> @end
>
>
> @implementation NSBezierPath (CocoaDevCategory)
>
> + (NSBezierPath*)bezierPathWithRoundRectInRect:(NSRect)aRect
> radius:(float)radius
> {
>    NSBezierPath* path = [self bezierPath];
>    radius = MIN(radius, 0.5f * MIN(NSWidth(aRect), NSHeight(aRect)));
>    NSRect rect = NSInsetRect(aRect, radius, radius);
>    [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect),
> NSMinY(rect))
>                                           radius:radius startAngle:180.0
> endAngle:270.0];
>    [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(rect),
> NSMinY(rect))
>                                           radius:radius startAngle:270.0
> endAngle:360.0];
>    [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(rect),
> NSMaxY(rect))
>                                           radius:radius startAngle:  0.0
> endAngle: 90.0];
>    [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect),
> NSMaxY(rect))
>                                           radius:radius startAngle: 90.0
> endAngle:180.0];
>    [path closePath];
>    return path;
> }
>
> @end
>
> Regards,
> Conor
> http://www.bruji.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
>
_______________________________________________

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

References: 
 >Re: Source list with counter next to item title (From: Conor <email@hidden>)

  • Prev by Date: Re: Why is Leopard annoying my users?
  • Next by Date: Cookies-woes
  • Previous by thread: Re: Source list with counter next to item title
  • Next by thread: Re: Source list with counter next to item title
  • Index(es):
    • Date
    • Thread