diff options
Diffstat (limited to 'src/plugins/platforms/wasm')
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmaccessibility.cpp | 28 | ||||
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmaccessibility.h | 1 | ||||
| -rw-r--r-- | src/plugins/platforms/wasm/qwasminputcontext.cpp | 65 | ||||
| -rw-r--r-- | src/plugins/platforms/wasm/qwasminputcontext.h | 2 | ||||
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmwindow.cpp | 13 | ||||
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmwindow.h | 2 |
6 files changed, 69 insertions, 42 deletions
diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.cpp b/src/plugins/platforms/wasm/qwasmaccessibility.cpp index 5fa79482217..5807d157636 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.cpp +++ b/src/plugins/platforms/wasm/qwasmaccessibility.cpp @@ -401,6 +401,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac case QAccessible::PageTabList:{ element = document.call<emscripten::val>("createElement", std::string("div")); setAttribute(element, "role", "tablist"); + setHtmlElementOrientation(element, iface); m_elements[iface] = element; @@ -423,6 +424,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element = document.call<emscripten::val>("createElement", std::string("div")); setAttribute(element, "role", "scrollbar"); setAttribute(element, "aria-valuenow", valueString); + setHtmlElementOrientation(element, iface); addEventListener(iface, element, "change"); } break; @@ -437,6 +439,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element = document.call<emscripten::val>("createElement", std::string("div")); setAttribute(element, "role", "toolbar"); setAttribute(element, "title", text.toStdString()); + setHtmlElementOrientation(element, iface); addEventListener(iface, element, "click"); }break; case QAccessible::MenuItem: @@ -453,6 +456,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element = document.call<emscripten::val>("createElement", std::string("div")); setAttribute(element, "role", "menubar"); setAttribute(element, "title", text.toStdString()); + setHtmlElementOrientation(element, iface); m_elements[iface] = element; for (int i = 0; i < iface->childCount(); ++i) { @@ -582,14 +586,7 @@ void QWasmAccessibility::linkToParent(QAccessibleInterface *iface) void QWasmAccessibility::setHtmlElementVisibility(QAccessibleInterface *iface, bool visible) { emscripten::val element = getHtmlElement(iface); - - if (visible) { - setAttribute(element, "aria-hidden", false); - setAttribute(element, "tabindex", ""); - } else { - setAttribute(element, "aria-hidden", true); // aria-hidden mean completely hidden; maybe some sort of soft-hidden should be used. - setAttribute(element, "tabindex", "-1"); - } + setAttribute(element, "aria-hidden", !visible); } void QWasmAccessibility::setHtmlElementGeometry(QAccessibleInterface *iface) @@ -661,6 +658,21 @@ void QWasmAccessibility::setHtmlElementDisabled(QAccessibleInterface *iface) setAttribute(element, "aria-disabled", iface->state().disabled); } +void QWasmAccessibility::setHtmlElementOrientation(emscripten::val element, QAccessibleInterface *iface) +{ + Q_ASSERT(iface); + if (QAccessibleAttributesInterface *attributesIface = iface->attributesInterface()) { + const QVariant orientationVariant = + attributesIface->attributeValue(QAccessible::Attribute::Orientation); + if (orientationVariant.isValid()) { + Q_ASSERT(orientationVariant.canConvert<Qt::Orientation>()); + const Qt::Orientation orientation = orientationVariant.value<Qt::Orientation>(); + const std::string value = orientation == Qt::Horizontal ? "horizontal" : "vertical"; + setAttribute(element, "aria-orientation", value); + } + } +} + void QWasmAccessibility::handleStaticTextUpdate(QAccessibleEvent *event) { switch (event->type()) { diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.h b/src/plugins/platforms/wasm/qwasmaccessibility.h index 26f3e0e9afe..ddbfec918d6 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.h +++ b/src/plugins/platforms/wasm/qwasmaccessibility.h @@ -77,6 +77,7 @@ private: void setHtmlElementTextNameLE(QAccessibleInterface *iface); void setHtmlElementFocus(QAccessibleInterface *iface); void setHtmlElementDisabled(QAccessibleInterface *iface); + void setHtmlElementOrientation(emscripten::val element, QAccessibleInterface *iface); void handleStaticTextUpdate(QAccessibleEvent *event); void handleButtonUpdate(QAccessibleEvent *event); diff --git a/src/plugins/platforms/wasm/qwasminputcontext.cpp b/src/plugins/platforms/wasm/qwasminputcontext.cpp index 18a457198f1..a0546fdc215 100644 --- a/src/plugins/platforms/wasm/qwasminputcontext.cpp +++ b/src/plugins/platforms/wasm/qwasminputcontext.cpp @@ -40,8 +40,23 @@ void QWasmInputContext::inputCallback(emscripten::val event) // Some of them should be implemented here later. qCDebug(qLcQpaWasmInputContext) << Q_FUNC_INFO << "inputType : " << inputTypeString; if (!inputTypeString.compare("deleteContentBackward")) { - QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier); - QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyRelease, Qt::Key_Backspace, Qt::NoModifier); + + QInputMethodQueryEvent queryEvent(Qt::ImQueryAll); + QCoreApplication::sendEvent(m_focusObject, &queryEvent); + int cursorPosition = queryEvent.value(Qt::ImCursorPosition).toInt(); + + int deleteLength = rangesPair.second - rangesPair.first; + int deleteFrom = -1; + if (cursorPosition > rangesPair.first) { + deleteFrom = -(cursorPosition - rangesPair.first); + } + QInputMethodEvent e; + e.setCommitString(QString(), deleteFrom, deleteLength); + QCoreApplication::sendEvent(m_focusObject, &e); + + rangesPair.first = 0; + rangesPair.second = 0; + event.call<void>("stopImmediatePropagation"); return; } else if (!inputTypeString.compare("deleteContentForward")) { @@ -138,41 +153,23 @@ void QWasmInputContext::compositionUpdateCallback(emscripten::val event) const auto compositionStr = QString::fromEcmaString(event["data"]); qCDebug(qLcQpaWasmInputContext) << Q_FUNC_INFO << compositionStr; - // WA for IOS. - // Not sure now because I cannot test it anymore. -// int replaceSize = 0; -// emscripten::val win = emscripten::val::global("window"); -// emscripten::val sel = win.call<emscripten::val>("getSelection"); -// if (!sel.isNull() && !sel.isUndefined() -// && sel["rangeCount"].as<int>() > 0) { -// QInputMethodQueryEvent queryEvent(Qt::ImQueryAll); -// QCoreApplication::sendEvent(QGuiApplication::focusObject(), &queryEvent); -// qCDebug(qLcQpaWasmInputContext) << "Qt surrounding text: " << queryEvent.value(Qt::ImSurroundingText).toString(); -// qCDebug(qLcQpaWasmInputContext) << "Qt current selection: " << queryEvent.value(Qt::ImCurrentSelection).toString(); -// qCDebug(qLcQpaWasmInputContext) << "Qt text before cursor: " << queryEvent.value(Qt::ImTextBeforeCursor).toString(); -// qCDebug(qLcQpaWasmInputContext) << "Qt text after cursor: " << queryEvent.value(Qt::ImTextAfterCursor).toString(); -// -// const QString &selectedStr = QString::fromEcmaString(sel.call<emscripten::val>("toString")); -// const auto &preeditStr = preeditString(); -// qCDebug(qLcQpaWasmInputContext) << "Selection.type : " << sel["type"].as<std::string>(); -// qCDebug(qLcQpaWasmInputContext) << Q_FUNC_INFO << "Selected: " << selectedStr; -// qCDebug(qLcQpaWasmInputContext) << Q_FUNC_INFO << "PreeditString: " << preeditStr; -// if (!sel["type"].as<std::string>().compare("Range")) { -// QString surroundingTextBeforeCursor = queryEvent.value(Qt::ImTextBeforeCursor).toString(); -// if (surroundingTextBeforeCursor.endsWith(selectedStr)) { -// replaceSize = selectedStr.size(); -// qCDebug(qLcQpaWasmInputContext) << Q_FUNC_INFO << "Current Preedit: " << preeditStr << replaceSize; -// } -// } -// emscripten::val range = sel.call<emscripten::val>("getRangeAt", 0); -// qCDebug(qLcQpaWasmInputContext) << "Range.startOffset : " << range["startOffset"].as<int>(); -// qCDebug(qLcQpaWasmInputContext) << "Range.endOffset : " << range["endOffset"].as<int>(); -// } -// -// setPreeditString(compositionStr, replaceSize); setPreeditString(compositionStr, 0); } +void QWasmInputContext::beforeInputCallback(emscripten::val event) +{ + emscripten::val ranges = event.call<emscripten::val>("getTargetRanges"); + + auto length = ranges["length"].as<int>(); + for (auto i = 0; i < length; i++) { + emscripten::val range = ranges[i]; + qCDebug(qLcQpaWasmInputContext) << "startOffset" << range["startOffset"].as<int>(); + qCDebug(qLcQpaWasmInputContext) << "endOffset" << range["endOffset"].as<int>(); + rangesPair.first = range["startOffset"].as<int>(); + rangesPair.second = range["endOffset"].as<int>(); + } +} + QWasmInputContext::QWasmInputContext() { qCDebug(qLcQpaWasmInputContext) << Q_FUNC_INFO; diff --git a/src/plugins/platforms/wasm/qwasminputcontext.h b/src/plugins/platforms/wasm/qwasminputcontext.h index 6d24c7fea0d..97415451b2a 100644 --- a/src/plugins/platforms/wasm/qwasminputcontext.h +++ b/src/plugins/platforms/wasm/qwasminputcontext.h @@ -45,6 +45,7 @@ public: void compositionEndCallback(emscripten::val event); void compositionStartCallback(emscripten::val event); void compositionUpdateCallback(emscripten::val event); + void beforeInputCallback(emscripten::val event); void updateGeometry(); @@ -62,6 +63,7 @@ private: bool m_inputMethodAccepted = false; QObject *m_focusObject = nullptr; emscripten::val m_inputElement = emscripten::val::null(); + QPair<int, int> rangesPair; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index 04f52ac9b1b..e49c1dc49f1 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -110,6 +110,7 @@ QWasmWindow::QWasmWindow(QWindow *w, QWasmDeadKeySupport *deadKeySupport, // Set up m_inputElement, which takes focus whenever a Qt text input UI element has // foucus. m_inputElement["classList"].call<void>("add", emscripten::val("qt-window-input-element")); + m_inputElement.call<void>("setAttribute", std::string("contenteditable"), std::string("true")); m_inputElement.set("type", "text"); m_inputElement["style"].set("position", "absolute"); m_inputElement["style"].set("left", 0); @@ -227,6 +228,8 @@ void QWasmWindow::registerEventHandlers() [this](emscripten::val event){ handleCompositionStartEvent(event); }); m_compositionEndCallback = QWasmEventHandler(m_window, "compositionend", [this](emscripten::val event){ handleCompositionEndEvent(event); }); + m_beforeInputCallback = QWasmEventHandler(m_window, "beforeinput", + [this](emscripten::val event){ handleBeforeInputEvent(event); }); } QWasmWindow::~QWasmWindow() @@ -789,6 +792,16 @@ void QWasmWindow::handleCompositionEndEvent(emscripten::val event) m_focusHelper.set("innerHTML", std::string()); } +void QWasmWindow::handleBeforeInputEvent(emscripten::val event) +{ + qWarning() << Q_FUNC_INFO; + + if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); inputContext->isActive()) + inputContext->beforeInputCallback(event); + // else + // m_focusHelper.set("innerHTML", std::string()); +} + void QWasmWindow::handlePointerEnterLeaveEvent(const PointerEvent &event) { if (processPointerEnterLeave(event)) diff --git a/src/plugins/platforms/wasm/qwasmwindow.h b/src/plugins/platforms/wasm/qwasmwindow.h index cbe930dce89..8e6e5021dcf 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.h +++ b/src/plugins/platforms/wasm/qwasmwindow.h @@ -145,6 +145,7 @@ private: void handleCompositionStartEvent(emscripten::val event); void handleCompositionUpdateEvent(emscripten::val event); void handleCompositionEndEvent(emscripten::val event); + void handleBeforeInputEvent(emscripten::val event); void handlePointerEnterLeaveEvent(const PointerEvent &event); bool processPointerEnterLeave(const PointerEvent &event); @@ -183,6 +184,7 @@ private: QWasmEventHandler m_compositionStartCallback; QWasmEventHandler m_compositionUpdateCallback; QWasmEventHandler m_compositionEndCallback; + QWasmEventHandler m_beforeInputCallback; QWasmEventHandler m_pointerDownCallback; QWasmEventHandler m_pointerMoveCallback; |
