[Obj-C++] 10 Drag & Drop 実装完了(非Xib環境)

[M1 Mac, Big Sur 11.6.5, clang 13.0.0, no Xcode]

非Xcode非Xib環境でのDrag & Drop機能の実装が完了しました。

実行ファイルではViewに入るとカーソルの右下に緑色のプラスマークが出現しますが、appファイルでは下の動画でも分かるように表示されないのが不満です。

これでJavaやC++のようにエディタだけで開発する環境が整いました。

[Obj-C++] 08 Drag & Dropの検証 (非Xib環境)

[M1 Mac, Big Sur 11.6.5, clang 13.0.0, no Xcode]

Drag & Dropに関連するメソッドの動作を確認するため検証用コードを作成しました。

Window全体をドロップ領域のNSViewに設定してもうまくいかないので、オレンジ色の部分をドロップ領域にしました。ファイルのURLをペーストします。

Xcodeを使わずInterfaceBuilderやXibなしでDrag & Dropができるかどうか不安でしたが杞憂でした。

あとはドロップ対象をWindow全体に変更して完了です。

2022/6/8追記:
NSViewの設定がうまくいかなかったのは相対座標ではなく絶対座標でWindowと同じ設定をしていたためでした。

#import "AppDelegate.h"
#import "DragAndDropView.h"
#import "XlsxConvertor.h"

@interface DragAndDropView ()
@property (nonatomic) BOOL highlight; 
@end

@implementation DragAndDropView

// 初期化時の処理
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setHighlight:NO];
        [self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeFileURL]];
    }
    NSLog(@"%s","initWithFrame");
    return self;
}

// Viewの描画処理
- (void)drawRect:(NSRect)rect{
    [super drawRect:rect];
    if (_highlight) {
        [[NSColor systemBlueColor] set];
        [NSBezierPath setDefaultLineWidth: 5];
        [NSBezierPath strokeRect: [self bounds]];
    } else {
        [[NSColor grayColor] set];
        [NSBezierPath setDefaultLineWidth: 1];
        [NSBezierPath strokeRect: [self bounds]];
    }
}

// view内にファイルがドラッグされた時の処理
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
    [self setHighlight:YES];
    [self setNeedsDisplay: YES];
    NSLog(@"%s","draggingEntered");

    return NSDragOperationCopy;
}

// ドラッグ中の処理
- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{
    [self setHighlight:YES];
    [self setNeedsDisplay: YES];

    return NSDragOperationGeneric;
}

// view外に出た時の処理
- (void)draggingExited:(id <NSDraggingInfo>)sender{
    [self setHighlight:NO];
    [self setNeedsDisplay: YES];
    NSLog(@"%s","draggingExited");
}


// ドロップ時の処理
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender {
    [self setHighlight:NO];
    [self setNeedsDisplay: YES];
    NSLog(@"%s","prepareForDragOperation");

    return YES;
}


// ドロップ後の処理
- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender {
    NSLog(@"%s","performDragOperation kaishi");
    NSArray *draggedFilenames = [[sender draggingPasteboard] propertyListForType:NSPasteboardTypeFileURL];
    NSLog(@"draggedFilenames %@",draggedFilenames);

    return YES;
}

// ドロップ完了後の処理
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender{
    NSArray *filePaths = [[sender draggingPasteboard] propertyListForType:NSPasteboardTypeFileURL];
    NSLog(@"filePaths %@",(NSString*)filePaths);

    ConvertorWindow *win= [[ConvertorWindow alloc] init];
    win -> textBox1.stringValue = (NSString*)filePaths;
    NSLog(@"%s","concludeDragOperation kanryou");
}
@end

参考サイト