tcellでマウスイベントを追加する

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に記載があります。

同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。