TextView
空でない が割り当てられていますTextBuffer
。
で現在のカーソル位置を取得する方法はTextView
? または、現在のTextIter
カーソルを取得する方法は?
変数「buf」にバインドされた TextBuffer がある場合、カーソルの場所を簡単に知ることができます。insertmark <- textBufferGetInsert buf
カーソル位置を保持する「挿入」マークを取得する便利な方法です。次に、対応する TextIter: が必要ですcursoriter <- textBufferGetIterAtMark buf insertmark
。
これで、関数textIterGetOffset cursoriter
は TextBuffer 内のカーソルの位置を、バッファー内の最初の文字から開始して指定します。textIterGetChar cursoriter
Maybe Char を返すと、その位置にある文字がわかります。
詳細については、Graphics.UI.Gtk.Multiline.TextIter モジュールのドキュメントを参照してください。
iter は、バッファが変更されない限り有効であることに注意してください。バッファの内容が変更された場合は、「挿入」マークを介して iter を再度取得する必要があります。
このコード例は、私のマシンでは問題なく動作します (ただし、テキストを挿入または削除した場合ではなく、矢印キーでカーソルを移動した場合にのみ情報が表示されます)。
module Main where
import Graphics.UI.Gtk
main = do
initGUI
w <- windowNew
windowSetDefaultSize w 640 400
on w objectDestroy mainQuit
h <- vBoxNew False 8
b <- textBufferNew Nothing
t <- textViewNewWithBuffer b
l <- labelNew Nothing
on t moveCursor $ showInfo b l
boxPackStart h t PackGrow 0
boxPackStart h l PackNatural 0
containerAdd w h
widgetShowAll w
mainGUI
showInfo b l movementStep steps flag = do
i <- textBufferGetInsert b >>= textBufferGetIterAtMark b
p <- textIterGetOffset i
c <- textIterGetChar i
let cc = case c of
Nothing -> ""
Just ch -> [ch]
info = "Position: " ++ show p ++ "\nMovement step: " ++ show movementStep ++
"\nSteps: " ++ show steps ++ "\nExtends selection: " ++ show flag ++
"\nCharacter at cursor: " ++ cc
labelSetText l info