Un popup font tout bête.

muqaddarmuqaddar Administrateur
12:35 modifié dans API AppKit #1
Salut,

Je voudrais créer un popup avec les fontes du système dans mon interface.
Apparemment, c'est impossible via IB.

Quelle classe dois-je appeller si je code ?
Ce popup marchera par bindings.
:why?:
«1

Réponses

  • 12:35 modifié #2
    Je sais que tu peux afficher un menu avec une font spécifique depuis

    + (void)popUpContextMenu:(NSMenu *)menu withEvent:(NSEvent *)event forView:(NSView *)view withFont:(NSFont *)font (c'est de NSMenu)

    Maintenant j'imagine qu'en sous classant NSPopUpButton tu dois savoir quand le menu est demander c'est à  ce moment que tu lui place le tiens.

    Mais c'est un début, qui dit mieux ?
  • muqaddarmuqaddar Administrateur
    12:35 modifié #3
    Merci pour ta réponse SuperMic.
    Je vais voir ce que je peux faire... ;)

    Mais effectivement, qui dit mieux ?

  • BruBru Membre
    12:35 modifié #4
    Essaie :

    <br />&nbsp; &nbsp; [popupmenu setMenu:[[NSFontManager sharedFontManager] fontMenu:YES]];<br />
    


    .
  • AliGatorAliGator Membre, Modérateur
    12:35 modifié #5
    "mieux" ?
    :o
    :o :o
  • muqaddarmuqaddar Administrateur
    décembre 2005 modifié #6
    dans 1135241739:

    Essaie :

    <br />    [popupmenu setMenu:[[NSFontManager sharedFontManager] fontMenu:YES]];<br />
    




    yop,

    euh, chez moi, ça ne fait rien...

    [fontPopup setMenu:NSFontManager sharedFontManager] fontMenu:YES;

    fontPopup étant un outlet NSPopUpButton...


    EDIT : ça marche, mais je récupère aussi tout ce qui concerne la police... et je ne vais que les noms des polices, pas le reste... ;)
  • décembre 2005 modifié #7
    Je viens de comprendre ce que tu voulais... car je pensais que tu voulais un menu avec une font différente... :fouf):

    La réponse de bru permet de trouver :
    [popupmenu addItemsWithTitles:NSFontManager sharedFontManager] availableFontFamilies;

    Pas très avenant, autant faire comme bru a proposé  o:)

    Ali> toi aussi tu as bien marché ;)
  • décembre 2005 modifié #8
    Non, ce que bru a donné est un menu comparable au menu "Format->Font" de textedit. Ta solution est donc correcte.

    Mais si travailles avec les FontFamilies, fais attention aux variantes: si tu utilises la méthode availableMembersOfFontFamily: pour récupérer la police "normale" parmi les différentes variantes, l'élément à  la position 0 ne correspond pas toujours à  la variante "normale". Par exemple avec Gill Sans, la police à  la position 0 correspond à  la variante "Light".
  • muqaddarmuqaddar Administrateur
    décembre 2005 modifié #9
    Super merci les gars !
    L'union fait la force.

    Me reste le soucis relevé par Renaud...

    En fait, je récupère ma police via son indexID ds le popup maintenant, faut mettre tout ça dans un dico ?

    Sinon, me pose la question de mettre tout le menu font...
    En fait, c'est juste pour donner des paramètres sur un texte dans une vue.

    Qu'en pensez-vous ? Il est plus facile de récupérer toutes ces caractéritiques ?
  • muqaddarmuqaddar Administrateur
    12:35 modifié #10
    Donc voilà  le code qui renvoie mes polices triées :

    NSMutableArray* fontArray = [NSMutableArray arrayWithArray:[[NSFontManager sharedFontManager] availableFontFamilies]];	<br />	NSSortDescriptor* sortDescriptor;<br />	BOOL nameAscending=YES;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />	sortDescriptor=[[NSSortDescriptor alloc] initWithKey:@&quot;description&quot; ascending:nameAscending selector:@selector(caseInsensitiveCompare:)];&nbsp;  <br />	[fontArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];&nbsp;  <br />	[sortDescriptor release];<br />	<br />	[fontPopup addItemsWithTitles:fontArray];
    
  • 12:35 modifié #11
    Tu peux pas utiliser un nsfontpanel ?
  • muqaddarmuqaddar Administrateur
    12:35 modifié #12
    Je reviens à  mon problème... le menu est créé, mais je ne sais pas comment récupérer le dico associé à  cette police. Qui peut me mettre sur la voie ?
  • 12:35 modifié #13
    Pourquoi pas un nsfontpanel ? Je trouve ça bien plus "os x" qu'un menu avec une liste 10000 fonts... En plus les items du menu auront la font du system...
  • muqaddarmuqaddar Administrateur
    12:35 modifié #14
    dans 1136112248:

    Pourquoi pas un nsfontpanel ? Je trouve ça bien plus "os x" qu'un menu avec une liste 10000 fonts... En plus les items du menu auront la font du system...


    Oui, pourquoi pas. Mais comment l'afficher et comment reccueillir le dico de données de la police supermic ?
  • 12:35 modifié #15
    Euh... je veux pas avoir l'air bête, mais c'est quoi le dico de données de la police?
  • 12:35 modifié #16
    Je n'osais pas le demander :p
  • muqaddarmuqaddar Administrateur
    12:35 modifié #17
    dans 1136119859:

    Je n'osais pas le demander :p


    Bein, c'est moi qui vais avoir l'air bête.
    Je suppose que toutes les infos de la police (taille, police, style...) qui viennent du font panel arrivent dans un NSDictionary non ?
  • 12:35 modifié #18
    Toutes ces infos sont contenues dans l'objet font lui même.
  • muqaddarmuqaddar Administrateur
    12:35 modifié #19
    Me revoilà .
    Je me suis donc décidé à  implémenter un fontPanel. ;-)

    - (IBAction)changeFont:(id)sender<br />{<br />	NSFontPanel *fontPanel = [NSFontPanel sharedFontPanel];<br />	[fontPanel orderFront:nil];<br />	<br />	NSFontManager *fontManager = [NSFontManager sharedFontManager];<br />	[fontManager setDelegate:self];<br />}
    


    Pour ma part, ces attributs de texte seront "attribués" à  un texte qui est dessiné dans une vue (drawAtPoint withAttributes).
    Maintenant, je ne saisis pas bien comment récupérer la font. J'ai une de vos discussions (bru, supermic) où il est écrit que le changement de font est envoyé au first responder... mais après, comment le récupérer ?
  • Eddy58Eddy58 Membre
    janvier 2006 modifié #20
    Pas besoin de délégué, c'est le first responder qui est pris en compte. Il faut implémenter la méthode changeFont: pour détecter les changements dans le font panel, j'ai pas d'exemple concret sous la main, mais tu pourras t'inspirer de ce topic.:)
  • muqaddarmuqaddar Administrateur
    12:35 modifié #21
    dans 1136474424:

    Pas besoin de délégué, c'est le first responder qui est pris en compte. Il faut implémenter la méthode changeFont: pour détecter les changements dans le font panel, j'ai pas d'exemple concret sous la main, mais tu pourras t'inspirer de ce topic.:)



    Oui, j'avais bien saisi en fait.

    - (void)changeFont:(id)sender<br />{<br />	NSFont* newFont = [[NSFontManager sharedFontManager] convertFont:[[NSFontManager sharedFontManager] selectedFont]];<br />&nbsp;  <br />	NSLog(@&quot;Font Changed to %@&quot;, [newFont fontName] );<br />}
    


    mais changeFont n'a pas l'air appelé... le log ne m'affiche rien quand je change les polices ds le nsfontpanel...
  • BruBru Membre
    12:35 modifié #22
    La méthode changeFont: appellée est celle du first responder... Or qui est ton first Responder lorsque tu fais une modif de font dans le font Panel ?

    Il y a longtemps, j'avais résolu ça en implémentant changeFont: dans une catégorie de NSResponder. Dans cette implémentation, je ne faisais que renvoyer une NSNotification personnalisée informant d'un changement de sélection dans le fontPanel.

    Ainsi, quelque soit la view qui été first responder, ça me permettait de récupérer la sélection faite dans le fontPanel, en ajoutant un observateur sur la NSNotification personnalisée.

    .
  • muqaddarmuqaddar Administrateur
    janvier 2006 modifié #23
    Je voulais que mon firstResponder soit mon textField...
    mais je me prends un warning...

    Te méthode a l'air astucieuse sinon... :-)
  • muqaddarmuqaddar Administrateur
    12:35 modifié #24
    Bon finalement, j'ai sous-classé NSTextField pour lui ajouter changeFont() et acceptsFirstResponder comme méthodes.

    Maintenant, ça marche. :-)
  • muqaddarmuqaddar Administrateur
    12:35 modifié #25
    Bon, tout mon petit monde marche ce matin... :-)

    Je continue.
    Je dois écrire un bloc de texte (un paragraphe quoi) dans une vue (sans fields...).
    Y a t-il un moyen de controller un drawAtPoint sur plusieurs lignes ?
    Ou autre ?
  • BruBru Membre
    12:35 modifié #26
    dans 1136540333:

    Bon, tout mon petit monde marche ce matin... :-)

    Je continue.
    Je dois écrire un bloc de texte (un paragraphe quoi) dans une vue (sans fields...).
    Y a t-il un moyen de controller un drawAtPoint sur plusieurs lignes ?
    Ou autre ?


    Ben...

    Remplace ton drawAtPoint... par un drawInRect... !

    .
  • muqaddarmuqaddar Administrateur
    12:35 modifié #27
    dans 1136542036:

    dans 1136540333:

    Bon, tout mon petit monde marche ce matin... :-)

    Je continue.
    Je dois écrire un bloc de texte (un paragraphe quoi) dans une vue (sans fields...).
    Y a t-il un moyen de controller un drawAtPoint sur plusieurs lignes ?
    Ou autre ?


    Ben...

    Remplace ton drawAtPoint... par un drawInRect... !

    .


    ça gère les retours à  la ligne tout seul ?
  • muqaddarmuqaddar Administrateur
    12:35 modifié #28
    dans 1136542451:

    dans 1136542036:

    dans 1136540333:

    Bon, tout mon petit monde marche ce matin... :-)

    Je continue.
    Je dois écrire un bloc de texte (un paragraphe quoi) dans une vue (sans fields...).
    Y a t-il un moyen de controller un drawAtPoint sur plusieurs lignes ?
    Ou autre ?


    Ben...

    Remplace ton drawAtPoint... par un drawInRect... !

    .


    ça gère les retours à  la ligne tout seul ?


    En effet, c'est parfait... merci Bru. :-)
  • muqaddarmuqaddar Administrateur
    12:35 modifié #29
    Ah, la dernière question ;-)

    Je n'ai pas eu de problème pour récupérer le nom et la taille de ma NSFont avec pointSize et fontName, mais je ne trouve pas où se cachent les styles dans la doc. J'ai affiché mon objet NSFont sans succès, ça doit être dans un sous-objet...
  • BruBru Membre
    12:35 modifié #30
    dans 1136546528:

    Je n'ai pas eu de problème pour récupérer le nom et la taille de ma NSFont avec pointSize et fontName, mais je ne trouve pas où se cachent les styles dans la doc. J'ai affiché mon objet NSFont sans succès, ça doit être dans un sous-objet...


    Que cherches-tu à  faire extactement ?
    Savoir si ta fonte est en gras, italique, etc ?

    Dans ce cas, tu dois utiliser la méthode traitsOfFont: de NSFontManager, en passant ta fonte en paramètre. Cette méthode retourne un int dont chaque bit correpond à  un style.

    .
  • BruBru Membre
    janvier 2006 modifié #31

    dans 1136549625:

    dans 1136546528:
    Je n'ai pas eu de problème pour récupérer le nom et la taille de ma NSFont avec pointSize et fontName, mais je ne trouve pas où se cachent les styles dans la doc. J'ai affiché mon objet NSFont sans succès, ça doit être dans un sous-objet...

    Que cherches-tu à  faire extactement ?
    Savoir si ta fonte est en gras, italique, etc ?

    Dans ce cas, tu dois utiliser la méthode traitsOfFont: de NSFontManager, en passant ta fonte en paramètre. Cette méthode retourne un int dont chaque bit correpond à  un style.

    .

    D'accord, mais pour savoir si elle est en gras ou italique, je récupère actuellement la font elle même dans le field. J'ai donc une NSFont, je m'occupe plus du manager...
    Y a-t-il une manière de faire directement avec NSFont ?



    C'es le fontManager qui gère les NSFont.
    Tu n'as jamais à  le faire par toi-même.

    Une fois ta fonte récupéré, un
    <br />NSFont maFonte;<br />unsigned int style;<br /><br />maFonte=... //récupération de mon objet NSFont...<br /><br />style=[[NSFontManager sharedFontManager] traitsOfFont:maFonte];<br /><br />if (style &amp; NSBoldFontMask) NSLog(@&quot;la police maFonte est en gras&quot;);<br />if (style &amp; NSItalicFontMask) NSLog(@&quot;la police maFonte est en italique&quot;);<br /><br />// etc...<br />
    

    te permet de savoir ce que tu veux sur ta fonte !

    .

    Edit : c'est pâ bô de supprimer les messages quand on y répond...
Connectez-vous ou Inscrivez-vous pour répondre.