Redessiner un NSSlider et un NSPopUpButton

Bonjour,



J'ai besoin d'updater NSSlider et NSPopUpButton.



J'ai un problème avec les NSSlider : quand on les utilise, le trait s'efface durant l'utilisation. Il ne se redessine complètement que lorsqu'on relâche la souris. Ce n'est pas dramatique mais ce serait mieux sans ce défaut...



Voici mon code :
<br />
- (void)drawRect:(NSRect)cellFrame<br />
{<br />
    NSRect cell = [self bounds];<br />
    float hauteur = (cell.size.height - 18);<br />
   <br />
    float coef = [self floatValue]/[self maxValue];<br />
    float med = cellFrame.size.width/2.0;<br />
    [[ NSColor colorWithCalibratedHue:0.125 saturation:0.87 brightness:0.42 alpha:1.0]set];//Or brun<br />
   <br />
    [NSBezierPath setDefaultLineWidth:2.0];<br />
    [NSBezierPath strokeLineFromPoint:NSMakePoint(med, 0.0) toPoint:NSMakePoint(med, cellFrame.size.height)];<br />
   <br />
    NSImage *fondBouton= [NSImage alloc];<br />
    [fondBouton initWithContentsOfURL: [NSURL fileURLWithPath:<br />
									   [[NSBundle mainBundle] pathForResource: @&quot;FondBoutonOr&quot; ofType: @&quot;tiff&quot;]]];<br />
    [NSGraphicsContext saveGraphicsState];<br />
    NSBezierPath *bouton = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(2.5, (((1.0 - coef) * hauteur) + 1), 16, 16)];<br />
    [bouton addClip];<br />
    [fondBouton drawInRect:NSMakeRect(2.5, (((1.0 - coef) * hauteur) + 1), 16, 16) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];<br />
    [NSGraphicsContext restoreGraphicsState];<br />
    [bouton stroke];<br />
}<br />




Cela fait un bouton comme ceux de cette page :

http://www.hervenoury.com/VueKey4fev.tiff



Concernant les popUp, je n'ai pu faire mieux que de redessiner le cadre (le NSCell en fait) et mettre une couleur avec un faible alpha par dessus pour la couleur.



Sauriez vous comment sous-classer (ou dériver) vraiment NSSlider et NSPopUpButton s'il vous plaà®t? Merci par avance...

Réponses

  • Essaye plutôt de sous classer les NSCell correspondant.



    Pour le dessin ça se passe dans les méthodes suivantes:



    Drawing and Highlighting
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/drawWithFrame:inView:"]– drawWithFrame:inView:[/url]
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/highlightColorWithFrame:inView:"]– highlightColorWithFrame:inView:[/url]
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/drawInteriorWithFrame:inView:"]– drawInteriorWithFrame:inView:[/url]
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/controlView"]– controlView[/url]
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/setControlView:"]– setControlView:[/url]
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/highlight:withFrame:inView:"]– highlight:withFrame:inView:[/url]
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/setHighlighted:"]– setHighlighted:[/url]
    • [url="file:///Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/occ/instm/NSCell/isHighlighted"]– isHighlighted[/url]
  • J'ai pas testé ton code mais j'avais redessiné un NSSlider une fois et le slider bogué lorsque je le bougeais rapidement. La solution a été de rajouter ce bout de code à  ma sous classe de NSSlider;


    <br />
    -(void)setNeedsDisplayInRect:(NSRect)invalidRect<br />
    {<br />
        [super setNeedsDisplayInRect:[self bounds]];<br />
    }<br />
    




    Pour la NSSliderCell regarde du coté de - (void)drawKnob:(NSRect)knobRect et - (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped image/wink.png' class='bbc_emoticon' alt=';)' />
  • JE729JE729 Membre
    février 2013 modifié #4
    Ha aussi dans ta sous classe de NSSliderCell tu peux rajouter ça
    <br />
    - (BOOL)_usesCustomTrackImage<br />
    {<br />
    	return YES;<br />
    }<br />
    
  • Merci beaucoup pour vos réponses. Pour les boutons, il faut faire aussi :
    <br />
    [self setBordered:NO];<br />
    
    pour que l'on puisse voir le nouveau Cell que l'on a dessiné... tout simplement! Par contre j'aimerais changer la couleur du texte des NSButton et NSPopUpButton et je n'ai toujours pas trouvé la méthode à  employer...



    Sauriez-vous comment changer la couleur du texte d'un bouton s'il vous plaà®t?



    En ce qui concerne les sliders, j'ai employé dans le "drawRect" du NSSlider les méthodes :
    <br />
    NSRect boutonRect = [[self cell]knobRectFlipped:[self isFlipped]];<br />
    //puis dessin du bouton<br />
    




    le bouton ne s'affiche qu'une fois le slider manipulé. Au démarrage, il ne s'affiche pas.
    <br />
    [[self cell]drawBarInside:cellRect flipped:YES];<br />
    


    ne marche pas. Jamais le trait ne s'affiche.



    Tes méthodes, Jeremy1729 sont les bonnes, mais je les emploie manifestement mal.

    Question toute bête, comment relit-on une classe dérivée de NSCell à  un contrôleur? La méthode "setCellClass" sans doute?



    Merci encore pour vos réponses, j'avance, je progresse!
  • JE729JE729 Membre
    février 2013 modifié #6
    Pour les boutons customisés je ne sais pas trop comment ça marche. Cependant sur CocaControls il y en a plein. Ce lien peut peut-être t'aider : [url=&quot;http://www.cocoacontrols.com/platforms/mac-os-x/controls/kbbutton&quot;]http://www.cocoacontrols.com/platforms/mac-os-x/controls/kbbutton[/url]



    Pour lier la cell au slider, tu peux mettre dans ta sous classe de NSSlider le code suivant. Les méthodes setCell: ou setCellClass marchent aussi.
    <br />
    + (Class)cellClass<br />
    {<br />
        return [CustomSliderCell class];<br />
    }<br />
    
  • Peux tu mettre un bout de code car je vois pas pourquoi tu appelles directement : -drawBarInside:flipped:

    En re-écrivant les méthodes dites plus haut, ça devrait aller.
  • mpergandmpergand Membre
    février 2013 modifié #8
    'Herve' a écrit:
    
En ce qui concerne les sliders, j'ai employé dans le "drawRect" du NSSlider les méthodes :

    
NSRect boutonRect = [[self cell]knobRectFlipped:[self isFlipped]];
//puis dessin du bouton

    
    

le bouton ne s'affiche qu'une fois le slider manipulé. Au démarrage, il ne s'affiche pas.

    
[[self cell]drawBarInside:cellRect flipped:YES];

    
    
ne marche pas. Jamais le trait ne s'affiche.





    Infâme bricolage !



    En théorie, implémenter les méthodes :

    - (void)drawKnob:(NSRect)knobRect

    - (void)drawBarInside:(NSRect)aRect flipped:(BOOL)flipped



    devrait suffire ...



    Seulement voila, drawBarInside: n'est jamais appelée !!!



    Donc il faut passer par drawWithFrame:



    http://lists.apple.c...n/msg00762.html




    Sauriez-vous comment changer la couleur du texte d'un bouton s'il vous plaà®t?






    Utiliser un attributed string:

    http://www.cocoabuil...tton.html#56068



    On peut spécifier un custom cell dans IB, il faut double-cliquer sur le button et choisir la classe dans l'onglet info (pour xcode 3, pour le 4 je ne sais pas si la procédure est la même))
  • Merci Jeremy1729 pour le lien : super! Je vais pouvoir m'en inspirer.



    Oui, j'avoue mpergand, j'ai "infâmement bricolé". C'était pour voir... Pardon! image/rolleyes.gif' class='bbc_emoticon' alt='::)' />



    Bon, je m'y remets demain. Merci à  tous.
  • Merci pour votre aide. Il m'a été assez facile de personnaliser avec NSSliderCell mes sliders. C'est très bien. Pour les boutons, j'ai appelé les NSCell depuis le NSButton lui-même, ne modifiant que le fond. On verra pour la suite.



    Merci à  tous.
Connectez-vous ou Inscrivez-vous pour répondre.