tcellのマウスイベントについて見ていきます。
今回はマウスを動かしたら、


画面左下に現在のマウスの位置を出力するようにしてみます。
上記内容を踏まえた上で、tcellで画面左下に文字列を出力するで作成したコードを改修してみます。
package main
import (
"fmt"
"github.com/gdamore/tcell/v2"
)
func main() {
screen, err := tcell.NewScreen()
if err != nil {
panic(err)
}
if err := screen.Init(); err != nil {
panic(err)
}
defer screen.Fini()
screen.EnableMouse()
_, h := screen.Size()
// Escでプログラムを終了できるようにする
for {
screen.Show()
ev := screen.PollEvent() // イベントを取得する
switch ev := ev.(type) {
case *tcell.EventKey:
switch ev.Key() { // 何のキーが押されたか?を調べる
case tcell.KeyEscape: // ESCキーが押されたら終了する
return
}
case *tcell.EventMouse:
x, y := ev.Position()
// fmt.Sprintfのフォーマットでスペースを三個程追加しています
pos := fmt.Sprintf("x:%d y:%d ", x, y)
screen.SetContent(0, h-1, '・', []rune(pos), tcell.StyleDefault)
}
}
}
マウスイベントを許可するには、
screen.EnableMouse()
を必ず挿入しておく必要があります。
for {
screen.Show()
ev := screen.PollEvent() // イベントを取得する
switch ev := ev.(type) {
/** 途中省略 **/
case *tcell.EventMouse:
x, y := ev.Position()
pos := fmt.Sprintf("x:%d y:%d ", x, y)
screen.SetContent(0, h-1, '・', []rune(pos), tcell.StyleDefault)
}
}
イベントループ内で*tcell.EventMouseのイベントを受け付けるようにしています。
今回はマウスを動かす度に座標が更新されるようになっています。
case *tcell.EventMouse:
x, y := ev.Position()
pos := fmt.Sprintf("x:%d y:%d ", x, y)
screen.SetContent(0, h-1, '・', []rune(pos), tcell.StyleDefault)
}
の箇所を
case *tcell.EventMouse:
switch ev.Buttons() {
case tcell.Button1:
x, y := ev.Position()
pos := fmt.Sprintf("x:%d y:%d ", x, y)
screen.SetContent(0, h-1, '・', []rune(pos), tcell.StyleDefault)
}
}
のように変更することで、マウスの左ボタンをクリックする度に座標が更新されるようになります。
ボタン等のイベントに関してはtcell/TUTORIAL.md at main · gdamore/tcell#Mouse eventsに記載があります。