範囲選択履歴は続く。
今回はメニューで履歴を選んだときの動作を実装する。どのメニューが選ばれたかは #setTag を使って NSMenuItemにインデックス値を紐づけておき、選択時に #tag で取り出す。
ThinButtonBar.m
NSInteger idx = 0;
for (NSString* title in list) {
item = [[[NSMenuItem alloc] initWithTitle:title
action:@selector(selectMenuItem:)
keyEquivalent:@""] autorelease];
[item setTag:idx++];
[item setRepresentedObject:tag_number];
[menu addItem:item];
}
tag_number はボタンの種類、すなわち範囲選択履歴が押されていることを表す。
選択されたらデリゲート先へ selectMenuAtTag:atIndex: を投げる。
- (void)selectMenuItem:(NSMenuItem *)menu_item
{
[_delegate performSelector:@selector(selectMenuAtTag:atIndex:)
withObject:[menu_item representedObject]
withObject:[NSNumber numberWithInt:[menu_item tag]]];
}
で、受け取ったら範囲を変更する。この時アンドゥ処理の為の準備を他の処理同様に行っておく。
SelectionHandler.m
-(void)selectMenuAtTag:(NSNumber*)tag atIndex:(NSNumber*)index
{
NSSize size;
switch ([tag intValue]) {
case TAG_SELECTION_HISTORY:
size = [_selection_history sizeAtIndex:[index intValue]];
[_selection_history setSize:size];
NSRect frame = _rect;
frame.size = size;
CaptureView* view = [_capture_controller view];
NSUndoManager* undoManager = [view undoManager];
[[undoManager prepareWithInvocationTarget:self]
setRubberBandFrame:_rect];
[undoManager setActionName:NSLocalizedString(@"UndoResizeSelection", @"")];
[self setRubberBandFrame:frame];
break;
default:
break;
}
}
これで履歴を選択した時に範囲の大きさが変わる。Undoも効く。
なお履歴に何もない場合には「なし」を表示する。
これはタイトルだけの NSMenuItemを1つ用意してやれば良い。ポップアップメニューは賢くてメソッドが存在しない(nil)の場合はメニュー項目をディゼーブルにしてくれる。
if (idx == 0) {
[menu insertItemWithTitle:NSLocalizedString(@"SelectionHistoryNone", @"")
action:nil
keyEquivalent:@""
atIndex:0];
}
- - - -
残りは履歴の永続化(UserDefaults)だな。