Sous-classage de NSComboBoxCell

Je suis en train de sous-classer NSComboBoxCell non pas pour lui adjoindre des fonctionnalités mais pour lui donner un look différent. Je me débrouille pas trop mal pour ce qui est de pimper les NSCell mais là  je sens que je vais en baver. 


Je m'explique : il y a 2 fonctions fondamentales quand on dessine une NSCell : 


  • drawWithFrame qui s'occupe de la déco, des bords et autres visuels. Sans toutefois s'occuper de dessiner quoi que ce soit d'utile comme des valeurs ou autres.
  • drawInteriorWithFrame qui se charge de dessiner la valeur du NSControl. Un texte, une image ou quoi que ce soit d'autre. L'information que le contrôle doit présenter en somme.

 


Dans la majorité des cas ça se modifie bien et on peut assez aisément s'amuser avec. 


Sauf que dans le cas des combo box c'est infiniment plus compliqué. Pour commencer une NSComboBoxCell est une sous-classe de NSTextFieldCell, on a donc à  la base un contrôle de saisie de texte auquel on a ajouté un bouton qui est "accessible" via l'ivar privée _buttonCell. 


 


C'est là  que ça commence à  se corser, on a déjà  une variable privée. Pour parfaire le tout –et comme on a qu'un seul NSControl– il y a 2 NSCell à  gérer, la NSComboBoxCell et la NSButtonCell. Cela implique qu'il faut gérer 2 frames différentes et ces frames sont calculées dans 2 fonctions qui sont bien entendu privées et par conséquent je ne peux pas y accéder, parce que je ne connais pas leur nom. 


C'est bien dommage parce qu'en modifiant ces 2 fonctions je pourrais faire ce que je veux assez facilement. Sinon il faut tout réécrire, surtout la gestion de la souris, et tout un tas de belles choses.


 


Donc ma question est simple est-ce que je m'arme d'une belle pelle et je cherche trèèèèès profondément dans les entrailles d'AppKit pour trouver ces fonctions ou est-ce que je m'amuse à  tout réécrire ? Dans le cas du déterrage de fonction est-ce qu'une telle sous-classe a la moindre chance de passer la barrière du Mac AppStore ? Si quelqu'un a une autre solution moins laborieuse je suis aussi preneur mais j'ai longuement cherché et j'en doute...


 


Merci :)


 


PS: Oui, je sais qu'il y a 3 fonctions fondamentales en fait mais dans ce cas présent l'édition des données n'avait pas vraiment de raison d'être évoquée.  -_-


Réponses

  • Bonjour,


     


    Regarde dans le code suivant


     


    http://code.google.com/p/cocotron/source/browse/AppKit/NSComboBoxCell.m?r=1b608bb5fe23de3888496a23d873d5be8690a011


     


    Tu devrais avoir une méthode buttonRectForBounds qui te donne la dimension du bouton ?


     


    A voir....


     


  • J'ai identifié les méthodes qui permettent de récupérer les frames : - (struct CGRect)boundsForButtonCell:(struct CGRect)arg1; et - (struct CGRect)boundsForTextCell:(struct CGRect)arg1;


    Je regarde à  ça demain là  il est trop tard je vais me coucher.


  • Voilà  j'ai réussi !


    La preuve :


  • CéroceCéroce Membre, Modérateur
    septembre 2013 modifié #5


    Je tente quand même la soumission sur le MAS ou c'est mort d'avance ? 


     




    C'est mort ! La vérification de la non-utilisation d'API privées est faite automatiquement par une moulinette, alors crois bien que s'il ne font qu'une vérification, ce sera celle-là .


     


    Est-ce que -_buttonHeight et -_buttonWidth renvoient des valeurs différentes de la frame ?


  • Je me disais bien que ça ne passerait pas... 


    Je vais devoir tout réécrire  :'(


     


    Quoi qu'il en soit les frames sont calculées selon les valeurs renvoyées par -_buttonHeight et -_buttonWidth. C'est d'ailleurs celles que j'ai modifié pour contrôler la taille du bouton. Ce qui est bien pratique parce que ça fait tout le reste du travail à  ma place, surtout la gestion de la souris... 


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