Row background customized !
Hello,
C'est assez simple, je cherche à personaliser le background de la selectedRow d'une tableView
Notez par exemple sur Adiumx depuis la version 0.80, il y a un petit gestionnaire pour l'envoi et reception de fichiers, lorsqu'on sélectionne une row du tableau, ça fait un beau dégradé perso.
J'ai parlé à Adam (l'un des dev maà®tre de Adium) il m'a parlé d'une subclass de ne je sais quoi
Merci d'avance,
Louka.
C'est assez simple, je cherche à personaliser le background de la selectedRow d'une tableView
Notez par exemple sur Adiumx depuis la version 0.80, il y a un petit gestionnaire pour l'envoi et reception de fichiers, lorsqu'on sélectionne une row du tableau, ça fait un beau dégradé perso.
J'ai parlé à Adam (l'un des dev maà®tre de Adium) il m'a parlé d'une subclass de ne je sais quoi
Merci d'avance,
Louka.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce qui t'intéresse est sous le titre iTableView.
PS: Utilise l'outil de recherche, ce n'est pas la première fois que je mets ce lien...
Il y avait à l'époque de de la version 0.63 de Adium environ 1700 classes. Je ne doute pas que ça monte encore régulièrement...
Ha oui quand même...:P
J'ai fait une recherche sur OC avant de poster (oui oui je m'y fait) et j'ai rien trouvé concernant ce que je cherchais.
Dsl alors Renaud. Merci pour ton lien je regarde de suite
J'ai compilé l'app, c'est effectivement ce que je veux !
Je trifouille le code ce soir !
Merci encore Renaud
Pas top du tout en fait
Parenthèse : adium plante chez moi dès qu'on envoie un fichier, enfin, une fois sur deux... il faudrait se concentrer sur les bases avant de tout pouvoir customizer...
C'est bien dommage, c'est quand même des fonctionnalités essentielles...
Oui c'est normal, le dégradé n'est rien de plus qu'une image d'un pixel de large sur une hauteur définie, qui est dupliquée selon la longueur voulue. En améliorant cette classe et en dessinant le dégradé par NSBezierPath pour qu'il s'adapte automatiquement à toutes les hauteurs, ce serait une bonne chose, en plus on pourrait choisir la couleur du dégradé.
Le plus gros problème c'est que les rows ne sont plus éditables après coup, et aussi qu'on voit la sélection normale en dessous de la sélection dégradée selon la hauteur des rows. Et aussi si on met des images le résultat ne sera pas satisfaisant selon la hauteur des rows.
Bref, dans l'exemple fourni ça marche, mais c'est le seul cas. Inutilisable a mon avis, il faut s'y prendre autrement.
Voici le code de la sous-classe:
[tt]#import <Cocoa/Cocoa.h>
static NSImage* _gradientGray;
static NSImage* _gradientBlue;
@implementation GradientTableView
+(void)initialize {
_gradientBlue = [[NSImage imageNamed:@highlight_blue.tiff] retain];
[_gradientBlue setFlipped:YES];
_gradientGray = [[NSImage imageNamed:@highlight_grey.tiff] retain];
[_gradientGray setFlipped:YES];
[super initialize];
}
- (void)highlightSelectionInClipRect:(NSRect)clipRect {
NSImage* gradient;
if ([[self window] firstResponder] == self || [[self window] isKeyWindow]) {
    gradient = _gradientBlue;
  } else {
    gradient = _gradientGray;
  }
NSEnumerator* e = [self selectedRowEnumerator];
NSNumber* selRow;
while ((selRow = [e nextObject])) {
NSRect r = [self rectOfRow:[selRow intValue]];
if (NSIntersectsRect(clipRect,r)) {
[gradient drawInRect:r
fromRect:NSZeroRect
  operation:NSCompositeSourceOver
fraction:1.0];
}
}
}
- (id)_highlightColorForCell:(NSCell *)cell { return nil; }
@end[/tt]
[EDIT] Code pour avoir le dégradé au lieu d'une couleur quelconque. Maintenant comparez le nombre de lignes de code, et vous aurez compris pourquoi j'ai voulu hurler. Les images proviennet de l'exemple donné plus haut, mais rien ne vous empêche d'en utiliser d'autres.
Ceci dit il y a un problème: le texte reste en noir même dans la sélection. La méthode privée surchargée fait visiblement plus que ce que son nom le suggère... Pour résoudre ce problème, j'ai fait une sous classe perso de nstextfieldcell, mais il y a certainement mieux, donc je ne le mets pas...
Il suffit juste de faire une sous classe de NSTableView.
BRUTableView.h :
BRUTableView.m :
Bon, ok c'est pas parfait. Mon dégradé va du noir au blanc (ça peut se changer), et le dégradé est linéaire (alors que s'il était courbe, ça fera peut être mieux, mais je ne suis pas matheux).
Mais, l'avantage, c'est que ça fonctionne sans bug (nop nop Maconnect...), et que le code n'est pas trop pourri (juste pour éviter le Renaud de s'énerver).
Si je me souviens bien, la bidouille ne fonctionne pas avec les sélections de colonne.
.
Ah, toi t'as jamais vu le grenier de Bru !
Il paraà®t qu'on trouve de tout !
Oui, il a quelques bouteilles au milieu de ces anciennes palmes et combinaisons, m'a t-il signifié un jour.
Désolé pour le troll...
Tiens, en bleu et avec une fonction quadratique ça donne ça:
J'ai mis ix=1 car sinon il y a un petit bug (pas taper) de rafraà®chissement
Ce n'est pas un bug, c'est une paresse de ma part.
La ligne qui apparait parfois, c'est tout simplement l'emplacement de la horizontal grid line lorsque qu'elle n'est pas affichée.
Pour faire les chose propres, c'est normalement à moi aussi de réafficher cette grid line comme je l'ai fait pour les cells. Mais bon, faut bien que j'en laisse pour les autres...
.
J'ai essayé d'implanter ça dans une de mes NSTableView, mais j'ai un pb ...
Le fond se dessine parfaitement, mais le texte ne s'écrit pas ... D'ou ça peut venir ?
Si tu utilises le delegate tableView:willDisplayCell:forTableColumn:row: pour modifier les attriburs de la cell, alors ça ne marche pas.
Par contre, si tu n'utilises pas le delegate, alors le problème ne peut venir que de ton code (car la cell n'affiche rien). Es tu sûr que ton datasource renvoie bien un objet à afficher ?
.
Bon, je suis en train de tenter un truc : d'utiliser dans une NSTableView le fond perso décrit dans ce topic, et des cell ImageAndTextCell utilisées par Apple dans plusieurs de ses exemples.
Ca marche presque bien.
J'explique :
- dans le controlleur, j'ai le delegate - tableView: willDisplayCell: forTableColumn: row: qui attribut au cell son image avec un simple [(ImageAndTextCell*)cell setImage:monImage]
- dans la NSTableView perso, j'ai le code de Bru dans lequel j'ai enlevé la partie qui testait si la cell est une NSTextFieldCell pour mettre le texte en blanc
- enfin, le code de ImageAndTextCell est par exemple ici : http://developer.apple.com/samplecode/QTSSInspector/listing6.html
Ca s'affiche presque correctement, sauf que lorsque je change de ligne sélectionnée, l'image reste celle de la ligne précedemment sélectionnée. Et tout fonctionne bien si j'enlève la méthode pour faire le fond custo .... Les 2 ne font pas bon ménage ...
Je le répète : ma classe ne gère pas le delegate tableView:willDisplayCell:forTableColumn:row:, donc ta méthode ne peut pas correctement fonctionner !
En fait, il suffit d'apporter une légère modification au code de ma classe pour implémenter l'appel à ce delegate :
.
C'était donc si simple ! Merci Bru
Comment faire pour supprimer le premier état ? Il doit y avoir une méthode à inhiber, mais je ne trouve pas laquelle ...
Lorsque qu'une NSTextFieldCell est en mode "édition", le fond devient automatiquement de la même couleur que celle du contrôle associé (donc la couleur background de la tableView), et le texte est sélectionné entièrement.
C'est le fonctionnement standard (et non modifiable) de ce type de NSCell.
Maintenant, si tu ne désires pas que tes NSTextFields soient modifiables, alors utilise setEditables:NO pour qu'un double clic ne les mette pas en mode édition.
.