Почему не перетаскивает внутреннюю часть моей работы приложения Какао? - PullRequest
0 голосов
/ 08 января 2020

Способ работы моего приложения Какао состоит в том, чтобы иметь один подкласс NSView для каждого окна и много внутренних представлений, отображаемых внутри него. Недавно я перешел на использование функции NSD beginDraggingSessionWithItems: event: source для поддержки перетаскивания файловых обещаний во внешние приложения (например, Finder). Но внутренние типы перетаскивания (базовый тип String и Binary blob) необходимо было перенести из dragImage NSWindow. Основное различие, которое я заметил, заключается в том, что beginDraggingSessionWithItems по умолчанию не позволяет мне перетаскивать из моего приложения в мое приложение ... как во внутреннее устройство. Например, если у меня есть элемент управления деревом и я использую DnD для перемещения элементов, он не работает. Перетаскивание файлов в приложение работает. Перетаскивание обещаний из приложения работает. Просто ничего внутри.

Какой-то код. Вот где я создаю двоичный элемент:

auto drag_items = [[NSMutableArray alloc] init];
auto item = [[NSPasteboardItem alloc] init];

NSData *data = [NSData dataWithBytes:myBinary.Data length:myBinary.Length];
[item setData:data forType:dd.Format.NsStr()];

auto drag_item = [[NSDraggingItem alloc] initWithPasteboardWriter:item];
drag_item.draggingFrame = NSMakeRect(floor(position.x), floor(position.y), 32, 32);
[drag_items addObject:drag_item];

и затем начинаю перетаскивание:

NSDraggingSession *session = [myNsWindow.contentView    beginDraggingSessionWithItems:drag_items
                                                        event:myEvent
                                                        source:DragSrc];

Источник перетаскивания реализует draggingSession так:

- (NSDragOperation)draggingSession:(nonnull NSDraggingSession *)session
        sourceOperationMaskForDraggingContext:(NSDraggingContext)context
{
    switch (context)
    {
        case NSDraggingContextOutsideApplication:
            return NSDragOperationCopy;

        case NSDraggingContextWithinApplication:
            return NSDragOperationCopy | NSDragOperationGeneric | NSDragOperationMove;

        default:
            return NSDragOperationNone;
    }
}

Полный исходный код для перетаскивания доступен в GDragAndDrop.mm , а полный целевой код перетаскивания доступен в LCocoaView.mm .

. Я вижу, что ни один из Вызываются целевые методы перетаскивания, и когда я отпускаю мышь, изображение возвращается к источнику перетаскивания.

Я помню, что есть флаг или что-то, что можно установить, чтобы один и тот же вид был одновременно источник и цель. Но по жизни я не могу его найти.

Редактировать: это типы, которые я передаю в регистр NSViewForForDraggedTypes:

"public.item"
"com.apple.NSFilePromiseItemMetaData"
"dyn.ah62d4rv4gu8yc6durvwwa3xmrvw1gkdusm1044pxqyuha2pxsvw0e55bsmwca7d3sbwu"
"com.apple.pasteboard.promised-file-content-type"

Я думаю, что происходит, зарегистрированные типы не соответствовать тому, что я пытаюсь перетащить. То, что я хочу, это подстановочный знак, так что получатель получает все типы, и я делаю фильтрацию на более низком уровне. Вот почему в списке есть «publi c .item», но он работает не так, как я задумал.

1 Ответ

0 голосов
/ 09 января 2020

Таким образом, проблема была в том, что представление не было зарегистрировано для типа, который я перетаскивал. Я думал, что «publi c .item» подойдет всем для разных типов, поэтому не имеет значения, что я тащу. Но это работает, только если тип, который вы перетаскиваете CONFORMS в 'publi c .item', и в моем случае я не экспортировал UTI для этого типа перетаскивания. Так что между моим типом перетаскивания и 'publi c .item' не было никакой связи.

Вот как я определил UTI: enter image description here

Как только я это сделал что я могу перетащить узел вокруг в моем приложении.

...