Détecter un clic sur la barre de titre d'une fenêtre
Chacha
Membre
Salut,
Je cherche comment détecter un clic sur la barre de titre d'une fenêtre. Détecter le double-clic, à la limite, c'est facile : ça appelle "miniaturize". Mais un simple clic ?
+
Chacha
Je cherche comment détecter un clic sur la barre de titre d'une fenêtre. Détecter le double-clic, à la limite, c'est facile : ça appelle "miniaturize". Mais un simple clic ?
+
Chacha
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Avec cette méthode, tu surcharges la méthode mouseDown:, puis tu vérifies que le clic eu lieu dans la structureView (view qui affiche la structure de la fenêtre) et plus particulièrement dans la barre de titre.
.
Je suis d'accord avec toi sur le principe, mais malheureusement, sous-classer NSWindow et surcharger son mouseDown: ne concerne que l'intérieur de la fenêtre, pas la barre de titre.
+
Chacha
Supposition : la barre de title est-elle une sous-vue ?
Ah, non, ce n'est pas pour le déplacement que j'en ai besoin, mais c'est déjà intéressant de savoir que le mouseDragged marche et pas le mouseDown.
Et si oui, comment y faire référence ? Je me pose aussi la question.
+
Chacha
La barre de titre est dessinée dans la structure view qui est la NSView de plus haut niveau. Un [tt][[window contentView] superview][/tt] permet de retourner cette vue.
.
Ah, c'était ça la structureView ? Jamais entendu parler, et pour cause :
Du coup, a-t-on vraiment le droit de taper dedans ?
De toutes façons, je me vois mal "remplacer" cette view par une sous-classe qui me permet de redéfinir le comportement lors d'un clic simple. Si encore NSView implémentait le NSCopying...
Oh, j'ai une idée :
Je fais une catégorie de NSView qui lance une notification lors d'un mouseDown !
[edit]
Et ben non, ça marche pas. La barre de titre ne doit pas être une NSView.
[/edit]
+
Chacha
C'est comme le [contentView superview] de Bru, non ?
+
Chacha
D'après mes essais, si, ça revient au même :
Une fenêtre contient une "_borderView", qui est la vue recouvrant l'ensemble de la fenêtre.
La borderView a 4 sous-vues:
-la contentView qui laisser une marge supérieure pour la barre de titre
-les 3 boutons
Donc la barre de titre, ce n'est jamais que l'espace libre au-dessus de la contentView.
Ma nouvelle idée (pas encore eu le temps d'essayer), c'est d'injecter une vue à cet endroit, à droite des boutons. De cette façon, je peux sous-classer et intercepter les événements. Je vous tiens au courant.
+
Chacha
Non, la fenêtre est composée d'une NSView qui contient la contentView, et les NSButton éventuels.
Le titre est "dessiné" dans une NSCell qui sera affichée dans cette NSView principale.
.
Juste détecter le clic (et déclencher une méthode personnelle) tout en laissant la fenêtre répondre à ce clic en démarrant une session de déplacement...
... ou intercepter le clic pour que :
1- la fenêtre n'entame pas une session de déplacement.
2- une méthode personnelle se déclenche.
?
Je voudrais déclencher une méthode personnelle, sans altérer les déplacements par dragging.
Le delegate windowWillMove: de NSWindow est appelé dès le clic sur la barre de titre, même sans mouvement de la souris (qui provoque le déplacement).
Dès lors, après récupération des coords du clic, un simple test (NSMouseInRect) te permet de déclencher ce que tu veux faire...
.
Oui, c'est une bonne idée !
Mais en fait, ça ne va pas pour ce que je veux faire; j'aurais du être plus précis.
Ce que je veux, c'est "replier" l'inspecteur quand on clique sur la barre de titre. Donc il me faut détecter mouseDown et mouseUp, car le drag annule le repliement. Il y a moyen d'accéder à la NSCell contenant le titre de la fenêtre ?
+
Chacha
Chacha, j'aurais su ce que tu voulais faire beaucoup plus tôt, tu aurais eu une solution beaucoup plus tôt...
Veux-tu vraiment jouer avec des undocumented ?
Voici la solution à ta question :
.
Remarquable. Je n'avais jamais travaillé comme ça avec les NSEvent, je viens d'apprendre un nouveau truc, là . Comme quoi on ne sait jamais où nos questions nous mènent.
Et un merci respectueux, comme d'hab.
+
Chacha
Enfin moi je dis ça je dis rien.... d'ailleurs je m'en vais de suite en fait :P
Non, ça ne va pas, parce qu'on peut cliquer sans déplacer la fenêtre, donc sans déclencher de WindowDidMove.
Mais là c'est bon, en me basant sur le code de Bru, j'ai pu faire ce que je voulais.
+
Chacha