はじめてのMorphicチュートリアル(第9回)「マウスイベント」

モーフはそれぞれが個別にマウスイベントやキーボードイベントを受け取ることができる。
今回は、第7回までで紹介したMyMorphでマウスイベントを受け取る方法について学ぶ。
受け取ることのできるマウスイベントは以下の通りである。

  • マウスボタンを押した
  • マウスボタンを離した
  • マウスボタンを押したままマウスカーソルを動かした
  • マウスボタンを押したままである
  • マウスカーソルが領域に入ってきた
  • マウスカーソルが領域から出た

まず、マウスボタンを押した/離したのイベントを受け取る方法について説明する。この2つのイベントを受け取るには、少なくとも2つのメソッドを定義する必要がある。

handlesMouseDown: anEvent
    ^ true

上記のように、handlesMouseDown:メソッドをMyMorphに加えてtrueを返すようにすると、MyMorphの上でマウスボタンを押した時にmouseDown:メッセージが、離した時にmouseUp:メッセージがそれぞれ送られてくる。
ところで、true/falseは真理値と呼ばれYes/Noのような状態を表す。もし、上のメソッドでtrueをfalseで置き換えたらmouseDown:メッセージは送られてこなくなる。
試しに、mouseDown:とmouseUp:をそれぞれ以下のように定義してみよう。

mouseDown: anEvent
    self extent: self extent + (10@10)
mouseUp: anEvent
    self extent: self extent - (10@10)

いつものようにPlaygroundから、MyMorph new openInWorldでMyMorphを生成すると色を変えながら移動するMyMorphが現れる。モーフにマウスを会わせてクリックすると、押している間だけ大きくなり離すと小さくなる。
次にマウスボタンを押し続けた時にイベントを受け取る方法について、ドラッグ動作であれば以下のメソッドを追加すればよい。

mouseMove: anEvent
    self center: anEvent cursorPoint

上の例ならば、MyMorphを掴んで動かすとマウスポインタにあわせてMyMorphも移動するようになる。
マウスボタンを押しっぱなしにした時にイベントを受け取るには、handlesMouseStillDown:メソッドとmouseStillDown:メソッドを実装する。

handlesMouseStillDown: anEvent
    ^ true

handlesMouseStillDown:はhandlesMouseDown:と同様である。trueの前にハット(^)が書かれているのは、このメソッドがメッセージの送り主に対して、その後に続く値(この場合はtrue)を返すことを表している。実際にはどのメッセージも値を返しており、明示しない場合は送り先のオブジェクト自身(この場合はMyMorph)が返されている。

mouseStillDown: evt
    self delete

以前にも述べたように、deleteメッセージを送れば任意のモーフを消すことができる。当然、自分自身にdeleteメッセージを送れば、自分を消すことができる。
長押しの時間を設定するには、mouseStillDownThresholdメソッドを定義して、ミリ秒単位の数値を返す。

mouseStillDownThreshold
    ^ 1000

この例では、長押しでモーフが削除されるようになる。
マウスカーソルがモーフの領域内に入った/出た場合にイベントを受け取るには、handlesMouseOver:メソッドとmouseEnter:メソッド、mouseLeave:メソッドを実装する。

handlesMouseOver: anEvent
    ^ true

handlesMouseDown:やhandlesMouseStillDown:メソッドと同様に、trueを返すことでイベントが送られるようになる。

mouseEnter: anEvent
    self borderColor: Color black.
    self borderWidth: 1

マウスがモーフの領域内に入ると黒い枠線が表示されるようにした。

mouseLeave: anEvent
    self borderWidth: 0

マウスが領域外に出ると枠線が消される。
以上のような形でマウスイベントを取り扱う。
(第9回おわり)