ページ

2008年5月7日水曜日

RubberBand(その21)矢印キーでの移動(2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

矢印キーの移動を実装した後、Undoオペレーションで挙動がおかしくなった。Command+Z キーを押しただけで Undoが可能になってしまう。どうも Command+Z キーのイベントを keyDown: で処理しているのがまずいようだ。

- (void)keyDown:(NSEvent*)theEvent
{
NSUndoManager* undoManager = [self undoManager];
[[undoManager prepareWithInvocationTarget:self]
setRubberBandFrame:_rect];
:


そりゃそうだ。どんなキーが押されても NSUndoManager へ復元用のメソッドを登録しているからだ。手直しして少しましな形にしよう。
- (void)keyDown:(NSEvent*)theEvent
{
NSRect rect = _rect;
BOOL is_modified = NO;
NSString *action_name;
switch ([theEvent keyCode]) {
case 123:
// left
rect.origin.x += -1.0;
is_modified = YES;
action_name = @"Moved left";
break;
case 124:
// right
rect.origin.x += +1.0;
action_name = @"Moved right";
is_modified = YES;
break;
case 125:
// down
rect.origin.y += +1.0;
action_name = @"Moved down";
is_modified = YES;
break;
case 126:
// up
rect.origin.y += -1.0;
action_name = @"Moved up";
is_modified = YES;
break;
default:
break;
}
if (is_modified) {
NSUndoManager* undoManager = [self undoManager];
[[undoManager prepareWithInvocationTarget:self]
setRubberBandFrame:_rect];
[undoManager setActionName:action_name];
[self setRubberBandFrame:rect];
}
}


これで Undoに関するおかしな挙動はなくなった。