マウスオーバーでアイコンの表示・非表示を制御するとちらちらして少々うっとおしい。そこで選択された時のみアイコンを表示するようにする。
mouseMoved: の中でマウス下の画像をチェックしていたがそれが不要になった。画像が選択されている (_selected_item != nil)の時だけマウスの位置をチェックするようにする。
WorkView.m
- (void)mouseMoved:(NSEvent *)theEvent
{
if (_selected_item == nil) {
return;
}
NSPoint cp = [self convertPoint:[theEvent locationInWindow] fromView:nil];
if ([_icon inRectAtPoint:cp]) {
[_icon setState:2];
} else {
[_icon setState:1];
}
[self setNeedsDisplayInRect:[_icon frame]];
[self setNeedsDisplay:YES];
}
アイコンの上にマウスがあるかを ItemIcon#inRectAtPoint で判断するだけの処理となる。すっきりした。
これに合わせて mouseDown: の処理も少し書き換える。具体的には、(1)画像選択時にアイコンを左上に表示する (2)画像選択時にアイコンを消す (3)画像をドラッグ中にアイコンの位置も合わせて移動させる。
ソースコード:sp4-11.zip
- - - -
WorkView.m の initWithFrame: 内にあった ItemIconの作成を今回 awakeFromNibへ移した。XCode上の実行では問題なかったが、アプリケーションとしてビルドし、別のマシンで実行したところアイコン表示が出ていないことに気がついたので。