2010-05-01 3 views
1

Cité de here:Comment est-ce que je comprends ce que cela signifie?

if (to_end) 
    { 
    /* If we want to scroll to the end, including horizontal scrolling, 
    * then we just create a mark with right gravity at the end of the 
    * buffer. It will stay at the end unless explicitely moved with 
    * gtk_text_buffer_move_mark. 
    */ 
    gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE); 

    /* Add scrolling timeout. */ 
    return g_timeout_add (50, (GSourceFunc) scroll_to_end, textview); 
    } 
    else 
    { 
    /* If we want to scroll to the bottom, but not scroll horizontally, 
    * then an end mark won't do the job. Just create a mark so we can 
    * use it with gtk_text_view_scroll_mark_onscreen, we'll position it 
    * explicitely when needed. Use left gravity so the mark stays where 
    * we put it after inserting new text. 
    */ 
    gtk_text_buffer_create_mark (buffer, "scroll", &iter, TRUE); 

    /* Add scrolling timeout. */ 
    return g_timeout_add (100, (GSourceFunc) scroll_to_bottom, textview); 
    } 

Bien qu'il existe assez peu de lignes de commentaires, je ne comprends toujours pas la logique, surtout, quelle est la relation entre une marque et la position de défilement barre?

MISE À JOUR

Il semble que je suis trompé par ce commentaire:

/* and place the mark at iter. the mark will stay there after we 
    * insert some text at the end because it has right gravity. 
    */ 

Say, la marque scroll a laissé gravité, pas droit gravité, est-ce pas?

Répondre

0

Après avoir vérifié dans les documents GTK, il semblerait que mark est une sorte de position nommée dans la zone de défilement, tandis que la position de la barre de défilement est où dans le tampon que vous avez réellement fait défiler. Si vous êtes plus familier avec HTML, il semblerait qu'un mark soit légèrement équivalent à une ancre sur une page Web que vous pouvez faire défiler par programmation.

+0

Mais je ne vois pas la raison pour laquelle 'mark' doit être ** left ** ou ** right ** gravity respectivement. Pouvez-vous expliquer cela? – Gtker

+0

La 'gravité' des contrôles 'mark' où la' marque' est repositionnée si le texte est ajouté sur la même ligne, c'est-à-dire avec la gravité 'gauche' à gauche du texte, tandis que 'droite' mettez-le à la droite du texte. Personnellement, semble être un schéma de nommage assez obtus. – Kitsune

+0

Je ne crois pas. 'mark' semble juste être un point dans le tampon que vous pouvez utiliser pour faire défiler plus tard (ou au moins se souvenir pour une utilisation ultérieure). – Kitsune

0

Dans les fonctions de défilement, la fonction gtk_text_view_scroll_mark_onscreen() est utilisée pour positionner la barre de défilement. Cela semble être le moyen le plus simple de synchroniser une position de texte et la position des barres de défilement. Ils utilisent deux fonctions pour pouvoir émuler "montrer la fin du texte" (ie quelque chose qui pourrait inclure un décalage horizontal) et "montrer la dernière ligne de texte" (où le décalage horizontal est laissé inchangé) .

+0

Quelle est la raison d'utiliser la gravité gauche pour 'scroll_to_end' et la gravité droite pour' scroll_to_bottom'? – Gtker

1

Les marques ont aucune relation quelle qu'elle soit à la position de la barre de défilement.

Ils utilisent des marques dans ce code, car il est pratique pour la fonction gtk_text_view_scroll_mark_onscreen() qui est un raccourci pour calculer la position d'une marque, et en déplaçant les barres de défilement à cette position.

La marque "end" est une marque de gravité droite, donc quand ils ajoutent du texte à la fin du tampon, la marque reste à la fin. De cette façon, quand ils scroll_mark_onscreen, les barres de défilement vertical et horizontal se déplacent, pour afficher la fin de la dernière ligne. La marque "scroll" a la gravité gauche. Ils ne se soucient pas de savoir où il va quand ils ajoutent du texte à la fin du tampon, car ils le déplacent eux-mêmes chaque fois qu'ils ajoutent du texte, au commençant de la dernière ligne. De cette façon, quand ils scroll_mark_onscreen, seules les barres de défilement vertical se déplacent, pour afficher le commençant de la dernière ligne.

Ils auraient tout aussi bien pu avoir la bonne gravité pour les deux marques, car ils ne se soucient pas de savoir où va la marque "scroll". Ils auraient aussi bien pu avoir la gravité pour les deux marques, et ont déplacé manuellement la marque "end" à la fin de la dernière ligne à chaque fois qu'ils ajoutaient du texte, mais ils ne l'ont pas fait, car ils pouvaient obtenir le même effet automatiquement en donnant la marque droite "end".

Questions connexes