14class QOhosAxisEventHandler
final :
public std::enable_shared_from_this<QOhosAxisEventHandler>
18 QtOhos::QThreadSafeRef<QWindow> qWindowRef,
19 QtOhos::QThreadSafeRef<QOhosInputMethodEventHandler> imEventHandlerRef);
25 QtOhos::QThreadSafeRef<QWindow> m_qWindowRef;
26 QtOhos::QThreadSafeRef<QOhosInputMethodEventHandler> m_imEventHandlerRef;
28 std::optional<QPointF> m_localPosition;
29 std::optional<QPointF> m_globalPosition;
30 std::optional<
std::int32_t> m_wheelScrollLines;
35 switch (arkUiAxisEventAction) {
36 case UI_AXIS_EVENT_ACTION_NONE:
37 return Qt::NoScrollPhase;
38 case UI_AXIS_EVENT_ACTION_BEGIN:
39 return Qt::ScrollBegin;
40 case UI_AXIS_EVENT_ACTION_UPDATE:
41 return Qt::ScrollUpdate;
42 case UI_AXIS_EVENT_ACTION_END:
44 case UI_AXIS_EVENT_ACTION_CANCEL:
48 qOhosReportFatalErrorAndAbort(
49 "Received unsupported UI_AXIS_EVENT_ACTION: %d", arkUiAxisEventAction);
55 case ::ARKUI_COASTING_AXIS_EVENT_PHASE_NONE:
56 return Qt::NoScrollPhase;
57 case ::ARKUI_COASTING_AXIS_EVENT_PHASE_BEGIN:
58 return Qt::ScrollBegin;
59 case ::ARKUI_COASTING_AXIS_EVENT_PHASE_UPDATE:
60 return Qt::ScrollMomentum;
61 case ::ARKUI_COASTING_AXIS_EVENT_PHASE_END:
65 qOhosReportFatalErrorAndAbort(
"Received unsupported ArkUI_CoastingAxisEventPhase: %d", phase);
78 auto eventTimestamp = OH_ArkUI_UIInputEvent_GetEventTime(event);
79 auto localPosition = QArkUi::getPointerEventLocalPosition(event);
80 auto globalPosition = QArkUi::getPointerEventGlobalPosition(event);
81 double horizontalAxisValue = OH_ArkUI_AxisEvent_GetHorizontalAxisValue(event);
82 double verticalAxisValue = OH_ArkUI_AxisEvent_GetVerticalAxisValue(event);
83 auto eventToolType = OH_ArkUI_UIInputEvent_GetToolType(event);
84 auto eventAxisAction = OH_ArkUI_AxisEvent_GetAxisAction(event);
85 std::int32_t wheelScrollLines;
86 wheelScrollLines = OH_ArkUI_AxisEvent_GetScrollStep(event);
88 const auto totalScale = OH_ArkUI_AxisEvent_GetPinchAxisScaleValue(event);
90 if (qFuzzyIsNull(horizontalAxisValue) && qFuzzyIsNull(verticalAxisValue) && !qFuzzyIsNull(totalScale))
93 m_localPosition = localPosition;
94 m_globalPosition = globalPosition;
95 m_wheelScrollLines = wheelScrollLines;
98 .timestamp = eventTimestamp,
99 .localPoint = localPosition,
100 .globalPoint = globalPosition,
101 .horizontalValue = horizontalAxisValue,
102 .verticalValue = verticalAxisValue,
103 .eventToolType = eventToolType,
104 .scrollPhase = convertArkUiAxisEventActionToQtScrollPhase(eventAxisAction),
105 .wheelScrollLines = wheelScrollLines,
106 .modifiers = readKeyModifiersFromOhosUiInputEvent(event),
109 auto weakSelf = QtOhos::makeWeakPtr(shared_from_this());
110 m_imEventHandlerRef.visitInQtThreadIfAlive(
111 [weakSelf, ohosWheelEvent, qWindowRef = m_qWindowRef](
auto &eventHandler) {
112 auto sharedSelf = weakSelf.lock();
116 eventHandler.onMouseWheelEvent(ohosWheelEvent, qWindowRef.data());
122 if (!m_localPosition.has_value() || !m_globalPosition.has_value() || !m_wheelScrollLines.has_value()) {
124 "%s: Cannot create wheel event - incomplete data, ignoring coasting event.", Q_FUNC_INFO);
128 auto *coastingAxisEvent =
QArkUi::callArkUi(
129 Q_OHOS_NAMED_FUNC(::OH_ArkUI_UIInputEvent_GetCoastingAxisEvent), event);
130 auto eventTime =
QArkUi::callArkUi(
131 Q_OHOS_NAMED_FUNC(::OH_ArkUI_CoastingAxisEvent_GetEventTime), coastingAxisEvent);
132 auto phase =
QArkUi::callArkUi(
133 Q_OHOS_NAMED_FUNC(::OH_ArkUI_CoastingAxisEvent_GetPhase), coastingAxisEvent);
134 auto delta = QPointF(
135 QArkUi::callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_CoastingAxisEvent_GetDeltaX), coastingAxisEvent),
136 QArkUi::callArkUi(Q_OHOS_NAMED_FUNC(::OH_ArkUI_CoastingAxisEvent_GetDeltaY), coastingAxisEvent));
138 const QFlags<OhosKeyboardModifier> coastingAxisEventModifiersFallback = {};
141 .timestamp = eventTime,
142 .localPoint = m_localPosition.value(),
143 .globalPoint = m_globalPosition.value(),
144 .horizontalValue = delta.x(),
145 .verticalValue = delta.y(),
146 .eventToolType = ::UI_INPUT_EVENT_TOOL_TYPE_TOUCHPAD,
147 .scrollPhase = convertArkUiCoastingAxisEventActionToQtScrollPhase(phase),
148 .wheelScrollLines = m_wheelScrollLines.value(),
149 .modifiers = coastingAxisEventModifiersFallback,
152 auto weakSelf = QtOhos::makeWeakPtr(shared_from_this());
153 m_imEventHandlerRef.visitInQtThreadIfAlive(
154 [weakSelf, ohosWheelEvent, qWindowRef = m_qWindowRef](
auto &eventHandler) {
155 auto sharedSelf = weakSelf.lock();
156 QWindow *qWindow = qWindowRef.data();
157 if (!sharedSelf || qWindow ==
nullptr)
160 eventHandler.onMouseWheelEvent(ohosWheelEvent, qWindow);
167 QtOhos::QThreadSafeRef<QWindow> qWindowRef,
168 QtOhos::QThreadSafeRef<QOhosInputMethodEventHandler> imEventHandlerRef)
170 auto handler = std::make_shared<QOhosAxisEventHandler>(qWindowRef, imEventHandlerRef);
171 return [handler](QOhosAxisEventType eventType, ::ArkUI_UIInputEvent *inputEvent) {
173 case QOhosAxisEventType::AxisEvent:
174 handler->handleUiAxisEvent(inputEvent);
176 case QOhosAxisEventType::CoastingAxisEvent:
177 handler->handleUiCoastingAxisEvent(inputEvent);