NSTableView, Séparateurs & Selection

06:35 modifié dans API AppKit #1
Bonjour,

ça va sûrement vous paraà®tre un peu sans importance comme problème, mais je cherche à  reproduire la même table que le logiciel Wallet. (Captures plus bas).
En fait je souhaiterai simplement sépararer mes Cell mais aussi dessiner l'image de selection par dessus les les séparateurs haut et bas de la cell.

Les problèmes que je rencontre sont :
- Si je choisi simplement "Horizontal Grid Lines" dans les attributs de la Table View, il dessine les séparateurs  meme entre des Cells vides.
- Si je choisi quand meme les grid lines, je dois dessiner le selecteur en dehors de la Cell... ducoup y'a des problèmes d'affichage quand je switch de cell, avec des traits qui restent affichés alors qu'ils ne devraient pas
- Si je choisi de dessiner moi meme les séparateurs, je ne peux en dessiner qu'un seul par Cell au risque d'avoir un trait de 2px de hauteur entre chaque lignes au lieu d'1px voulu.

Bref je m'arrache les cheveux sur un détail esthétique qui me tient à  coeur...

Merci d'avance,
Louka

Réponses

  • NoNo Membre
    06:35 modifié #2
    Difficile de voir ce que tu veux faire, et surtout comment tu veux le faire.

    Bref essayons de débroussailler :
    - la NStableView est elle standard (c'est à  dire que ce n'est pas une sous classe) ?
    - les NSCell qui y sont affichées sont elles personnalisées (donc tu as créé une sous classe) ?
  • avril 2009 modifié #3
    dans 1239028330:

    Difficile de voir ce que tu veux faire, et surtout comment tu veux le faire.

    Bref essayons de débroussailler :
    - la NStableView est elle standard (c'est à  dire que ce n'est pas une sous classe) ?
    - les NSCell qui y sont affichées sont elles personnalisées (donc tu as créé une sous classe) ?


    Sous classage de NSTableView + des NSCell :D
    (Adepte du sous-classage).

    En fait c'est tout con. Je veux pouvoir mettre des traits entre les lignes, et pouvoir en plus dessiner mon selecteur (le dégradé Aqua ou Graphite) par dessus les 2 traits de la ligne selectionnée.
    Et comme je l'ai dit, le problème qui se pose si je fais ça c'est que un pixel du dégradé reste sur tout la longueur du fait qu'il doit forcément rogner sur la NSCell du dessus. Appeler un reloadData à  chaque fois ça peut être lourd surtout quand je liste + de 1000 objets (meme si c'est rapide, il y a une très très légère latence qui se remarque)
  • NoNo Membre
    06:35 modifié #4
    Dans la méthode drawInteriorWithFrame:inView: ta NSCell personnalisée, je verrai bien le dessin du trait bas en plus.
    Ainsi ce n'est pas la NSTableView qui serait chargée du dessin du séparateur, mais tes cellules.
    Et dans cette méthode, en testant isHighlighted tu peux désactiver le dessin du séparateur quand la sélection est en cours dans la cellule.

    Un truc comme çà  en gros :
    <br />@implementation OSXDEVTextFieldCell<br />- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView<br />{<br />&nbsp;  // dessin du contenu d&#39;origine<br />&nbsp;  [super drawInteriorWithFrame:cellFrame inView:controlView];<br /><br />&nbsp;  // ajout d&#39;un trait en bas de la cellule uniquement si elle n&#39;est pas sélectionnée<br />&nbsp;  if (![self isHighlighted])<br />&nbsp;  {<br />&nbsp; &nbsp; &nbsp; [[NSColor grayColor] set];<br />&nbsp; &nbsp; &nbsp; NSBezierPath *ligne=[[NSBezierPath alloc] init];<br />&nbsp; &nbsp; &nbsp; NSPoint p=cellFrame.origin;<br />&nbsp; &nbsp; &nbsp; p.y+=cellFrame.size.height-1;<br />&nbsp; &nbsp; &nbsp; [ligne moveToPoint:p];<br />&nbsp; &nbsp; &nbsp; p.x+=cellFrame.size.width;<br />&nbsp; &nbsp; &nbsp; [ligne lineToPoint:p];<br />&nbsp; &nbsp; &nbsp; [ligne setLineWidth:1];<br />&nbsp; &nbsp; &nbsp; [ligne stroke];<br />&nbsp; &nbsp; &nbsp; [ligne release];<br />&nbsp;  }<br />}<br />@end<br />
    
  • 06:35 modifié #5
    C'est exactement ce que je fais depuis le début en fait. Evidemment je dessine un seul trait dans la cellule pour ne pas avoir des doublons entre les celulles.
    Le problème c'est en fait que la selection doit passer par dessus deux traits. Hors, il y aura forcément un des trait qui appartiendra à  la celulle juste au dessus de celle selectionnée, et si je fais passer le dégradé par dessus, j'ai un problème de drawing.
    Alors à  moins d'appeler setNeedsDisplay à  chaque fois qu'on change de ligne...

    Bon je vous tiens au courant mais c'est vrai que comme un débile je faisais un reloadData alors que setNeedsDisplay suffit et est moins lourd vu qu'il ne doit pas recharger les données mais juste redessiner la vue et toutes les subviews.. dont les cellules.

    Bon allez on va dire que grâce à  toi tu m'as mis sur la bonne voie :p
    Merci du coup de main (et vive les sous-classage)
  • 06:35 modifié #6
    J'ai réussi et je suis ému :') c'était vraiment con quand meme, j'ai pas du tout pensé au setNeedDisplay ...
Connectez-vous ou Inscrivez-vous pour répondre.