Superposer des vues et des objets

RocouRocou Membre
02:45 modifié dans API AppKit #1
Bonjour,

J'essaie de superposer des NSView et y ajouter des objets graphiques. Je n'ai pas compris comment, sous IB, sélectionner un objet de l'interface. A la souris, il semble impossible sinon très difficile d'atteindre les couches du dessous. Dans le menu TOOLS, il y a bien un 'select' mais il ne permet pas de faire défiler tous les objets

Réponses

  • Philippe49Philippe49 Membre
    02:45 modifié #2
    TU peux toujours correctemet gérer tout cela en passant en mode fichier dans le xib lui-même. Sinon utilises les touches Options e t Commande, ainsi qu'un temps d'attente. Explications dans l'aide de IB (menu Help)
  • psychoh13psychoh13 Mothership Developer Membre
    02:45 modifié #3
    Déjà  la superposition des vues c'est pas top.
    Ensuite, tu peux naviguer entre les vues avec les raccourcis appropriés que tu peux voir dans l'un des menus d'IB.
    Et pour finir, pour ce que tu veux faire, la plupart des ajouts devraient se faire dans le code directement.
  • RocouRocou Membre
    02:45 modifié #4
    dans 1242385229:

    Déjà  la superposition des vues c'est pas top.


    Si tu as une autre méthode, je suis preneur!

    dans 1242385229:

    Ensuite, tu peux naviguer entre les vues avec les raccourcis appropriés que tu peux voir dans l'un des menus d'IB.


    Il me semble que ces raccourcis sont faits pour naviguer au sein des objet graphiques. Mais j'ai fini par trouver: tout simplement avec la touche TAB.

    dans 1242385229:

    Et pour finir, pour ce que tu veux faire, la plupart des ajouts devraient se faire dans le code directement.


    Oui, je vais m'orienter dans cette direction. Merci.
  • psychoh13psychoh13 Mothership Developer Membre
    02:45 modifié #5
    dans 1242388978:

    Si tu as une autre méthode, je suis preneur!


    Bah, les vues peuvent être des sous-vues d'une vue principale, mais des vues de même niveau devraient éviter de se superposer.

    Ensuite, tu n'es pas obligé, c'est peut-être même mauvais pour les performances, d'utiliser une vue par bloc (un bloc représentant un événement iCal par exemple), il vaut mieux utiliser des objets capables de se dessiner eux-mêmes dans une seule vue, c'est le même principe que les NSCell...

    dans 1242388978:

    Il me semble que ces raccourcis sont faits pour naviguer au sein des objet graphiques. Mais j'ai fini par trouver: tout simplement avec la touche TAB.


    Euh... Je vois mal comment ça pourrait être difficile de sélectionner à  la souris des éléments non graphiques puisqu'ils ne se superposent pas et qu'ils sont dans une fenêtre bien rangées...
    Alors oui forcément, les raccourcis dont je parle permettent de sélectionner les différents objets graphiques...
  • RocouRocou Membre
    02:45 modifié #6
    dans 1242389632:

    Bah, les vues peuvent être des sous-vues d'une vue principale, mais des vues de même niveau devraient éviter de se superposer.

    Ensuite, tu n'es pas obligé, c'est peut-être même mauvais pour les performances, d'utiliser une vue par bloc (un bloc représentant un événement iCal par exemple), il vaut mieux utiliser des objets capables de se dessiner eux-mêmes dans une seule vue, c'est le même principe que les NSCell...


    Non, tu n'y es pas, j'ai du mal m'exprimer. Les blocs, j'avais dans l'idée de les dessiner sur une vue (avec NSBezierPath). Cette vue (qui sera translucide) se superpose à  une seconde vue dans laquelle je positionne une NSTableView (pour mon calendrier).

    dans 1242389632:

    Euh... Je vois mal comment ça pourrait être difficile de sélectionner à  la souris des éléments non graphiques puisqu'ils ne se superposent pas et qu'ils sont dans une fenêtre bien rangées...


    Si, justement, mes vues se superposent. Dés lors, il est impossible de sélectionner à  la souris les objets graphiques (telle ma NSTableView) qui se trouvent dans la vue du dessous.
  • AliGatorAliGator Membre, Modérateur
    02:45 modifié #7
    Je te conseille d'aller lire ce post, qui certes causait d'une discussion sur iPhone, mais se rapproche, dans l'architecture proposée, de ce que te propose psychoh13, à  savoir "une vue et des objets capable de se dessiner eux-même dedans".

    Si on reprend l'idée et ce que je proposais dans l'autre post, le principe est le suivant : une vue unique, dont le drawrect (1) dessine le "fond" (les lignes indiquant les heures et délimitant les colonnes de jours, par exemple) et (2) boucle sur tous tes objets "Tasks" (qui représentent, du point de vue modèle, tes tâches que tu veux justement représenter dans ta vue calendrier), pour dessiner chaque "Task" individuellement. Tu peux pour cette partie avoir une méthode drawTask, qui prend une "Task" en paramètre, et utilise ses propriétés (day, startTime, endTime, color, title, ...) pour la dessiner dans ta vue.

    // concept de code, pas forcément à  prendre à  la lettre<br />-(void)drawRect:(NSRect)rect<br />{<br />&nbsp; [self drawBackgroundGrid];<br />&nbsp; for(CalendarTask* task in tasksList)<br />&nbsp; {<br />&nbsp; &nbsp; [self drawTask:task];<br />&nbsp; }<br />}<br />-(void)drawTask:(CalendarTask*)task<br />{<br />&nbsp; NSRect taskFrame = NSMakeRect(task.dayIndex*columnWidth,task.startTime*hourHeight,columnWidth,(task.endTime-task.startTime)*hourHeight);<br />&nbsp; NSRectFill(taskFrame); // dessiner le &quot;fond&quot; de la task, faudra en réalité choisir la couleur de remplissage avant, l&#39;épaisseur de contour, l&#39;opacité... mais bon c&#39;est juste pour le concept là <br /><br />&nbsp; NSString* title= task.title;<br />&nbsp; [title drawInRect:...]; // dessiner le titre de la tâche par dessus le fond<br />&nbsp; <br />&nbsp; ...<br />}<br />
    
    Et bien sûr quand tu cliques dans ta vue, ce qui va appeler le mouseDown, tu peux tester (en bouclant sur [taskList reverseEnumerator] pour tester de la vue de premier plan (dessiner en dernier) à  la vue d'arrière plan, pour sélectionner la plus en avant en priorité) quelle CalendarTask est sous ton clic de souris un peu sur le même principe (je crois que j'ai aussi expliqué ça dans l'autre post).
  • psychoh13psychoh13 Mothership Developer Membre
    02:45 modifié #8
    dans 1242396306:
    Non, tu n'y es pas, j'ai du mal m'exprimer. Les blocs, j'avais dans l'idée de les dessiner sur une vue (avec NSBezierPath). Cette vue (qui sera translucide) se superpose à  une seconde vue dans laquelle je positionne une NSTableView (pour mon calendrier).


    Déjà , une NSTableView ne t'aidera en rien, si c'est juste pour afficher des lignes une vues personnalisées peut très bien le faire sans avoir besoin d'une NSTableView dont les avantages seraient largement éclipsés par les inconvénients, c'est comme une utilisé un bazooka pour tuer une mouche.

    Ensuite, ces blocs, justement, t'as pas compris ce que je voulais dire, ça risque d'être plus coûteux d'utiliser une vue par bloc plutôt que de créer un petit objet tout simple capable de se dessiner lui-même et à  qui la vue demande de se dessiner...

    dans 1242396306:
    Si, justement, mes vues se superposent. Dés lors, il est impossible de sélectionner à  la souris les objets graphiques (telle ma NSTableView) qui se trouvent dans la vue du dessous.


    Pour la sélection des objets NON-graphique, la souris est amplement suffisante, pour la sélection des objets graphiques, les raccourcis dont j'ai parlé fonctionne...
  • RocouRocou Membre
    02:45 modifié #9
    dans 1242401157:

    Je te conseille d'aller lire ce post, qui certes causait d'une discussion sur iPhone, mais se rapproche, dans l'architecture proposée, de ce que te propose psychoh13, à  savoir "une vue et des objets capable de se dessiner eux-même dedans".

    Si on reprend l'idée et ce que je proposais dans l'autre post, le principe est le suivant : une vue unique, dont le drawrect (1) dessine le "fond" (les lignes indiquant les heures et délimitant les colonnes de jours, par exemple) et (2) boucle sur tous tes objets "Tasks" (qui représentent, du point de vue modèle, tes tâches que tu veux justement représenter dans ta vue calendrier), pour dessiner chaque "Task" individuellement. Tu peux pour cette partie avoir une méthode drawTask, qui prend une "Task" en paramètre, et utilise ses propriétés (day, startTime, endTime, color, title, ...) pour la dessiner dans ta vue.



    AliGator, merci d'être entré dans les détails. J'avais compris où tu voulais en venir mais techniquement, beaucoup de choses me faisaient peur. Maintenant, je sais mieux vers quoi m'orienter.
  • RocouRocou Membre
    02:45 modifié #10
    dans 1242401300:

    Déjà , une NSTableView ne t'aidera en rien, si c'est juste pour afficher des lignes une vues personnalisées peut très bien le faire sans avoir besoin d'une NSTableView dont les avantages seraient largement éclipsés par les inconvénients, c'est comme une utilisé un bazooka pour tuer une mouche.


    Je suis bien conscient de gâcher des ressources en utilisant une NSTableView. Mais les colonnes redimensionnables et les entêtes c'était autant de moins à  gérer à  la main. Comme je le disais à  AliGator, tout ce qui touche au graphisme me fait un peu peur.

    dans 1242401300:

    Ensuite, ces blocs, justement, t'as pas compris ce que je voulais dire, ça risque d'être plus coûteux d'utiliser une vue par bloc plutôt que de créer un petit objet tout simple capable de se dessiner lui-même et à  qui la vue demande de se dessiner...


    Je n'ai jamais eu l'intention d'utiliser une vue par bloc. Par contre, effectivement je n'avais pas compris ton idée de créer un petit objet capable de se dessiner lui-même. Cela complète la piste d'Ali.

    dans 1242401300:

    Pour la sélection des objets NON-graphique, la souris est amplement suffisante, pour la sélection des objets graphiques, les raccourcis dont j'ai parlé fonctionne...


    Pour ma part, rien à  faire, je n'y arrive pas. Mais ça viendra  :)
Connectez-vous ou Inscrivez-vous pour répondre.