DragDropInteractionState.h [plain text]
#pragma once
#if ENABLE(DRAG_SUPPORT) && PLATFORM(IOS)
#import "UIKitSPI.h"
#import <WebCore/DragActions.h>
#import <WebCore/DragData.h>
#import <WebCore/TextIndicator.h>
#import <WebCore/URL.h>
#import <WebCore/WebItemProviderPasteboard.h>
#import <wtf/BlockPtr.h>
#import <wtf/RetainPtr.h>
#import <wtf/Vector.h>
namespace WebCore {
struct DragItem;
}
namespace WebKit {
struct DragSourceState {
WebCore::DragSourceAction action { WebCore::DragSourceActionNone };
CGPoint adjustedOrigin { CGPointZero };
CGRect dragPreviewFrameInRootViewCoordinates { CGRectZero };
RetainPtr<UIImage> image;
std::optional<WebCore::TextIndicatorData> indicatorData;
String linkTitle;
WebCore::URL linkURL;
bool possiblyNeedsDragPreviewUpdate { true };
NSInteger itemIdentifier { 0 };
};
class DragDropInteractionState {
public:
bool anyActiveDragSourceIs(WebCore::DragSourceAction) const;
void prepareForDragSession(id <UIDragSession>, dispatch_block_t completionHandler);
void dragSessionWillBegin();
void stageDragItem(const WebCore::DragItem&, UIImage *);
bool hasStagedDragSource() const;
const DragSourceState& stagedDragSource() const { return m_stagedDragSource.value(); }
enum class DidBecomeActive { No, Yes };
void clearStagedDragSource(DidBecomeActive = DidBecomeActive::No);
UITargetedDragPreview *previewForDragItem(UIDragItem *, UIView *contentView, UIView *previewContainer) const;
void dragSessionWillDelaySetDownAnimation(dispatch_block_t completion);
bool shouldRequestAdditionalItemForDragSession(id <UIDragSession>) const;
void dragSessionWillRequestAdditionalItem(void (^completion)(NSArray <UIDragItem *> *));
void dropSessionDidEnterOrUpdate(id <UIDropSession>, const WebCore::DragData&);
void dropSessionDidExit() { m_dropSession = nil; }
void dropSessionWillPerformDrop() { m_isPerformingDrop = true; }
void dragAndDropSessionsDidEnd();
CGPoint adjustedPositionForDragEnd() const { return m_adjustedPositionForDragEnd; }
bool didBeginDragging() const { return m_didBeginDragging; }
bool isPerformingDrop() const { return m_isPerformingDrop; }
id<UIDragSession> dragSession() const { return m_dragSession.get(); }
id<UIDropSession> dropSession() const { return m_dropSession.get(); }
BlockPtr<void()> takeDragStartCompletionBlock() { return WTFMove(m_dragStartCompletionBlock); }
BlockPtr<void()> takeDragCancelSetDownBlock() { return WTFMove(m_dragCancelSetDownBlock); }
BlockPtr<void(NSArray<UIDragItem *> *)> takeAddDragItemCompletionBlock() { return WTFMove(m_addDragItemCompletionBlock); }
private:
void updatePreviewsForActiveDragSources();
std::optional<DragSourceState> activeDragSourceForItem(UIDragItem *) const;
CGPoint m_lastGlobalPosition { CGPointZero };
CGPoint m_adjustedPositionForDragEnd { CGPointZero };
bool m_didBeginDragging { false };
bool m_isPerformingDrop { false };
RetainPtr<id <UIDragSession>> m_dragSession;
RetainPtr<id <UIDropSession>> m_dropSession;
BlockPtr<void()> m_dragStartCompletionBlock;
BlockPtr<void()> m_dragCancelSetDownBlock;
BlockPtr<void(NSArray<UIDragItem *> *)> m_addDragItemCompletionBlock;
std::optional<DragSourceState> m_stagedDragSource;
Vector<DragSourceState> m_activeDragSources;
};
}
#endif // ENABLE(DRAG_SUPPORT) && PLATFORM(IOS)