Interface metal ou aqua au choix

muqaddarmuqaddar Administrateur
16:49 modifié dans API AppKit #1
Salut jeunes gens,

Bon on en a parlé récemment, mon appli est en Aqua par défaut. Par le biais d'une preférences (checkbox), je voudrais donner la possibilité de la passer en métal.

id mesPrefs = [[NSUserDefaultsController sharedUserDefaultsController] values];<br />//renvoyons la valeur de la boà®te à  cocher sous forme d&#39;un simple booléen<br />BOOL interfaceStyle = [[mesPrefs valueForKey: @&quot;interfaceStyle&quot;] boolValue];


Là  je récupère la valeur. Ensuite si le BOOL est YES, je voudrai donner l'apparence métal.

J'ai bien vu cette doc, mais j'arrive pas à  l'exploiter :
http://www.cocoadev.com/index.pl?TexturedWindows

Merci à  vous de me guider.  o:)

Réponses

  • mpergandmpergand Membre
    16:49 modifié #2
    Code utilisé dans Creator & Type

    import com.apple.cocoa.foundation.*;
    import com.apple.cocoa.application.*;

    public class TexturedBackgroundWindow extends NSWindow {

    private static String PrefWindowName="EditorWindow";


    public TexturedBackgroundWindow( NSRect contentRect, int styleMask, int backingType, boolean defer)
    {
    super( contentRect,
    styleMask+((UUserDefaults.booleanPreferenceValue(PrefWindowName+"HasTexturedBackground"))
    ?NSWindow.TexturedBackgroundWindowMask:0),
    backingType,defer);
    }



    public void setTexturedBackground(boolean state)
    {
    UUserDefaults.setBooleanPreferenceValue(frameAutosaveName()+"HasTexturedBackground",state);

    }

    public boolean texturedBackground()
    {
    return UUserDefaults.booleanPreferenceValue(frameAutosaveName()+"HasTexturedBackground");

    }

    }
  • muqaddarmuqaddar Administrateur
    16:49 modifié #3
    Merci mpergand !

    T'as fait une classe rien que pour ça ?
    Sinon, bah, c'est du Java... Si y'a un traducteur Java -> Obj-C dans la salle... ?
  • mpergandmpergand Membre
    septembre 2004 modifié #4
    ben c'est quif quif, pour le paramètre mask tu ajoutes NSTexturedBackgroundWindowMask si la preférence à  été cochée.

    - (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag

    TexturedBackgroundWindow
  • 16:49 modifié #5
    Si tu veux être cohérent avec les HIG (hein Eddy:p), si tu mets une fenêtre métal, elle doit être déplaçable en cliquant sur le background (méthode: setMovableByWindowBackground:). Les fenêtres Aqua ne se déplacent par contre qu'à  partir de la barre de titre.
  • ClicCoolClicCool Membre
    16:49 modifié #6
    En effet Renaud !!
    quel soucis du détail ! ;)

    Oui Oxitan on ne peut modifier le styleMask d'une fenêtre une fois qu'elle a été crée :(
    Faut donc sous classer ta NSWindow pour implémenter son init....

    Enfin, on peut pas modifier une fois la fenêtre crée ... IB le fait bien lui !! (quand on coche/décoche "has texture") !
    Comment fait I.B. là  ? ???
    Personne n'a réussi à  faire la même chose ?
  • muqaddarmuqaddar Administrateur
    16:49 modifié #7
    Très bien !
    Alors sous-classons. :)
    Merci messieurs.
  • mpergandmpergand Membre
    septembre 2004 modifié #8
    dans 1096415079:

    Si tu veux être cohérent avec les HIG (hein Eddy:p), si tu mets une fenêtre métal, elle doit être déplaçable en cliquant sur le background (méthode: setMovableByWindowBackground:). Les fenêtres Aqua ne se déplacent par contre qu'à  partir de la barre de titre.


    Déja il serait bien qu'Apple respecte ses propes directives. Une fenêtre de document ne devrait jamais avoir le look metal ( Safari ??!!)

    Enfin, on peut pas modifier une fois la fenêtre crée ... IB le fait bien lui !! (quand on coche/décoche "has texture") !


    L'astuce consistant à  créer nouvelle fenêtre et à  remplacer le contentView à  la volée est plantogène, ça marche une fois mais pas deux  :-\

    Quant à  IB soit il utilise des fenêtres non classiques, soit il utilise une méthode non documentée (ou les deux  :D)
  • 16:49 modifié #9
    Pour info,tous les sharewares/freewares que je connais qui laissent ce choix à  l'utilisateur spécifient que pour le passage à  l'interface aqua/metal demande soit un redémarrage de l'app, soit ils disent que le changement ne se fera que pour les nouvelles fenêtres. Donc ne te casse pas trop la tête avec ça.

    dans 1096447592:

    Déja il serait bien qu'Apple respecte ses propes directives. Une fenêtre de document ne devait jamais avoir le look metal ( Safari ??!!)

    Le Finder aussi. Il y a encore d'autres trucs qui ne vont pas dans Safari, comme par exemple le non emploi de NSToolbars, pour les fans de l'interface graphite, il n'est pas adapté (les boutons de la "barre d'outil" restent bleus alors qu'ils devraient être gris).
  • Eddy58Eddy58 Membre
    16:49 modifié #10
    dans 1096433381:

    Enfin, on peut pas modifier une fois la fenêtre crée ... IB le fait bien lui !! (quand on coche/décoche "has texture") !
    Comment fait I.B. là  ? ???
    Personne n'a réussi à  faire la même chose ?


    I.B. est un soft très particulier....  je pense que les fenêtres dans lesquelles ont met nos instances sont toutes tracées via Quartz à  coup de drawRect: et de primitives.
    En faites on a une simulation du résultat je crois :)
     
Connectez-vous ou Inscrivez-vous pour répondre.