NSRadioModeMatrix et setAllowsEmptySelection

AliGatorAliGator Membre, Modérateur
août 2005 modifié dans Vos applications #1
Rebijour à  toutti

Voilà  j'ai une NSMatrix que j'ai mise en mode RadioMode (pour n'avoir maximum qu'une NSCell sélectionnée à  la fois). Mes NSCells sont de type NSToggleButton, et j'ai bien mis setAllowsEmptySelection à  YES pour ma NSMatrix.

Pourtant, j'ai un comportement pas tip top car quand j'ai une cell de sélectionnée :
- si je clique sur une autre cell, la première se déselectionne bien pour laisser la 2e seule sélectionnée, ça c'est nickel
- et que je pomme-clique sur la cell sélectionnée, elle se déselectionne bien et je n'ai plus aucune sélection (nickel)
- par contre, et ce malgré mes boutons de type toggle, si je clique sur ma cell sélectionnée (sans touche pomme), elle ne se déselectionne pas ??!?

Question subsidiaire -- p'tet un peu à  part, et pour ça y'a p'tet un tuto dessus j'ai pas encore cherché j'avoue -- comment faire pour que si je clique n'importe où ailleurs dans ma fenêtre (hors de ma NSMatrix), ça déselectionne la cell qui était sélectionnée ?

Voilà  le bout de code (ma NSMatrix est créée par code dans ma NSView (classe perso) pour qu'elle soit carrée et centrée dans la vue, la méthode suivante enlève l'éventuelle ancienne matrix et en crée une nouvelle)
- (void)createNewMatrixWithRows:(int)rows columns:(int)cols<br />{<br />	NSButtonCell* templateCell = [[NSButtonCell alloc] init];<br />	[templateCell setButtonType:NSToggleButton];<br />	[templateCell setTitle:@&quot;-&quot;]; // j&#39;utiliserai des images pour les états ON<br />	[templateCell setAlternateTitle:@&quot;X&quot;]; // et OFF à  terme, pour l&#39;instant je teste avec ça<br />	<br />	[_matrix removeFromSuperview]; // detach from the superView (don&#39;t forget this !!)<br />	[_matrix release]; // release older instance before creating the new one<br />	_matrix = [[NSMatrix alloc] initWithFrame:[self calcMatrixFrame]<br />										 mode:NSRadioModeMatrix<br />									prototype:templateCell<br />								 numberOfRows:rows<br />							&nbsp; numberOfColumns:cols];<br />	[templateCell release];<br />	<br />	[_matrix setAllowsEmptySelection:YES];<br />	[_matrix setAutosizesCells:YES];<br />	<br />	[self addSubview:_matrix]; // note : will retain the NSMatrix<br />}


Merchi ! ::)

Réponses

  • fouffouf Membre
    22:44 modifié #2
    Question subsidiaire -- p'tet un peu à  part, et pour ça y'a p'tet un tuto dessus j'ai pas encore cherché j'avoue -- comment faire pour que si je clique n'importe où ailleurs dans ma fenêtre (hors de ma NSMatrix), ça déselectionne la cell qui était sélectionnée ?


    Je pense que tu dois surcharcher resignFirstResponder pour gérer ca.

    par contre, et ce malgré mes boutons de type toggle, si je clique sur ma cell sélectionnée (sans touche pomme), elle ne se déselectionne pas ??!?


    Je crois que c'est normal : ta matrix est en mode RadioButton. Je viens d'essayer avec IB et ca me donne exactement le même résultat. ???
  • AliGatorAliGator Membre, Modérateur
    22:44 modifié #3
    dans 1124449093:

    Je pense que tu dois surcharcher resignFirstResponder pour gérer ca.
    Heu je veux bien, mais donc surcharger le resignFirstResponder de ma NSMatrix, donc ? pour que si je clique n'importe où dans ma fenêtre mais à  un endroit qui n'a rien à  voir avec la NSMatrix, ça fasse ce que je veux ?
    Bon en fait je viens de réfléchir au comportement que je souhaite : c'est quand on clique n'importe où dans la fenêtre et que ça clique dans la fenêtre (et pas dans un NSButton ou un objet de la fenêtre) que ça doit effacer la sélection. Donc ce serait du côté de ma NSWindow (ou de son delegate j'imagine ?) qu'il faut que je fasse mumuse ?
    Faut vraiment que je regarde comment fonctionne ce principe de passage d'events et de tous ces (first/next/accepts/resign/)responder ;)

    dans 1124449093:
    Je crois que c'est normal : ta matrix est en mode RadioButton. Je viens d'essayer avec IB et ca me donne exactement le même résultat. ???
    Ben oui je sais bien que ça donne le même résultat... mais ça me parait pas très logique : mes boutons sont en mode Toggle, donc normalement un clic les active, un autre les désactive. ma matrix est en mode RadioButton, ok, donc, comme le dit la doc Apple, "no more than one cell selected at once", ...
    Donc si je clique sur le NSButtonCell qui est activé, ça devrait essayer de lui faire un toggle sur la tronche. donc de l'éteindre puisqu'il était allumé. Ce qui devrait être autorisé puisque ma NSMatrix je lui ai dit allowsEmptySelection:YES...

    Donc en fait je trouve pas ça logique comme comportement, ça fait pas trop ce que c'est sensé faire au vu du code que j'ai mis. Après c'est p'tet Apple qui a mal géré ce genre de cas, mais bon quand même quoi !
    Alors je fais comment pour avoir un comportement que j'estime "normal" ? En tout cas au vu de comment j'ai configuré ma NSMatrix ?
  • Eddy58Eddy58 Membre
    22:44 modifié #4
    dans 1124454707:

    Ben oui je sais bien que ça donne le même résultat... mais ça me parait pas très logique : mes boutons sont en mode Toggle, donc normalement un clic les active, un autre les désactive. ma matrix est en mode RadioButton, ok, donc, comme le dit la doc Apple, "no more than one cell selected at once", ...
    Donc si je clique sur le NSButtonCell qui est activé, ça devrait essayer de lui faire un toggle sur la tronche. donc de l'éteindre puisqu'il était allumé. Ce qui devrait être autorisé puisque ma NSMatrix je lui ai dit allowsEmptySelection:YES...

    Donc en fait je trouve pas ça logique comme comportement, ça fait pas trop ce que c'est sensé faire au vu du code que j'ai mis. Après c'est p'tet Apple qui a mal géré ce genre de cas, mais bon quand même quoi !
    Alors je fais comment pour avoir un comportement que j'estime "normal" ? En tout cas au vu de comment j'ai configuré ma NSMatrix ?

    En effet, ce qu'il faut savoir pour la méthode setAllowsEmptySelection, c'est qu'elle ne fonctionne pas comme tu le penses. Si tu as des espaces entre les cells de ta matrice, et que tu cliques sur ceux-ci, la cell sélectionnée sera donc désélectionnée. Je pense que tu ne t'en tireras pas sans devoir coder toi-même le comportement de ta matrice, en partant du mode "Highlight" au lieu du mode "Radio". Le mode Highlight respecte le comportement Toggle, mais il te faut coder toi-même ton comportement radio. :)
  • AliGatorAliGator Membre, Modérateur
    22:44 modifié #5
    dans 1124456993:
    En effet, ce qu'il faut savoir pour la méthode setAllowsEmptySelection, c'est qu'elle ne fonctionne pas comme tu le penses. Si tu as des espaces entre les cells de ta matrice, et que tu cliques sur ceux-ci, la cell sélectionnée sera donc désélectionnée. Je pense que tu ne t'en tireras pas sans devoir coder toi-même le comportement de ta matrice, en partant du mode "Highlight" au lieu du mode "Radio". Le mode Highlight respecte le comportement Toggle, mais il te faut coder toi-même ton comportement radio. :)
    OK ! Soit....
    Bon, si y'a que ça, c'est pas trop compliqué... le mémorise la cellule active qqpart, et qd je clique sur un bouton ça la déselectionne et basta.

    Thx 
Connectez-vous ou Inscrivez-vous pour répondre.