Как я понимаю, что означает следующее? - PullRequest
1 голос
/ 01 мая 2010

Цитируется из здесь :

  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); 
  } 

Хотя есть довольно много строк комментариев, я до сих пор не понимаю логику в этом, особенно, какова связь между mark и позиция полосы прокрутки ?

UPDATE

Кажется, что меня вводит в заблуждение этот комментарий:

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

Скажем, знак scroll имеет влево гравитацию, а не вправо гравитацию, это верно?

Ответы [ 3 ]

1 голос
/ 02 мая 2010

Метки имеют никакого отношения к положению полосы прокрутки.

Они используют метки в этом коде, потому что это удобно для функции gtk_text_view_scroll_mark_onscreen(), которая является ярлыком для вычисленияположение метки, а затем перемещение полос прокрутки в эту позицию.

Метка "end" является меткой правой гравитации, поэтому, когда они добавляют текст в конец буфера, метка остается наконец.Таким образом, когда они scroll_mark_onscreen, вертикальные и горизонтальные полосы прокрутки перемещаются, показывая конец последней строки.

Метка "scroll" покинула гравитацию.Их не волнует, куда они идут, когда они добавляют текст в конец буфера, потому что они сами перемещают его всякий раз, когда добавляют текст, в начало последней строки.Таким образом, когда они scroll_mark_onscreen, перемещаются только вертикальные полосы прокрутки, чтобы отобразить начало последней строки.

Они могли бы иметь правильную гравитацию для обеих меток,потому что их не волнует, куда идет знак "scroll".

Они также могли бы оставить гравитацию для обеих меток и вручную перемещать метку "end" в конец последней строки всякий раз, когда добавляли текст, но они этого не делали, потому что могли получитьтот же эффект автоматически, давая "end" знак правильной гравитации.

0 голосов
/ 01 мая 2010

В функциях прокрутки функция gtk_text_view_scroll_mark_onscreen() используется для позиционирования полосы прокрутки. Похоже, это самый простой способ синхронизировать положение текста и положения полос прокрутки.

Они используют две функции, чтобы иметь возможность эмулировать «показать конец текста» (то есть что-то, что может включать горизонтальное смещение) и «показать последнюю строку текста» (где горизонтальное смещение осталось без изменений).

0 голосов
/ 01 мая 2010

После проверки в документации GTK может показаться, что mark - это какая-то именованная позиция в области прокрутки, в то время как позиция полосы прокрутки находится в том месте, где вы фактически прокручиваете буфер.Если вы более знакомы с HTML, может показаться, что mark немного эквивалентен привязке на веб-странице, на которую можно программно перейти.

...