Rendre une NSTableView disabled

olivier555olivier555 Membre
18:32 modifié dans API AppKit #1
Bonjour.
Tout est dans le titre, je voudrais savoir s'il existe une instruction pour rendre une NSTableView disabled (grisée quoi). J'ai évidemment essayé ; mais ça ne marche pas.
Merci beaucoup!

Réponses

  • Eddy58Eddy58 Membre
    18:32 modifié #2
    Et non, une tableview est un contrôle assez complexe, qui ne se désactive pas comme un simple bouton. Tu peux utiliser une solution de substitution, qui ne désactivera pas ta tableview, mais bloquera les actions, en surchargeant les methodes delegates :
    [tt]
    - (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex

    - (BOOL)tableView:(NSTableView *)aTableView shouldSelectTableColumn:(NSTableColumn *)aTableColumn
    [/tt]
    En retournant NO dans ces méthodes quand les conditions nécessaires sont là , tu bloques les actions sur les rangées et les colonnes, empechant toute interactivité sur ta tableview. :)
  • olivier555olivier555 Membre
    18:32 modifié #3
    Je te remercie c'est ce que j'avais commencé à  faire en mettant un fond gris tout moche quand c'est "disabled". Sinon c'est clair que la manipulation des NSTableView est plutôt compliquée, surtout par rapport à  ce que je veux en faire!!
  • Eddy58Eddy58 Membre
    18:32 modifié #4
    C'est sûr qu'avoir une méthode simple sous la main pour désactiver les tableview serait bien.:P
    Tu peux aussi pousser plus loin l'interdiction d'interactivité, en récupérant le pointeur de la NSScrollView, et en enlevant les scrollers avec les méthodes :
    [tt]
    - (void)setHasHorizontalScroller:(BOOL)flag
    - (void)setHasVerticalScroller:(BOOL)flag
    [/tt]
  • ClicCoolClicCool Membre
    18:32 modifié #5
    Salut,

    Confectionne un bouton transparent de la taille de ta tableView réglé (sous IB) comme disable et Hiden et posé au dessus de ta tableView.

    Quand tu veux désactivé ta tableView tu n'as qu'à  rendre visible le bouton qui interceptera alors tous les clics :)

    Par contre l'effet grisée disable est plus complexe à  obtenir (à  ce moment là  le bouton, par ex. RoundedBevel en momentary Push in, ne doit pas être transparent) car l'ordre de redessinement des vues de la fenêtre est difficile à  maitriser :( .
  • AntilogAntilog Membre
    18:32 modifié #6
    Est-ce que le point 29 de ce document:
    http://www.pnelsoncomposer.com/writings/NewbieFAQ.html
    te semble correspondre à  ce que tu souhaite?
  • olivier555olivier555 Membre
    18:32 modifié #7
    ClicCool > Ca c'est une bonne idée!
    Antilog > C'est effectivement ce que je veux, le problème c'est que je ne veux pas créer une custom class pour mes NSTableView (elles représentent une partie infime de mon appli, alors déjà  que j'ai dû créer des datasources....). Par contre je vais m'en inspirer il y a des choses à  reprendre.

    En tout cas merci les gars! :p
  • BruBru Membre
    18:32 modifié #8
    Pour faire simple, moi j'avais adopté (à  l'époque de 10.1) cette méthode pour rendre "disbaled" une NSTableView :

    J'avais créé une custom NSView dont la fonction était de dessiner une carré blanc avec transparence. Ensuite, lorsque je voulais désactiver la tableView, j'ajoutais cette custom View par dessus ma tableView, ce qui "grisait" tous les éléments de la tableview.

    Si je retrouve le code que j'avais utilisé pour ça, je le mettrais en TRUKéASTUCE.

    .
  • ClicCoolClicCool Membre
    18:32 modifié #9
    dans 1116750745:

    Si je retrouve le code que j'avais utilisé pour ça, je le mettrais en TRUKéASTUCE.


    Salut Bru,

    Volontiers pour ce qui est de ton code si tu as géré l'ordre de redessinement pour que ta custumView se dessine correctement "par dessus" la tableView même lorsque celle-ci met à  jour son affichage.
  • BruBru Membre
    18:32 modifié #10
    dans 1116831173:

    Volontiers pour ce qui est de ton code si tu as géré l'ordre de redessinement pour que ta custumView se dessine correctement "par dessus" la tableView même lorsque celle-ci met à  jour son affichage.


    Aucun problème de ce côté là  selon mes souvenirs.

    Je recherche le code, je le poste, et vous le testerez !

    .
  • olivier555olivier555 Membre
    18:32 modifié #11
    :) Cool!
  • BruBru Membre
    18:32 modifié #12
    Voilà , j'ai posté le TRUKéASTUCE ici.

    Bon code !

    .
  • iShadowiShadow Membre
    18:32 modifié #13
    Sinon moi je suis nul, mais j'ai aussi fait pour ma part un truc pour désactiver un NSTableView. Cette méthode est sans doute imparfaite, mais bon elle marche bien je trouve...

    Je crée une vue nommée GrayView qui se trouve juste au dessus de mon NSTableView, j'implémente ses fichiers :

    <br />/* GrayView */<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface GrayView : NSView<br />{<br />	float alpha;<br />}<br /><br />- (void)setAlphaValue:(float)alphaValue;<br /><br />@end<br />
    


    #import &quot;GrayView.h&quot;<br /><br />@implementation GrayView<br /><br />- (id)initWithFrame:(NSRect)frameRect<br />{<br />	if ((self = [super initWithFrame:frameRect]) != nil) {<br />		[self setNeedsDisplay:YES];<br />	}<br />	return self;<br />}<br /><br />- (void)drawRect:(NSRect)rect<br />{<br />	NSRect bounds = [self bounds];<br />	[[NSColor colorWithCalibratedWhite:0.5 alpha:alpha] set];<br />	[NSBezierPath fillRect:bounds];<br />}<br /><br />- (void)setAlphaValue:(float)alphaValue<br />{<br />	alpha = alphaValue;<br />	[self setNeedsDisplay:YES];<br />}<br /><br />@end<br />
    


    Ensuite, dans la classe dans laquelle tu veux diriger le NSTableView, tu ajoute au header :

    <br />	IBOutlet id grayView;<br />	float alphaValue;<br />	NSTimer *addAlphaTimer;<br />	NSTimer *removeAlphaTimer;<br />
    


    Et tu connecte grayView comme outlet de cette classe avec IB.
    Et ne pas oublier de définir ta classe come delegate de GrayView.

    Puis les méthodes a implémenter pour activer/désactiver le NSTableView sont :

    <br />- (void)addGrayViewAlpha:(NSTimer *)aTimer<br />{<br />	if (alphaValue &lt; 0.6)<br />	{<br />		[grayView setAlphaValue:alphaValue];<br />		alphaValue = (alphaValue + 0.1);<br />	} else {<br />		[addAlphaTimer invalidate];<br />		[addAlphaTimer release];<br />	}<br />}<br /><br />- (void)removeGrayViewAlpha:(NSTimer *)aTimer<br />{<br />	if (alphaValue &gt; 0)<br />	{<br />		[grayView setAlphaValue:alphaValue];<br />		alphaValue = (alphaValue - 0.1);<br />	} else {<br />		[removeAlphaTimer invalidate];<br />		[removeAlphaTimer release];<br />	}<br />}<br /><br />- (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView<br />{<br />	return permissionModifierTableView;<br />}<br />
    


    (Cela permet d'obtenir un petit effet d'apparition/disparition du grisé)

    Enfin tu ajoute :

    <br />	alphaValue = 0;<br />	[grayView setHidden:NO];<br />	addAlphaTimer = [[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(addGrayViewAlpha:) userInfo:nil repeats:YES] retain];<br />permissionModifierTableView = NO;<br />
    


    (pour afficher le grisé et bloquer le table view)

    et

    <br />	[grayView setHidden:YES];<br />alphaValue = 0.5;<br />	removeAlphaTimer = [[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(removeGrayViewAlpha:) userInfo:nil repeats:YES] retain];<br />	permissionModifierTableView = YES;<br />
    


    Voila, j'espère que ce cela a été pas trop incompréhensible pour vous et que cela a pu être utile.

    @ bientôt
    :)
    
    
Connectez-vous ou Inscrivez-vous pour répondre.