Pb NSWindow

ldfaldfa Membre
04:58 modifié dans API AppKit #1
Bonjour à  tous
Déja un problème  ... avec une custom NSView dans une NSWindow.
Enfin c'est surtout avec la fenêtre que j'ai un problème:
Si je valide l'attribute has texture, lorsque je fais un mouseDragged dans ma view, la fenêtre ce déplace ...  >:(
Si je dévalide l'attribute has texture .. plus de problème.

J'ai trouvé ça dans la doc qui confirme mon problème...  :D

NSTexturedBackgroundWindowMask
The window displays with a metal-textured background. Additionally, the window may be moved by clicking and dragging anywhere in the window background. A bordered window with this mask gets rounded bottom corners.

Question ... comment éviter que ma fenêtre ce déplace lorsque je click dans ma view ? car j'aime bien le look de cette fenêtre :-)

Réponses

  • ClicCoolClicCool Membre
    04:58 modifié #2
    Bonjour,

    et en renvoyant NO dans la méthode de NSWindow ?:

    - (BOOL)isMovableByWindowBackground
    
  • BruBru Membre
    04:58 modifié #3
    dans 1163404657:

    Bonjour,
    et en renvoyant NO dans la méthode de NSWindow ?:
    - (BOOL)isMovableByWindowBackground
    



    Non,
    en passant NO à  la méthode setMovableByWindowBackground: de NSWindow (à  mettre dans le awakeFromNib du contrôleur si la fenêtre est créée dans IB).

    .
  • ClicCoolClicCool Membre
    04:58 modifié #4
    dans 1163404857:

    Non,
    en passant NO à  la méthode setMovableByWindowBackground: de NSWindow (à  mettre dans le awakeFromNib du contrôleur si la fenêtre est créée dans IB).
    .


    En effet.

    Mais quoiqu'il en soit l'idée de faire une textured window non "background-dragable" n'est pas forcément bonne dans la mesure où justement cet aspect particulier des fenêtres nous informe de ce comportement particulier par apport aux fenêtres "normales".

    Ta fenêtre risque de perturber les utilisateurs, je suis pas sur que ce soit conforme à  l'Apple Human Interface Guidelines.
  • AntilogAntilog Membre
    04:58 modifié #5
    Si j'ai bien lu le message de Idfa  :o ,

    Il était ennuyé pour un mouse drag dans une view, pas sur la fenêtre elle-même!

    Sinon, les drag'n drop seraient impossible avec des fenêtres texturées  :o

    Je n'ose y croire  >:D
  • ClicCoolClicCool Membre
    04:58 modifié #6
    dans 1163407095:

    Si j'ai bien lu le message de Idfa  :o ,

    Il était ennuyé pour un mouse drag dans une view, pas sur la fenêtre elle-même!

    Sinon, les drag'n drop seraient impossible avec des fenêtres texturées  :o

    Je n'ose y croire  >:D


    Celà  ne change pas le fait que de désactivé la possibilité de déplacer une textured-window en cliquant dans son contenu soit peut-être un peu perturbant.
  • ldfaldfa Membre
    04:58 modifié #7
    Merci à  tous

    dans 1163404857:

    Non,
    en passant NO à  la méthode setMovableByWindowBackground: de NSWindow (à  mettre dans le awakeFromNib du contrôleur si la fenêtre est créée dans IB).


    Comme j'ai pas encore de contrôleur, j'ai rajouté un awakeFrmNib dans ma sous classe de NSWiew et cela fonctionne, encore merci ... suffisait de lire un peu mieux la doc !!!

    Cependant, ma NSView n'occupe pas toute ma fenêtre, donc la rendre dragable autour de ma NSView est un bon exercice pour moi en tout cas :-)

    Bon j'ai essayé sans succés dans ma custom NSView:
    - (void) mouseDown: (NSEvent *) theEvent //Click souris dans la NSView
    {
    NSLog (@MouseDown NSView);
    [[self window] setMovableByWindowBackground: NO];
    }

    - (void) mouseUp: (NSEvent *) theEvent //Relachement de bouton de la souris dans la NSView
    {
    NSLog (@MouseUp NSView);
    [[self window] setMovableByWindowBackground: YES];
    }

    Déja pourquoi cela fonctionne pas m'interesse, même si j'ai une petite idée (le methode est appelé trop tardivement)

    Peut être à  faire dans la fenêtre, des idées?
    Merci
  • ldfaldfa Membre
    04:58 modifié #8
    Bon je me réponds tout seul, dans la NSWindow, cela ne fonctionne pas mieux....
  • BruBru Membre
    04:58 modifié #9
    Normalement, ta view doit être opaque.

    Pour ceci, tu dois implanter dans la sous classe la méthode isOpaque et retourner YES :
    - (BOOL)isOpaque<br />{<br />&nbsp; &nbsp; return YES;<br />}<br />
    

    Dans ce cas, tu es sûr que tous les événements souris arriveront à  ta view (avant d'être attrapés par le window-server comme c'est ton cas actuellement).

    .
  • ldfaldfa Membre
    04:58 modifié #10
    dans 1163444792:

    Normalement, ta view doit être opaque.

    Pour ceci, tu dois implanter dans la sous classe la méthode isOpaque et retourner YES :
    Dans ce cas, tu es sûr que tous les événements souris arriveront à  ta view (avant d'être attrapés par le window-server comme c'est ton cas actuellement).


    Merci ... et cela fonctionne .... le moins que l'on puisse dire c'est que c'est opaque :-)
    En tout cas c'est pas avec la doc de isOpaque de NSView que j'ai la réponse au pourquoi du comment.
    Une piste pour m'aider à  comprendre ... un lien vers une doc ?

    Bon cela me genère tout de même un léger problème, du coup, je n'ai plus la texture métalique en transparence lorsque je recopie une NSImage dans ma view .... mais du blanc ou du noir ... mais cela me semble plus logique, la partie métalique correspond à  la zone permettant le déplacement de la fenêtre.

  • BruBru Membre
    04:58 modifié #11
    dans 1163492400:

    Bon cela me genère tout de même un léger problème, du coup, je n'ai plus la texture métalique en transparence lorsque je recopie une NSImage dans ma view .... mais du blanc ou du noir ... mais cela me semble plus logique, la partie métalique correspond à  la zone permettant le déplacement de la fenêtre.


    Eh bin, t'es pas copain avec la doc !

    Pour reproduire le fond de la fenêtre dans ta view, là  où tu ne dessines rien, il te suffit d'appeler la fonction NSDrawWindowBackground(NSRect) au tout début de ta méthode drawRect: pour "peindre" le fond de la view avec le motif du fond de la fenêtre.
    <br />- (void)drawRect:(NSRect)aRect<br />{<br />&nbsp; &nbsp; // peindre le fond de la view au motif de la fenêtre<br />&nbsp; &nbsp; NSDrawWindowBackground([self bounds]);<br /><br />&nbsp; &nbsp; // suite des instructions de dessin...<br />}<br />
    


    .
  • ClicCoolClicCool Membre
    04:58 modifié #12
    Je me trompe peut-être mais une vue NON-Opaque peut-être draguée à  condition qu'elle ne soit pas tout à  fait transparente.

    Je ne me souviens pas l'avoir fait avec une vue, mais avec une NSView c'est sur.

    Après avoir défini:
    <br />	[fenetre setOpaque: NO];
    
    on ajoute quelque chose comme
    fenetreColor = [monBeauBlanc colorWithAlphaComponent: monAlphaValue];<br />	[fenetre setBackgroundColor: fenetreColor];
    


    Avec une valeur de monAlphaValue (float) au dessus de 0,14 , ça marche impec.
    La fenêtre est quasiment transparente et elle intercepte les clics et drags.

    Je vois pas trop pourquoi il en serait autrement avec une NSView ...
  • BruBru Membre
    04:58 modifié #13
    dans 1163496064:

    Je vois pas trop pourquoi il en serait autrement avec une NSView ...


    Il en est autrement pour la simple raison qu'une vue ne possède pas de valeur alpha...
    Il est donc de ta responsabilité de déterminer si une portion quelconque de ta vue est transparente (et donc laisse voir le fond) ou non.

    Dans l'exemple que j'ai donné à  ldfa, je ne me suis pas fatigué, sa vue est déclarée entièrement opaque, donc le fond n'est pas visible. Ceci peut être réparé via la fonction NSDrawWindowBackground.

    .
  • ClicCoolClicCool Membre
    novembre 2006 modifié #14
    dans 1163497705:

    dans 1163496064:

    Je vois pas trop pourquoi il en serait autrement avec une NSView ...


    Il en est autrement pour la simple raison qu'une vue ne possède pas de valeur alpha...


    une vue en elle même non, mais si la vue est déclarée sans background et que tu "draw" son contenu avec un fond présentant une valeur alpha proche de 0,15 ça doit donner une vue transparente (l'oeil exercé voit à  peine qu'il y a un fond) et dragable.


    P.S.
    La mémoire me revient, j'avais fait ça avec une NSTextVue Sans backround et dont les attributes strings étaient tout simplement affublées d'un tel fond avec valeur alpha.
    Pour faire varier la transparence en directe il suffisait de redéfinir la valeur Alpha des attributs de fond et mettre à  jour la textVue.
  • BruBru Membre
    04:58 modifié #15
    Le problème n'est pas là .

    Si ta vue est non-opaque, le gestionnaire d'événement considère alors qu'elle est transparente, et donc (tout comme une fenêtre avec un alpha à  0), transmet l'événement (mouseDown par exemple) à  la vue parente.

    Même si tu dessines une figure pleine dans ta vue non-opaque, et même si cette dernière est visible à  l'écran, le fait de renvoyer NO à  isOpaque "trompe" le gestionnaire d'événement. En effet, comment veux tu que ce dernier sache ce que tu as dessiné, et où tu l'as dessiné, et donc de déterminer ce qu'il doit faire de l'événement (le transmettre aux vues parentes ou non)...

    Par contre, le système te laisse libre de modifier dynamiquement la valeur de isOpaque en cours d'éxecution, afin d'avertir le gestionnaire que le point de l'événement est sur une portion opaque ou non.

    Ainsi, si l'événement à  lieu dans ta figure, tu fais en sorte de renvoyer YES à  l'appel de isOpaque, sinon tu y renvoies NO.

    .
  • ClicCoolClicCool Membre
    04:58 modifié #16
    ah, j'ai remis la main sur mon source avec la textView.

    J'avais défini des couleures paires et impaires pour un affichage de listing
    <br />	NSColor* oddColor = [NSUnarchiver unarchiveObjectWithData:[mesPrefs valueForKey:@&quot;oddColor&quot;]];<br />	oddColor = [oddColor colorWithAlphaComponent:[[mesPrefs valueForKey:@&quot;Transparence&quot;]floatValue]];
    

    Après tu écrit du texte
    <br />		NSMutableAttributedString*			ligneStr = [[[NSMutableAttributedString alloc] initWithString:@&quot;voila une ligne de texte&quot;]
    

    Puis tu lui colle la background alpha-bétisée ;)
    <br />				[ligneStr addAttribute:NSBackgroundColorAttributeName value:oddColor range:NSMakeRange(0,[ligneStr length])];
    


    Et ça marche comme ça, sans avoir à  intercepter quoique ce soit tant que l'alpha est > 0,14.
  • ClicCoolClicCool Membre
    04:58 modifié #17
    dans 1163499292:

    Le problème n'est pas là .

    Si ta vue est non-opaque, le gestionnaire d'événement considère alors qu'elle est transparente, et donc (tout comme une fenêtre avec un alpha à  0), transmet l'événement (mouseDown par exemple) à  la vue parente.

    Même si tu dessines une figure pleine dans ta vue non-opaque, et même si cette dernière est visible à  l'écran, le fait de renvoyer NO à  isOpaque "trompe" le gestionnaire d'événement. En effet, comment veux tu que ce dernier sache ce que tu as dessiné, et où tu l'as dessiné, et donc de déterminer ce qu'il doit faire de l'événement (le transmettre aux vues parentes ou non)...

    Ben ecoutes si c'est le cas pourquoi mon code marche ? (ça vient d'une appli qui tourne depuis 2 ans)
    La TextView est posée sur une fenêtre transparente dont la valeur alpha varie avec celle de mes attributes strings, c'est peut-être ça qui fait que ça marche ?
    C'est alors la fenêtre (qui a le même alpha) qui réagi au clic ? et non pas la textView ?

    Bon dès que je peux je recompile la source et vois ça dans le débugger ...
  • ClicCoolClicCool Membre
    novembre 2006 modifié #18
    J'ai pas attendu d'avoir le temps, je l'ai pris.
    J'ai recompilé le source en forçant la fenêtre à  une valeur Alpha à  zéro en permanence et la textVue avec Alpha réglable de zéro à  1.

    Force est de constater que je peux plus draguer ma fenêtre (c'est logique).
    Mais, si un clic sur une zone transparente de la fenêtre est bien reçue par la fenêtre sous jascente,
    un clic sur la textVue, dès que son alpha est suffisant, n'atteint pas la fenêtre du dessous et permet de sélectionner des portions de texte et de les éditer, donc elle gère les clics non ?

    Ma textView n'implémente pas de fonction permettant de la draguer, je ne peux donc vérifier si un drag peut-être déclenché, mais la textView (sans brakground) gère les clics tombant sur une ligne dont l'Alpha est superieur à  0,15.

    Au besoin, on doit pouvoir, s'il le faut, transmettre le clicDrag reçu par le texte à  sa textVue

    [EDIT]A noter que le clic a l'air d'être transmis à  la hiérarchie dans la mesure ou un clic sur une ligne totalement transparente ne fait rien alors qu'un clic sur une ligne pas tout à  fait transparente fait aussi repasser la fenêtre au premier plan
  • ClicCoolClicCool Membre
    04:58 modifié #19
    Oh, mais suis-je étourdi !

    J'aurais peut-être pu me passer de recompiler tout le basar !
    Ma fenêtre, à  transparence réglable en même temps que son contenu, a une ToolBar dont les items n'on pas de fond non plus !

    Et y'a aucun problème pour les draguer (dans le "customize toolbar") dès lors que l'alpha est supérieur à  0,14 !

    CQFD non ?

    Sinon c'est un problème sans fond pour moi ;D
Connectez-vous ou Inscrivez-vous pour répondre.