Formatage de NSTextFieldCell?

uocramuocram Membre
21:19 modifié dans API AppKit #1
Existe-t-il une solution dans IB pour obtenir un formatage des nombres dans une NSTableView, tel que celui du fichier joint, ou sinon comment faire?

Réponses

  • uocramuocram Membre
    21:19 modifié #2
    Comme dans Mail, pour montrer le nombre de messages non lus dans chaque boà®te :
  • Philippe49Philippe49 Membre
    21:19 modifié #3
    Ce n'est pas une colonne supplémentaire dans la table view, avec une NSImageCell et les numéros faits en image ?
  • uocramuocram Membre
    21:19 modifié #4
    Je n'ai pas trouvé, donc je propose ça :
    Une classe BadgedCell dérivée d'une NSTextFieldCell qui récupère les paramètres choisis dans IB pour gérer l'affichage (fontName, size, alignment) et tenant compte de l'état des contrôles.
    Voilà  le code pour ceux que ça interesse :
    //<br />//&nbsp; BadgedCell.h<br />//<br />//&nbsp; Created by uocram on 08/11/09.<br />//&nbsp; Copyright uocram. All rights reserved.<br />//<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br /><br />@interface BadgedCell : NSTextFieldCell {<br />	<br /><br />}<br /><br />@end<br />
    


    //<br />//&nbsp; BadgedCell.m<br />//<br />//&nbsp; Created by uocram on 08/11/09.<br />//&nbsp; Copyright 2009 uocram. All rights reserved.<br />//<br /><br />#import &quot;BadgedCell.h&quot;<br /><br /><br />@implementation BadgedCell<br /><br />-(void) drawInteriorWithFrame:(NSRect)cellFrame&nbsp; inView:(NSView *)controlView<br />{<br />	// on récupère la valeur contenue dans la cell<br />	NSString	*cellString = [self stringValue];<br />	<br />	// on récupère la taille de la font choisie dans IB<br />	NSUInteger	cellFontSize = [self controlSize];<br />	CGFloat		fontSize = 13.0;<br />	<br />	// on récupère le nom de la font choisie dans IB<br />	// NSString	*fontName = [[self font] fontName];<br /><br />	// une police Helvetica-Bold est utilisée par Apple dans ses applications<br />	// on force Helvetica_Bold :<br />	NSString	*fontName = @&quot;Helvetica-Bold&quot;;<br /><br />	// on déclare les radius des arrondis<br />	NSUInteger	x_radius = 0;<br />	NSUInteger	y_radius = 0;<br />	switch (cellFontSize) <br />	{<br />		case NSRegularControlSize:<br />			fontSize = 13.0;<br />			x_radius = 8;<br />			y_radius = 8;<br />			break;<br />		case NSSmallControlSize:<br />			fontSize = 11.0;<br />			x_radius = 7;<br />			y_radius = 7;<br />			break;<br />		case NSMiniControlSize:<br />			fontSize = 9.0;<br />			x_radius = 6;<br />			y_radius = 6;<br />			break;<br />		default:<br />			fontSize = 13.0;<br />			x_radius = 8;<br />			y_radius = 8;<br />			break;<br />	}<br />	<br />	// on définit la police<br />	NSFont	*badgeFont = [NSFont fontWithName:fontName size:fontSize];<br />	<br />	// dictionnaire des attributs de dessin de la string dans le badge<br />	NSDictionary *dict = [[NSMutableDictionary alloc] init];<br />	[dict setValue:badgeFont forKey:NSFontAttributeName];<br /><br />	// taille de cette string avec les attributs choisis dans IB<br />	NSSize		gabaritStringSize = [cellString sizeWithAttributes:dict];<br />	CGFloat		stringWidth = gabaritStringSize.width;<br />	CGFloat		stringHeight = gabaritStringSize.height;	<br />	<br />	// centrer verticalement<br />	cellFrame.origin.y = cellFrame.origin.y + ((cellFrame.size.height - stringHeight) / 2);<br />	// on fixe la hauteur de la cellFrame à  la hauteur de la string<br />	cellFrame.size.height = stringHeight;<br /><br />	// on déplace l&#39;origine X selon l&#39;alignement choisi dans IB<br />	NSInteger	alignement = [self alignment];<br />	// alignement à  gauche : on ne fait rien<br />	switch (alignement)<br />	{<br />		case NSLeftTextAlignment:<br />			break;<br />		case NSCenterTextAlignment:<br />			cellFrame.origin.x += (cellFrame.size.width - (stringWidth + (x_radius * 2))) / 2;<br />			break;<br />		case NSRightTextAlignment:<br />			cellFrame.origin.x += cellFrame.size.width - (stringWidth + (x_radius * 2));<br />			break;<br />		default:<br />			break;<br />	}<br /><br />	// on ajuste la largeur avec les arrondis<br />	cellFrame.size.width = stringWidth + x_radius * 2;<br /><br />	// on dessine le badge à  la taille de la frame<br />	NSBezierPath *badgePath = [NSBezierPath bezierPathWithRoundedRect:cellFrame <br />															&nbsp; xRadius:x_radius <br />															&nbsp; yRadius:y_radius];<br /><br />	// on calcule la taille du rectangle où sera dessinée la string de la valeur de la cell<br />	NSRect	stringRect = cellFrame;<br />	stringRect.origin.x += x_radius;<br />	stringRect.size.width -= x_radius * 2;<br />	<br />	// déclaration des booléens utilisés pour capter les différents états des contrôles<br />	// entrainant les différents aspects<br />	BOOL isWindowFront = [[NSApp mainWindow] isVisible];<br />	BOOL isViewInFocus = [[[[self controlView] window] firstResponder] isEqual:[self controlView]];<br />	BOOL isCellHighlighted = [self isHighlighted];<br />	<br />	if (isWindowFront &amp;&amp; isViewInFocus &amp;&amp; isCellHighlighted)<br />	{<br />		[[NSColor whiteColor] set];	// couleur du badge<br />		[badgePath fill];<br />		[dict setValue:badgeFont forKey:NSFontAttributeName];<br />		// couleur du texte<br />		[dict setValue:[NSColor alternateSelectedControlColor] forKey:NSForegroundColorAttributeName];<br />	}<br />	else if (isWindowFront &amp;&amp; isViewInFocus &amp;&amp; !isCellHighlighted)<br />	{<br />		[[NSColor colorWithCalibratedRed:.53 green:.60 blue:.74 alpha:1.0] set];<br />		[badgePath fill];<br />		[dict setValue:badgeFont forKey:NSFontAttributeName];<br />		[dict setValue:[NSColor whiteColor] forKey:NSForegroundColorAttributeName];<br />	}<br />	else if (isWindowFront &amp;&amp; isCellHighlighted)<br />	{<br />		[[NSColor whiteColor] set];<br />		[badgePath fill];<br />		[dict setValue:badgeFont forKey:NSFontAttributeName];<br />		[dict setValue:[NSColor colorWithCalibratedRed:.51 green:.58 blue:.72 alpha:1.0] forKey:NSForegroundColorAttributeName];<br />	}<br />	else if (!isWindowFront &amp;&amp; isCellHighlighted)<br />	{<br />		[[NSColor whiteColor] set];<br />		[badgePath fill];<br />		[dict setValue:badgeFont forKey:NSFontAttributeName];<br />		[dict setValue:[NSColor disabledControlTextColor] forKey:NSForegroundColorAttributeName];<br />	}<br />	else<br />	{<br />		[[NSColor disabledControlTextColor] set];<br />		[badgePath fill];<br />		[dict setValue:badgeFont forKey:NSFontAttributeName];<br />		[dict setValue:[NSColor whiteColor] forKey:NSForegroundColorAttributeName];<br />	}<br />	// dessin de la valeur dans le badge<br />	[cellString drawInRect:stringRect withAttributes:dict];<br /><br />	// nettoyage<br />	[dict release];<br />}<br /><br />@end<br />
    
  • uocramuocram Membre
    21:19 modifié #5
    Avec un formatage des badges basé sur des préférences et avec une meilleure implémentation des différents états de l'application, de la fenêtre et de la cellule.
    La liste ne remet pas à  jour les cellules non sélectionnées quand l'application passe de active à  inactive (et l'inverse). Donc il faut ajouter dans l'AppController un observer qui surveille le passage de l'appli de actif à  inactif et demander un redessin de la tableView.
    Avec tout cela, elle se comporte à  peu près comme dans Mail.

    Code :

    //<br />//&nbsp; BadgedCell.m<br />//<br />//&nbsp; Created by uocram on 16/11/09.<br />//&nbsp; Copyright 2009 uocram. All rights reserved.<br />//<br /><br />#import &quot;BadgedCell.h&quot;<br /><br /><br />@implementation BadgedCell<br /><br />-(void) drawInteriorWithFrame:(NSRect)cellFrame&nbsp; inView:(NSView *)controlView<br />{<br />	// on récupère la valeur contenue dans la cell<br />	NSString	*cellString = [self stringValue];<br />	<br />	// on récupère la taille de la font choisie dans IB<br />	// NSUInteger	cellFontSize = [self controlSize];<br /><br />	// on récupère la taille de la font choisie dans les préférences de l&#39;application<br />	// NSRegularControlSize == 0<br />	// NSSmallControlSize == 1<br />	// NSMiniControlSize == 2<br />	NSUInteger	cellFontSize = [[[NSUserDefaults standardUserDefaults] valueForKey:@&quot;BadgesSize&quot;] intValue];<br />	CGFloat		fontSize;<br />	<br />	// on récupère le nom de la font choisie dans IB<br />	// NSString	*fontName = [[self font] fontName];<br /><br />	// une police Helvetica-Bold est utilisée par Apple dans ses applications<br />	// on force Helvetica_Bold :<br />	NSString	*fontName = @&quot;Helvetica-Bold&quot;;<br /><br />	// on déclare les radius des arrondis<br />	NSUInteger	x_radius = 0;<br />	NSUInteger	y_radius = 0;<br />	switch (cellFontSize) <br />	{<br />		case NSRegularControlSize:<br />			fontSize = 13.0;<br />			x_radius = 8;<br />			y_radius = 8;<br />			break;<br />		case NSSmallControlSize:<br />			fontSize = 11.0;<br />			x_radius = 7;<br />			y_radius = 7;<br />			break;<br />		case NSMiniControlSize:<br />			fontSize = 9.0;<br />			x_radius = 6;<br />			y_radius = 6;<br />			break;<br />		default:<br />			fontSize = 13.0;<br />			x_radius = 8;<br />			y_radius = 8;<br />			break;<br />	}<br />	<br />	// on définit la police<br />	NSFont	*badgeFont = [NSFont fontWithName:fontName size:fontSize];<br />	<br />	// dictionnaire des attributs de dessin de la string dans le badge<br />	NSDictionary *dict = [[NSMutableDictionary alloc] init];<br />	[dict setValue:badgeFont forKey:NSFontAttributeName];<br /><br />	// taille de cette string avec les attributs choisis dans IB<br />	NSSize		gabaritStringSize = [cellString sizeWithAttributes:dict];<br />	CGFloat		stringWidth = gabaritStringSize.width;<br />	CGFloat		stringHeight = gabaritStringSize.height;	// 16, 14, 12<br />	<br />	// centrer verticalement<br />	cellFrame.origin.y = cellFrame.origin.y + ((cellFrame.size.height - stringHeight) / 2);<br />	// on fixe la hauteur de la cellFrame à  la hauteur de la string<br />	cellFrame.size.height = stringHeight;<br /><br />	// on déplace l&#39;origine X selon l&#39;alignement choisi dans IB<br />	// NSInteger	alignement = [self alignment];<br /><br />	// on déplace l&#39;origine X selon l&#39;alignement choisi dans les préférences de l&#39;application<br />	// NSLeftTextAlignment == 0<br />	// NSRightTextAlignment == 1<br />	// NSCenterTextAlignment == 2<br />	NSInteger	alignement = [[[NSUserDefaults standardUserDefaults] valueForKey:@&quot;BadgesAligment&quot;] intValue];<br />	// alignement à  gauche : on ne fait rien<br />	switch (alignement)<br />	{<br />		case NSLeftTextAlignment:<br />			break;<br />		case NSCenterTextAlignment:<br />			cellFrame.origin.x += (cellFrame.size.width - (stringWidth + (x_radius * 2))) / 2;<br />			break;<br />		case NSRightTextAlignment:<br />			cellFrame.origin.x += cellFrame.size.width - (stringWidth + (x_radius * 2));<br />			break;<br />		default:<br />			break;<br />	}<br /><br />	// on ajuste la largeur avec les arrondis<br />	cellFrame.size.width = stringWidth + x_radius * 2;<br /><br />	// on dessine le badge à  la taille de la frame<br />	NSBezierPath *badgePath = [NSBezierPath bezierPathWithRoundedRect:cellFrame <br />															&nbsp; xRadius:x_radius <br />															&nbsp; yRadius:y_radius];<br /><br />	// on calcule la taille du rectangle où sera dessinée la string de la valeur de la cell<br />	NSRect	stringRect = cellFrame;<br />	stringRect.origin.x += x_radius;<br />	stringRect.size.width -= x_radius * 2;<br />	<br />	// déclaration des booléens utilisés pour capter les différents états des contrôles<br />	// entrainant les différents aspects<br />	NSWindow	*mainWindow = [[self controlView] window];<br />	BOOL		isActive = [NSApp isActive];<br />	BOOL		isKeyWindow = [mainWindow isKeyWindow];<br />	BOOL		isViewInFocus = [[mainWindow firstResponder] isEqual:[self controlView]];<br />	BOOL		isCellHighlighted = [self isHighlighted];<br />	NSColor		*badgeColor;<br />	NSColor		*textColor;<br />	NSColor		*gray = [NSColor colorWithCalibratedRed:.66 green:.66 blue:.66 alpha:1.0];<br />	NSColor		*blue = [NSColor colorWithCalibratedRed:.18 green:.41 blue:.72 alpha:1.0];<br />	NSColor		*blueGray = [NSColor colorWithCalibratedRed:.53 green:.60 blue:.74 alpha:1.0];<br />	<br />	if (isActive)	// Application active<br />	{<br />		if (isKeyWindow)	// c&#39;est la fenêtre active de l&#39;application <br />		{<br />			if (isCellHighlighted)	// la cell est sélectionnée<br />			{<br />				if (isViewInFocus)	// la cell est first responder<br />				{<br />					badgeColor = [NSColor whiteColor];<br />					textColor = blue;<br />				}<br />				else	// sélectionnée mais pas first responder<br />				{<br />					badgeColor = [NSColor whiteColor];<br />					textColor = blueGray;<br />				}<br />			}<br />			else 	// la cell n&#39;est pas sélectionnée<br />			{<br />				badgeColor = blueGray;<br />				textColor = [NSColor whiteColor];<br />			}<br />		}<br />		else	// ce n&#39;est pas la fenêtre active de l&#39;application <br />		{<br />			if (isCellHighlighted)	// la cell est sélectionnée<br />			{<br />				badgeColor = [NSColor whiteColor];<br />				textColor = blueGray;<br />			}<br />			else 	// la cell n&#39;est pas sélectionnée<br />			{<br />				badgeColor = blueGray;<br />				textColor = [NSColor whiteColor];<br />			}<br />		}<br />	}<br />	else <br />	{<br />		if (isCellHighlighted)	// l&#39;application est au second plan et la cell est sélectionnée<br />		{<br />			badgeColor = [NSColor whiteColor];<br />			textColor = gray;<br />		}<br />		else	// l&#39;application est au second plan et la cell n&#39;est pas sélectionnée<br />		{<br />			badgeColor = gray;<br />			textColor = [NSColor whiteColor];<br />		}<br />	}<br />	// dessin du badge<br />	[badgeColor set];<br />	[badgePath fill];<br />	<br />	// dessin de la valeur dans le badge<br />	[dict setValue:badgeFont forKey:NSFontAttributeName];<br />	[dict setValue:textColor forKey:NSForegroundColorAttributeName];<br />	[cellString drawInRect:stringRect withAttributes:dict];<br /><br />	// nettoyage<br />	[dict release];<br />}<br /><br />@end<br />
    


    Dans l'AppController :
    <br />- (void)awakeFromNib<br />{<br />	[[NSNotificationCenter defaultCenter] addObserver:self<br />											 selector:@selector(handleApplicationDidChangeActiveStatus:)<br />												 name:NSApplicationDidBecomeActiveNotification<br />											&nbsp;  object:nil];<br />	[[NSNotificationCenter defaultCenter] addObserver:self<br />											 selector:@selector(handleApplicationDidChangeActiveStatus:)<br />												 name:NSApplicationDidResignActiveNotification<br />											&nbsp;  object:nil];<br />}<br /><br />- (void)handleApplicationDidChangeActiveStatus:(NSNotification *)notification<br />{<br />	[typesSujetsTableView setNeedsDisplay];<br />}<br /><br />
    





Connectez-vous ou Inscrivez-vous pour répondre.