Menu itunes/finder style

2»

Réponses

  • CeetixCeetix Membre
    21:43 modifié #32
    Ok en effet c'est très bien comme ça. Par contre sous IB je dessine mes outlets dans des vues différentes, il faut donc "cacher" ces vues une fois qu'on les a construite non?
  • 21:43 modifié #33
    dans 1240233966:

    Ok en effet c'est très bien comme ça. Par contre sous IB je dessine mes outlets dans des vues différentes, il faut donc "cacher" ces vues une fois qu'on les a construite non?


    J'ai modifié le code, regarde :)
    Tu verras que je fais [rightView setSubviews:[NSArray arrayWithObject:view]]; donc ça remplace imédiatement la vue qui était dans la rightView par la nouvelle.
  • CeetixCeetix Membre
    21:43 modifié #34
    Ok je vois. Si si tu l'avais bien mise ^^.
    Merci pour ces explications. Je vais essayer de faire ça.
  • FloFlo Membre
    avril 2009 modifié #35
    Perso moi j'ai tout mis dans la même classe vu qu'il y a asser peu de changements entre les différent type de NSCell...

    En gros, si on est en présence d'un item root, on met le tag du NSCell à  1 et 0 sinon :

    <br />- (void) outlineView: (NSOutlineView *)outlineView willDisplayCell: (NSCell *)aCell forTableColumn: (NSTableColumn *)aTableColumn item: (id)anItem<br />{<br />	if ([anItem isGroupItem])<br />	{<br />		[aCell setImage: nil];<br />		([anItem isExpandableItem]) ? [aCell setTag: 0] : [aCell setTag: 1];<br />	}	<br />	else<br />	{<br />		([anItem isRootItem]) ? [aCell setTag: 1] : [aCell setTag: 0];<br />		attribuer une image à  la NSCell<br />	}<br />}<br />
    


    Puis ensuite dans la custom NSCell :
    <br />- (void) drawWithFrame: (NSRect)cellFrame inView: (NSView *)controlView<br />{	<br />	if (image)<br />	{<br />		NSSize imageSize;<br />       &nbsp; &nbsp; &nbsp; &nbsp;  NSRect imageFrame;<br />		<br />		if ([self tag]) cellFrame.origin.x += OPTIONAL_ORIGIN_X_OFFSET;<br />		<br />       &nbsp; &nbsp; &nbsp; &nbsp;  imageSize = [image size];<br />       &nbsp; &nbsp; &nbsp; &nbsp;  NSDivideRect(cellFrame, &amp;imageFrame, &amp;cellFrame, 3 + imageSize.width, NSMinXEdge);<br />		<br />		imageFrame.origin.x += IMAGE_ORIGIN_X_OFFSET;<br />		imageFrame.origin.y -= IMAGE_ORIGIN_Y_OFFSET;<br />       &nbsp; &nbsp; &nbsp; &nbsp;  imageFrame.size = imageSize;<br />		<br />       &nbsp; &nbsp; &nbsp; &nbsp;  if ([controlView isFlipped])<br />           &nbsp; &nbsp; &nbsp;  imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2);<br />       &nbsp; &nbsp; &nbsp; &nbsp;  else<br />           &nbsp; &nbsp; &nbsp;  imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2);<br />		<br />		[image compositeToPoint: imageFrame.origin operation: NSCompositeSourceOver];<br />		<br />		NSRect newFrame = cellFrame;<br />		newFrame.origin.x += TEXT_ORIGIN_X_OFFSET ;<br />		newFrame.origin.y += TEXT_ORIGIN_Y_OFFSET;<br />		newFrame.size.height -= TEXT_HEIGHT_ADJUST;<br />		<br />		[super drawWithFrame: newFrame inView: controlView];<br />    }<br />&nbsp; &nbsp; else<br />&nbsp;  {<br />		if ([self tag]) cellFrame.origin.x = 5;<br />		<br />		// Center the text in the cellFrame<br />		CGFloat yOffset = floor((NSHeight(cellFrame) - [[self attributedStringValue] size].height) / 2.0);<br />		<br />		cellFrame.origin.y += yOffset;<br />		cellFrame.size.height -= (TEXT_ORIGIN_Y_OFFSET * yOffset);<br />		<br />		[super drawWithFrame: cellFrame inView: controlView];<br />	}	<br />}<br />
    


    ça évite de créer 4 sous-classes (deux sous-classes supplémentaires de NSTextFieldCell, une sous-classe de NSTableView et une de NSTableColumn)

    Par contre je pense que ta solution est plus favorable à  une customisation importante de chaque type de NSCell (comme dans le code que tu as fournis).

    Par contre j'ai essayé d'utiliser les méthodes setImage et image de NSActionCell plutôt que d'utiliser une variable d'instance NSImage *image mais ça plante de partout. des idées sur le pourquoi du comment ?
  • 21:43 modifié #36
    attempt to insert *nil* value ?  ;D Non je sais pas oO
  • FloFlo Membre
    21:43 modifié #37

    attempt to insert *nil* value ?  Non je sais pas oO


    heu tu parles d'un éventuel warning que j'aurais eu ? Je l'ai pas eu celui-la...
    Le code que j'ai fourni marche très bien mais parce que j'utilise une variable d'instance @private NSImage *image...

    Si j'essaye de passer par setImage: et image de NSActionCell j'ai plus les textes des NSCell et yen a même une qui disparaà®t...
    Bon après c'est du chipotage, ça marche très bien dans l'état...
  • 21:43 modifié #38
    Le setImage doit être utilisé uniquement dans preparedCellForRow
  • FloFlo Membre
    21:43 modifié #39
    Ok merci ! 
  • FloFlo Membre
    21:43 modifié #40
    Sinon, un petit lien vers une classe que je viens de trouver qui pourrait être pas mal niveau perfs pour une NSCell affichant du texte et une image :

    http://paste.lisp.org/display/73927

  • wiskywisky Membre
    21:43 modifié #41
    Désolé de déterrer ce sujet mais j'ai un petit problème avec ce type de modification. Cela supprime toutes possibilité de modification du texte.
    Sur un Outliner il est possible d'éditer alors que sur un TableView non.
    C'est pas faute d'essayer de mettre isEditable à  YES qui manque mai cela n'est pas gardé !

    J'ai joint le projet de SideBar légèrement modifier pour permettre l'édition du texte mais ça marche pas ! J'ai pris du code de l'exemple d'Apple.
Connectez-vous ou Inscrivez-vous pour répondre.