Une cell redessinée
muqaddar
Administrateur
Salut,
Tiens, ça fait un moment que j'ai pas posté moi. ;-)
Bon, voilà , je veux personnaliser un NSPopUpButtonCell.
Je dois dessiner dans la méthode :
- (void)drawIAppBorderAndBackgroundWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
Je dispose de 3 images pour remplir la cellFrame. La gauche, la droite, et celle du milieu qui doit de répéter en X.
Déjà , ce code :
me donne des résultats pas terribles, l'image est répétée en Y aussi (logique), mais n'est pas calée en Y (ni en haut ni en bas).
Ensuite pour les images des côtés, j'ai fait un bête :
qui n'affiche rien...
Un peu d'aide me ferait du bien, pour bien caler mes images dans cette vue. (car en fait, c'est une vue ds IB, même si ça hérite de NSPopUpButtonCell...)
Tiens, ça fait un moment que j'ai pas posté moi. ;-)
Bon, voilà , je veux personnaliser un NSPopUpButtonCell.
Je dois dessiner dans la méthode :
- (void)drawIAppBorderAndBackgroundWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
Je dispose de 3 images pour remplir la cellFrame. La gauche, la droite, et celle du milieu qui doit de répéter en X.
Déjà , ce code :
[[NSColor colorWithPatternImage:[NSImage imageNamed:@"imagePattern"]] set];<br /> [NSBezierPath fillRect:cellFrame];
me donne des résultats pas terribles, l'image est répétée en Y aussi (logique), mais n'est pas calée en Y (ni en haut ni en bas).
Ensuite pour les images des côtés, j'ai fait un bête :
NSImage *leftImgNormal = [NSImage imageNamed:@"imageLeft"];<br /> [leftImgNormal compositeToPoint:NSMakePoint(cellFrame.origin.x, cellFrame.origin.y) operation:NSCompositeSourceOver];
qui n'affiche rien...
Un peu d'aide me ferait du bien, pour bien caler mes images dans cette vue. (car en fait, c'est une vue ds IB, même si ça hérite de NSPopUpButtonCell...)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Normal.
L'utilisation d'une pattern color ne peut pas être utilisée dans ton cas.
Les motifs sont toujours aligné par rapport à l'écran, et non par rapport au conteneur qui les affiche.
Tu dois utiliser :
- une boucle pour dessiner x fois ton image de fond
- une image "redimensionnée horizontalement" pour remplir la cell (idéal si l'image à répéter fait 1 pixel de large, style un dégradé par exemple).
C'est bête mais ça devrait marcher... Y'a trop peu de code, ou d'explication pour trouver le problème.
Je pige pas ce que tu dis.
NSPopUpButtonCell dérive de NSCell, qui dérive de NSObject.
IB ou une vue (NSView ?) n'ont rien à voir là dedans !
.
Si j'ai bien compris, il faut créer une image de la hauteur et largeur de la cellFrame en répétant mon image de 1 pxl de large en X. Puis faire un compositeToPoint de cette image dans la cellFrame.
Pour le deuxième point, je suis dans une sous-classe de NSPopUpButtonCell (et NSPopupButton car en fait j'ai 2 classes surchargées). Seulement, dans IB, quand je mets ma custom class au popup, il ne change pas (bizarrement, il passe juste en UI graphite !). Or si je mets une petite NSView, et que je lui mets ma custom class NSPopUpButtonCell, là , ça dessine bien dedans...
Je ne sais pas pkoi ça ne marche pas ds le premier cas.
}
Mais j'ai toujours mon colorWithPatternImage... donc le même problème.
Je trouve que ça fait un peu bidouille d'utiliser une boucle pour répéter l'image ! Y'a vraiment pas mieux ?
Ce genre de chose :
for (i=0; i<(int)cellFrame.size.width; i++)
{
[patternImage compositeToPoint:NSMakePoint(((cellFrame.origin.x) + i), cellFrame.origin.y) operation:NSCompositeSourceOver];
}
C'est tout à fait normal comme comportement.
Dans IB quand tu déposes un popupButton dans une vue, grosso-modo, cela va instancier un objet de type NSPopupButton et, mécaniquement, ça va aussi instancier un NSPopupButtonCell.
Or si tu changes bien la classe de ton popupButton, la NSCell NSPopupButtonCell, elle, ne change pas de classe. D'où un affichage bizarre.
Par contre, si tu déposes une NSView puis que tu change sa classe, IB réinstancie tous les objets nécessaires (dans ton cas, et ton pupButton, et sa cell personnalisée).
.
Ce n'est pas de la bidouille, c'est de la prog, mon cher...
Soit dit en passant, la boucle que tu as fait est (sans doute) utilisée aussi dans les moteurs HTML quand il s'agit d'interprêter les ordres CSS du style [tt]background-repeat:repeat-x[/tt].
Tu peux aussi utiliser la 2ème astuce : si le fond à répéter est une image de 1 pixel de large, tu peux agrandir cette image horizontalement pour lui donner la même largeur que l'intérieur de la NSCell que tu composes.
.
Voilà où j'en suis, toujours sans succès...
Rien ne se dessine ds la vue, or tout est OK ds le debugueur (coordonnées, image...)
C'est bon, j'avais juste un problème en Y, il manquait :
newPoint.y += cellFrame.size.height;
Merci !!!
Sinon, une dernière chose, comment on peut savoir qu'un menu est cliqué (enfin ouvert) ?
[Fichier joint supprimé par l'administrateur]
En surchargeant les méthodes attachPopUpWithFrame:inView: et dismissPopUp de ta NSCell, tu peux positionner une variable d'instance à YES ou NO, variable que tu pourras intérroger par la suite.
La variable d'instance est _menuIsOpen.
.
C'est génial. ça marche nikel. Un grand merci mon Bru. Toujours au top ! :-)
J'ai brodé un NSBouton du même accabi en surchargeant 2 classes, NSButton, et NSButtonCell.
Le setType du button est NSMomentaryChange...
Quand je clique sur mon bouton, il me dessine l'autre couleur grâce à son state (NSOffState, NSOnState)... seulement, je n'arrive pas à avoir le comportement d'un momentaryChange (comme si j'étais ds un mouseDown quoi...).
J'ai aussi remarqué que
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
qui s'occupe du dessin, est appellé 3 fois à chaque clic...
Une petite idée ou une bidouille pour revenir au mode normal après le lâché de clic serait la bienvenue.
J'ai bien essayé ceci :
if ([self state] == NSOnState)
{
[self setState:NSOffState];
[self drawIAppBorderAndBackgroundWithFrame:cellFrame inView:controlView];
}
mais le momentaryChange est bien trop bref...