136 auto qWindow = QPointer<QWindow>(nativeNodeCreateInfo.window);
137 auto selfRef = QtOhos::makeQThreadSafeRef(
this);
138 auto windowId = QOhosPlatformWindow::fromQWindow(qWindow)->internalWindowId();
140 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(qWindow);
141 bool focusable = !platformWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
143 auto renderFit = nativeNodeCreateInfo.renderFitPolicyHint
144 .andThen(tryMapRenderFitPolicyToArkUi).valueOr(::ARKUI_RENDER_FIT_TOP_LEFT);
147 qGuiApp, &QGuiApplication::focusWindowChanged,
148 this, [
this, qWindow](QWindow *focusedWindow) {
149 if (focusedWindow == qWindow)
153 auto qWindowRef = QtOhos::makeQThreadSafeRef(qWindow.data());
157 if (inputMethodEventHandler ==
nullptr)
158 qOhosReportFatalErrorAndAbort(
"QOhosInputMethodEventHandler is null!");
159 auto imEventHandlerRef = QtOhos::makeQThreadSafeRef(inputMethodEventHandler);
162 m_jsStateData = QtOhos::makeProxyWithJsThreadDeleter(std::make_shared<JsStateData>());
167 if (nativeNodeCreateInfo.optParent.hasValue()) {
168 auto *parentNode = nativeNodeCreateInfo.optParent.value()->m_jsStateData->embeddedWindow.get();
169 optParentDescriptor = ParentDescriptor(*parentNode);
173 .offset = nativeNodeCreateInfo.geometry.topLeft(),
174 .size = nativeNodeCreateInfo.geometry.size(),
175 .xComponentId = QXComponentId::createForRenderXComponent(windowId),
176 .xComponentType = ::ArkUI_XComponentType::ARKUI_XCOMPONENT_TYPE_SURFACE,
177 .focusOnTouch =
false,
178 .focusable = focusable,
179 .optParent = optParentDescriptor,
180 .sizePolicy = QArkUi::QEmbeddedWindowNode::SizePolicy::Points,
181 .renderFit = renderFit,
182 .backgroundColor = nativeNodeCreateInfo.backgroundColor,
185 m_jsStateData->embeddedWindow = QArkUi::QQtEmbeddedWindowNode::createOrFail(createInfo);
186 m_jsStateData->embeddedWindow->setCallbackReceiver(
187 std::make_unique<CallbackReceiver>(
188 m_jsStateData->embeddedWindow->renderXComponent(),
189 qWindowRef, imEventHandlerRef,
190 [selfRef](SurfaceEventType type, ::OHNativeWindow *window, QOhosOptional<QSize> optSurfaceSize) {
191 selfRef.visitInQtThreadIfAlive(
192 [type, window, optSurfaceSize](
auto &self) {
193 self.handleSurfaceEvent(type, window, optSurfaceSize);
197 m_jsStateData->embeddedWindow->setTouchInterceptReceiver(
198 [selfRef, embeddedWindow = m_jsStateData->embeddedWindow.get()](
const ::ArkUI_UIInputEvent *event) {
199 auto eventAction = ::OH_ArkUI_UIInputEvent_GetAction(event);
201 if (eventAction != ::UI_MOUSE_EVENT_ACTION_PRESS && eventAction != ::UI_TOUCH_EVENT_ACTION_DOWN)
204 if (!embeddedWindow->hasNonQtManagedChildren())
207 selfRef.visitInQtThreadIfAlive(
208 [](QNativeNode &node) {
209 Q_EMIT node.externalContentClickDetected();
213 m_jsStateData->embeddedWindow->setAxisEventsHandler(
214 makeQOhosNativeAxisEventHandler(qWindowRef, imEventHandlerRef));
215 m_jsStateData->embeddedWindow->setGesturesHandler(
216 makeQOhosArkUiNativeGesturesHandler(qWindowRef));
217 m_jsStateData->embeddedWindow->setDragEventsHandler(makeQOhosNativeDragEventsHandler(qWindowRef));
218 if (QtOhos::isNativeNodeApiKeyEventsEnabled())
219 m_jsStateData->embeddedWindow->setKeyEventsHandler(makeQOhosNativeKeyEventsHandler(qWindowRef, imEventHandlerRef));
221 auto hoverEventsGenerator = makeQOhosHoverEventsGenerator(qWindowRef, imEventHandlerRef);
222 m_jsStateData->embeddedWindow->setMouseEventsHandler(
223 makeQOhosNativeMouseEventsHandler(qWindowRef, imEventHandlerRef, hoverEventsGenerator));
224 m_jsStateData->embeddedWindow->setHoverEventsHandler(
225 [hoverEventsGenerator](::ArkUI_UIInputEvent *uiInputEvent) {
226 hoverEventsGenerator->handleQOhosHoverEvent(getHoveredStateFromHoverEvent(uiInputEvent));
410 const std::vector<QImage> &images,
const QPointF &hotspot,
411 const QMimeData &mimeData, QOhosConsumer<Qt::DropAction> dropActionConsumer)
413 auto udmfDataFactory = makeUdmfDataFactoryFromQMimeData(mimeData, {});
417 qOhosPrintfDebug(
"%s: starting drag", Q_FUNC_INFO);
419 std::vector<std::shared_ptr<::OH_PixelmapNative>> pixelMaps;
421 images.begin(), images.end(),
std::back_inserter(pixelMaps),
422 &createNativePixelMapFromQImage);
426 QOhosConsumer<Qt::DropAction> dropActionConsumer;
427 std::shared_ptr<
void> startedDragHandle;
429 auto context =
std::make_shared<DragContext>();
430 context->dropActionConsumer =
std::move(dropActionConsumer);
432 auto startedDragHandle = m_jsStateData->embeddedWindow->startDrag(
433 std::move(pixelMaps), hotspot,
435 [context](::ArkUI_DragAndDropInfo *dragAndDropInfo)
mutable {
436 auto dragStatus = QArkUi::callArkUi(
437 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragStatus),
439 qOhosPrintfDebug(
"%s: drag status: %d", Q_FUNC_INFO,
static_cast<
int>(dragStatus));
441 if (dragStatus == ::ARKUI_DRAG_STATUS_ENDED && context) {
442 auto *dragEvent = QArkUi::callArkUiOrFailOnNullResult(
443 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragEvent),
446 ::ArkUI_DragResult dragResult = ::ARKUI_DRAG_RESULT_FAILED;
447 QArkUi::callArkUiOrFailOnErrorResult(
448 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragEvent_GetDragResult),
449 dragEvent, &dragResult);
452 dragResult == ::ARKUI_DRAG_RESULT_SUCCESSFUL
453 ? mapQOhosArkUiDropOperationToQt(
454 getQOhosDragEventDropOperation(dragEvent))
458 "%s: sending drag-end notification: %d / %d",
459 Q_FUNC_INFO,
static_cast<
int>(dragResult),
static_cast<
int>(qtDropAction));
460 QtOhos::invokeInQtThread(
461 [dropActionConsumer = std::move(context->dropActionConsumer), qtDropAction]() {
462 dropActionConsumer(qtDropAction);
467 context->startedDragHandle = startedDragHandle;