"Fit image" dans une NSButtonCell

ChachaChacha Membre
23:31 modifié dans API AppKit #1
Hello,

Comme souvent, j'ai un problème et j'ai trouvé une solution, mais la solution me paraà®t un peu compliquée pour être honnête.
Voilà  : j'ai une NSTableView avec des lignes relativement larges, car je voudrais y afficher des thumbnails d'images. Facile, je mets une NSImageCell dans la tableView.
Sauf que j'aimerais bien afficher, dans une cellule, un petit titre (la date à  laquelle l'image a été prise); mais une NSImageCell ne peut contenir de texte. Donc je mets finalement une NSButtonCell.
Mais dans une NSButtonCell, l'image (un peu plus grande que la cellule) déborde et n'est pas redimensionnée.
Du coup, je me vois déjà  dériver NSButtonCell et surcharger drawInteriorWithFrame, mais l'idée ne me plaà®t pas beaucoup.
Comment feriez-vous ?

PS : rien à  voir avec Quicky, c'est pour tout autre chose

Réponses

  • cbrandtcbrandt Membre
    23:31 modifié #2
    dans 1111671773:

    Du coup, je me vois déjà  dériver NSButtonCell et surcharger drawInteriorWithFrame, mais l'idée ne me plaà®t pas beaucoup.
    Comment feriez-vous ?


    nscell plutôt que nsbuttoncell, à  moins d'avoir besoin de la fonctionnalité "button"... je l'ai fait dans quelques projets, c'est assez facile et à  mon avis la solution la plus conforme à  l'esprit des cell...
  • ChachaChacha Membre
    23:31 modifié #3
    dans 1111673952:

    nscell plutôt que nsbuttoncell, à  moins d'avoir besoin de la fonctionnalité "button"... je l'ai fait dans quelques projets, c'est assez facile et à  mon avis la solution la plus conforme à  l'esprit des cell...


    Merci, cbrandt; mais le problème se déplace; dans ce cas, mon image s'affiche à  l'envers ! Le problème, c'est qu'une NSCell n'étant pas une NSView, je ne peux pas redéfinir isFlipped.
    Je peux essayer setFlipped sur mon image, mais ça n'a pas d'effet dans mon drawRect:inRect:operation:fraction.
    ça n'a pas non plus d'effet si j'affiche une représentation de l'image par drawInRect:
    Et si je rajoute un NSAffineTransform pour faire scaleXBy:1 yBy:-1, ça ne marche pas non plus.
    Pfou! C'est pas gagné.
  • cbrandtcbrandt Membre
    23:31 modifié #4
    ce que j'ai fait, c'est que dans ma nscell j'ai plusieurs nscell en membres...
    par ex pour une image avec titre, je définis tCell et iCell, et les appels à  setTitle et setImage sont dispatchés à  mes deux cell:

    <br />@interface MyCell: NSCell<br />{<br />   NSCell  *tCell;<br />   NSCell *iCell;<br />}<br />...<br />@end<br />
    


    puis dans le .m:

    <br />- (id) init<br />{<br />if (!(self = [super init]))<br />   return nil;<br /> tCell = [[NSCell alloc] initTextCell];<br /> iCell = [[NSCell alloc] initImageCell];<br />return self;<br />}<br />...<br />- (void) setTitle: (NSString*) title<br />{<br />    [tCell setTitle: title];<br />}<br /><br />- (void) setImage: (NSString*) image<br />{<br />    [tCell setImage: image];<br />}<br /><br />- (void) drawInteriorWithFrame: (NSRect) rect inView: (NSView*) view<br />{<br />NSRect rect2;<br />// déterminer le rect pour l&#39;image, basé sur le rect passé en paramètre<br />rect2 = ...<br />[iCell drawInteriorWithFrame: rect2 inView: view];<br /><br />// déterminer le rect pour le texte, basé sur le rect passé en paramètre<br />rect2 = ...<br />[iCell drawInteriorWithFrame: rect2 inView: view];<br />}<br />
    


    comme ça pas de pb de flipped ou autre, et on profite des autres possibilités des cell...

    ps: tapé comme ça de tête, à  arranger pour que ça marche...
  • ChachaChacha Membre
    23:31 modifié #5
    dans 1111679169:

    ps: tapé comme ça de tête, à  arranger pour que ça marche...

    Pas de souci, j'ai bien compris l'idée; merci !
    Par contre, je trouve qu'on n'est pas vraiment dans "l'esprit des cells", comme tu dis. T'as pas l'impression de les torturer un peu ?
  • cbrandtcbrandt Membre
    23:31 modifié #6
    c'est vrai que j'aurais aimé faire sans réutiliser des cells comme ça, mais j'étais tombé comme toi sur le pb de l'image renversée... je me suis dis qu'un jour j'arrangerai ça, mais j'ai pas encore pris le temps...
  • ChachaChacha Membre
    23:31 modifié #7
    dans 1111686932:

    c'est vrai que j'aurais aimé faire sans réutiliser des cells comme ça, mais j'étais tombé comme toi sur le pb de l'image renversée... je me suis dis qu'un jour j'arrangerai ça, mais j'ai pas encore pris le temps...

    Alors je me suis inspiré de ton code, mais j'ai quand même fait un truc assez différent. Voici ce que j'ai fait:
    -ma class MyCell dérive de NSImageCell, et n'a aucune donnée d'instance
    -dans mon TableViewDataSource, la méthode objectValueForTableColumn renvoie l'image concernée (c'est obligatoire pour une NSImageCell)
    -du coup, je surcharge le delegate willDisplayCell pour y caser un setRepresentedObject sur la cell
    -enfin, dans MyCell.m, je surcharge en gros comme ça
    <br />-(void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView<br />{<br />  NSRect imageRect = ...<br />  [super drawInteriorWithFrame:imageRect inView:controlView];<br /><br />  NSRect textRect = ...<br />  NSAttributedString* attrString = ...//un truc qui dépend du representedObject<br />  [attrString drawInRect:textRect];<br />}<br />
    


    Je pense qu'on n'avait pas exactement le même problème, mais dans mon cas cette méthode était plus simple.

    +
    Chacha
  • cbrandtcbrandt Membre
    23:31 modifié #8
    c'est vrai que c'est plus simple comme ça... je sens que je vais m'en inspirer !
Connectez-vous ou Inscrivez-vous pour répondre.