メニューはとりあえず.xibに置いて、NSTableViewのmenuとつないだ。サブクラス化したNSTableViewの-(NSMenu*)menuForEvent:(NSEvent *)eventで動的に生成する方法もやってみたが、これだとクリックされた行が「半選択状態」にならないため(自前で処理する必要があるんでしょうな)却下。
「半選択状態」とはすなわち
Finderでいう上の画像のような状態。クリックによって選択された行がいくつあっても、右クリックした行が四角で囲まれたハイライト状態になる。この状態で「ゴミ箱へ移動する」を選択したら、当然「半選択状態」の行に対する処理になる。
自分でこれを実装しようとして、はたと考え込んでしまった。「半選択状態」ってSelectionでもhighlightでもないようなんだけど・・・。
NSTableViewで選択されている行は、[arrayController selectionIndexes]とか[tableView selectedRowIndexes]とかでNSIndexSetで取得できる。でも半選択状態の行はこのindexには含まれていない。
デベロッパドキュメントを読み返すと、[tableView clickedRow]っていうメソッドがちゃんとあった。これが「現在クリックされた行」のindexを返す。というわけで、このindexが選択行のNSIndexSetに含まれていなければ、右クリックされた「半選択状態」だとわかるので、以下のように書いてみた。
- (IBAction)moveToTrash:(id)sender { NSUInteger clickedIndex=[tableView clickedRow]; NSIndexSet *indexes=nil; if([[arrayController selectionIndexes] containsIndex:clickedIndex]){ indexes=[arrayController selectionIndexes]; } else{ indexes=[NSIndexSet indexSetWithIndex:clickedIndex]; } NSArray* selectFile=[fileArray objectsAtIndexes:indexes]; NSMutableArray* selectURL=[NSMutableArray arrayWithCapacity:[selectFile count]]; for(DirectoryFile* item in selectFile){ [selectURL addObject:[item fileURL]]; } [[NSWorkspace sharedWorkspace] recycleURLs:selectURL completionHandler:^(NSDictionary *newURLs, NSError *error) { if (error != nil) { NSLog(@"error: %@", error); } else { NSLog(@"newURLs: %@", newURLs); } }]; [fileArray removeObjectsAtIndexes:indexes]; [arrayController rearrangeObjects]; }[[NSWorkspace sharedWorkspace] recycleURLsの使い方はxcatsan師匠のこのアーティクルからのいただき。いつものことなんだけど、CocoaのAPIがらみでググるとだいたいxcatsan師匠の過去記事に行き着いてそれが正解、ということが多いなあ。
0 件のコメント:
コメントを投稿