Laquelle de mes 2 vues est active ?

Bonjour


 


Je n'arrive pas à  trouver la bonne méthode pour différencier une vue qui est active et l'autre qui n'y est pas. 


En fait, j'ai sousclassé une NSView en y insérant une QTMovieView entre autre. Sur ma fenêtre, j'affiche 2 de mes NSView sousclassées, ce qui fait que j'ai la possibilité de voir 2 séquences video. Seulement, je voudrais que lorsque je clique sur l'une, un repère (comme dessiner une ombre autour de cette vue par exemple) puisse me dire que c'est cette vue qui est active. Et si je clique sur la 2e vue, celle ci devienne ombrée à  son tour mais l'autre ne doit plus l'être.


J'ai bien essayé avec les firstRespondeur mais je me suis perdu et finalement, je ne suis pas sur que ce soit la bonne méthode.


 


Quelle serait la bonne démarche ?


 


Merci d'avance


Réponses

  • Je ne sais si ça peut t'aider mais j'ai remarqué que dans la méthode 



    - mouseDown:

    Si je demande teste si self est le firstResponder, alors il me répond YES systématiquement.


    Comme s'il settait le firstResponder avant de gérer le mouseDown.


     


    (teste-le chez toi quand même)


     


    Tu peux t'en sortir avec la méthode



    - becomeFirstResponder
  • merci Colas2 de ta réponse. Pour mouseDown, j'ai la même remarque mais ça ne peux pas me servir puisque lorsque je clique dans ma NSView et surtout ds ma QTMovieView qui fait parti de ma NSView, le clic est généré directement par QTMovieView. Alors, on pourrait me dire de sousClasser ma QTMovieView mais je suis sûr qu'il y a moyen de faire plus simple.


    Sinon, pour le becomeFirstResponder, j'y accède que 2 fois (ce que je ne comprends pas). En fait, lorsque j'importe une video dans ma 1ere NSView, j'y accède une première fois. Egalement quand lorsque j'importe une video ds ma 2e NSVIew, une 2e fois. Mais après, je n'y accède plus jamais, même si je clique sur une des 2 NSView (soit dans une zone ou je n'ai pas de QTMovieView, soit sur QTMovieView).


  • Tu pourrais gérer à  la main la sélection de laquelle de tes NSView, avec un BOOL, dont tu changerais la valeur selon les mouseDown:


     


    Je suis d'accord que c'est pas hyper élégant comme solution, mais c'est rapidement mis en place.


  • samirsamir Membre
    septembre 2013 modifié #5

    Salut,


     


     Tu utilsie le mouseDown et tu récupère le NSEvent correspondant, ensuite tu récupère le touch position correspondant a l'event et tu teste si sur quelle vue on a clické.


  • Oui, j'y avais pensé mais je n'ai pas la main (je ne passe pas à  mouseDown) sur la partie bleu qui correspond à  un QTMovieView (voir photo)...


     


  • Bon, voici  ce que j'ai trouvé : puisque c'est QTMovieView qui monopolise apparemment le clic, voici comment j'ai contourné mon problème, ça peut intéresser quelqu'un:


    Bon c'est peut être pas très classe ! mais ça marche


     


    j'ai placer un testeur dans un timer dans ma sous classe NSView:



    if (([[playerView window]firstResponder] == playerView ) || ([[self window]firstResponder] == self)) {
    if (estOmbree == NO) {
    [self creerOmbreSiFirstResponder:YES];
    estOmbree = YES;
    }

    }else{
    if (estOmbree == YES) {
    [self creerOmbreSiFirstResponder:NO];
    estOmbree = NO;
    }

    }

    et voici le code pour ombrer : 



    -(void)creerOmbreSiFirstResponder : (BOOL)afficherOmbre
    {
    //desiner ombre de firstResponder
    // ne pas oublier de mettre ds l'IB-onglet de droite, le core animation layer- vue : coché
    NSShadow *ombre = [[NSShadow alloc] init];
    [ombre setShadowColor: [NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:.8]];
    [ombre setShadowBlurRadius:5.];
    [ombre setShadowOffset:NSMakeSize(13.5, -3.5)];
    [self setWantsLayer:YES];

    if (afficherOmbre) {
    [self setShadow:ombre];
    }else{
    [self setShadow:nil];
    }

    [ombre release];
    }
  • Tu peux essayer le code suivant pour connaitre la vue qui a le focus



    @implementation myWindow

    - (BOOL)makeFirstResponder:(NSResponder *)aResponder
    {
    NSResponder *oldResponder = [self firstResponder];
    BOOL responderChanged = [super makeFirstResponder:aResponder];

    if ( (responderChanged) && (oldResponder!=aResponder) )
    {
    if (aResponder)
    {
    NSLog(@vue qui le focus %x,aResponder);
    }
    }
    }


  • En effet, j'avais bien vu cette piste mais je n'ai pas réussit à  l'appliquer...


    Je vais essayer ta solution


     


    Merci encore


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