Discussion : Aqua/Metal d'une fenêtre

03:29 modifié dans API AppKit #1
Bonsoir,

j'aimerai votre avis à  propos du sujet suivant :

Le développeur d'Onyx, a sorti un programme qui permet seulement de réaliser les options de maintenance incluses dans Onyx. Dans les préférences de ce logiciel, ce trouve les 2 choix suivants à  propos de l'interface :
- Metal Brossé
- Aqua

à‰tant donné que cette personne travaille sous Xcode & Interface Builder avec comme langage : Applescript, je lui ai demandé comment avait-elle fait pour changer le look Metal/Aqua de ses fenêtres :

Bien sûr que c'est possible... Et en plus, c'est une méthode Objective-C !! Je l'ai trouvé un peu par hasard en tatonnant (je n'ai rien trouvé dans la doc d'Xcode ni dans les Frameworks !?!...)
C'est la méthode _setTexturedBackground:
Je fais donc apple (euh non... appel) à  cette méthode de la manière suivante. Je ne sais pas si c'est très "réglo" mais ça fonctionne...  :

<br />call method &quot;_setTexturedBackground:&quot; of window &quot;main&quot; with parameter 1 -- Interface Métal <br />call method &quot;_setTexturedBackground:&quot; of window &quot;main&quot; with parameter 0 -- Interface Aqua<br />


... et je fais ça pour chaque fenêtre de l'application. Par contre, par défaut, les windows et panels dans IB doivent être "métal". Avec ça, tu devrais pouvoir transposer en "tout Objective-C"...


Mais voilà , j'avais déjà  posé la question il y a pas mal de temps sur ce forum : "Est-il possible de changer, via le code, le look de la fenêtre ?"
La réponse était, en gros  :o, "Non.".

Maintenant, est-ce possible ?  ???

Petit hic :
D'après le développeur d'Onyx, il faudra appeler cette méthode pour chaque fenêtres...
à‰tant donné que dans mon programme, j'ai pas mal de fenêtres, est-ce plus judicieux de faire un programme alternatif qui permettrait simplement de changer le look de toutes les fenêtres ?
En réalité, ce programme alternatif, je l'avais déjà  fait. J'ai créé 2 dossiers.
- Dossier "Install" -> contient les nibs de mon programme avec les fenêtres en Metal brossé
- Dossier "Uninstall" -> Contient les nibs de mon programme avec les fenêtres en Aqua
Après, le code est simple.. J'ai renommé les dossiers en ajoutant l'extension ".pkg" pour pas que Xcode prennent en compte les fichiers Nibs. L'installation copie les nibs du dossier Install vers le dossier "Resources" de mon programme. Et la désinstallation  copie les nibs du dossier Uninstall vers le dossier "Resources" de mon programme.

Ce programme alternatif est-il la meilleure solution au problème ?

Si vous souhaitez voir plus clair :
http://www.eagle-of-liberty.com/ifreete/iFreete.zip (Le programme en question)
http://www.eagle-of-liberty.com/~ifreete/XTras/MetalFreete/MetalFreete2.1.zip (Le programme alternatif qui installe/désinstalle le look Metal brossé)

Merci d'avance.
Louka.

PS : comme je ne savais pas trop où placer le sujet, si un modérateur voit un endroit où le topic serait mieux placé, faut pas hésiter ! ;-)

Réponses

  • août 2006 modifié #2
    Ouah, dans le genre capillotracté c'est sympa: il te donne le nom d'une méthode qu'il suffit d'essayer* pour se rendre compte qu'elle marche parfaitement, et toi tu sors un truc qui exige de renommer des fichiers dans l'exécutable. Solution à  proscrire car 1. l'utilisateur n'a pas toujours les droits de modifier un élément du dossier "Applications" et 2. une préférence utilisateur ne peut en aucun cas modifier quelque chose dans l'application elle-même, car du coup sa préférence devient globale et ça c'est mal.

    Alors si maintenant on t'avait dit que ce n'était pas possible, c'est pour une raison en fait très simple: _setTexturedBackground: est comme toutes les méthodes qui commencent par _ une méthode privée, normalement censée n'être utilisée qu'en interne dans le framework dont elle provient. La raison pour laquelle Apple la garde privée, je ne sais pas, mais en attendant elle n'est pas documentée et donc on ne peut savoir son existence qu'en passant de longues heures dans une sortie class-dump. Mais ça ne l'empêche pas d'exister.

    Maintenant pour ce qui est de modifier les fenêtres à  la volée, tu peux récupérer les fenêtres avec [tt]windows[/tt] de NSApplication. Tu n'as qu'à  faire une boucle pour modifier les instances une à  une.

    En tous cas merci de nous rapporter cette astuce, plutôt que de la déplacer, je te suggère de rédiger un nouveau sujet dans les trucs et astuces.

    * il suffit de taper ça dans le code d'une IBAction reliée à  une checkbox: [[sender window] _setTexturedBackground:([sender state]==NSOnState)?YES:NO];

    EDIT: n'oublie pas d'accompagner ce message de celui-ci setMovableByWindowBackground:, il faut en effet qu'une fenêtre alu puisse être déplacée à  partir de n'importe quel point (non occupé par une contrôle), contrairement aux fenêtres classiques où seul la barre de titre peut être utilisée.

  • BruBru Membre
    03:29 modifié #3
    Je ne dirais pas mieux que Renaud : missa dicta est !

    Par contre, je trouve ridicule de créer une "préférence" pour déterminer si les fenêtres d'une appli doivent être textured ou non.

    En tant qu'utilisateur, je me fous royalement de l'aspect des fenêtres, du moment que l'appli est fonctionnelle et sympa à  utiliser.

    En tant que développeur, par contre, je me reserve le choix de tel ou tel aspect des fenêtres, suivant ma vison esthétique des choses, et je ne conçois pas que l'utilisateur puisse intervenir dans ces choix.

    D'autre part, selon que la fenêtre soit textured ou non, cela implique aussi de changer d'autres éléments visuels de l'interface. Certaines icônes auront un aspect différent en fonction la texture (une icône "riche" en couleur sera plus visible dans un fond uni, alors qu'elle semblera "brouillonne" noyée au milieu du métal brossé).

    Donc, c'est à  toi, développeur de faire ces choix esthétiques.
    Ces choix seront définis en fonction de tes goûts, mais aussi de la finalité de l'appli : une appli pourtant sur le multi-média sera mieux en interface textured, alors qu'une appli plus pro sera mieux en fond normale. Une fois ce choix fait, le reste de l'interface doit être cohérent (couleur, taille, forme des NSButton, etc...)

    .
  • 03:29 modifié #4
    Merci pour votre aide.

    Au départ, j'ai eu cette idée car je connaissais quelques utilisateurs d'iFreete qui souhaitaient du Metal Brossé. J'ai donc fait ce ptit programme alternatif dans le but qu'iFreete puisse plaire à  encore plus de personnes  :o
  • elfelf Membre
    03:29 modifié #5
    Salut,

    Moi, ce que je te conseil c'est de faire une préférence cachée!

    Tu pourrais soit faire en sorte que si on change une valeure à  la main dans le plist ça change ça, soit que il y aie un "easter egg" dans ton app.

    http://fr.wikipedia.org/wiki/Easter_egg

    Je pense que ça fait une petite bidouille possible et que c'est toujours bon d'avoir des gens qui parle de ton app pour en donner des trucs!

    ça fait de la pub à  OnyX aussi, tu savais que si tu cliquais sur l'item de séparation tu as un easter egg? Je me rappelle plus trop de quoi, mais j'avais lu ça dans un SVMac

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