diff options
Diffstat (limited to 'src/gui/accessible/qaccessible.cpp')
| -rw-r--r-- | src/gui/accessible/qaccessible.cpp | 78 |
1 files changed, 41 insertions, 37 deletions
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp index eeb06c535b8..30ebe90da0b 100644 --- a/src/gui/accessible/qaccessible.cpp +++ b/src/gui/accessible/qaccessible.cpp @@ -458,6 +458,9 @@ Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core"); differs from the application's default locale, e.g. for documents or paragraphs within a document that use a language that differs from the application's user interface language. + \value [since 6.11] Orientation value type: \a Qt::Orientation + Orientation of the element. This attribute conceptually matches + the "aria-orientation" property in ARIA. \sa QAccessibleAttributesInterface */ @@ -968,9 +971,21 @@ void QAccessible::updateAccessibility(QAccessibleEvent *event) pfAccessibility->notifyAccessibilityUpdate(event); } +static std::pair<int, int> qAccessibleTextBoundaryHelperHelper(QTextCursor &cursor, + QTextCursor::MoveOperation start, + QTextCursor::MoveOperation end) +{ + std::pair<int, int> result; + cursor.movePosition(start, QTextCursor::MoveAnchor); + result.first = cursor.position(); + cursor.movePosition(end, QTextCursor::KeepAnchor); + result.second = cursor.position(); + return result; +} + /*! \internal - \brief getBoundaries is a helper function to find the accessible text boundaries for QTextCursor based documents. + \brief qAccessibleTextBoundaryHelper is a helper function to find the accessible text boundaries for QTextCursor based documents. \param documentCursor a valid cursor bound to the document (not null). It needs to ba at the position to look for the boundary \param boundaryType the type of boundary to find \return the boundaries as pair @@ -979,32 +994,20 @@ std::pair< int, int > QAccessible::qAccessibleTextBoundaryHelper(const QTextCurs { Q_ASSERT(!offsetCursor.isNull()); - QTextCursor endCursor = offsetCursor; - endCursor.movePosition(QTextCursor::End); - int characterCount = endCursor.position(); - - std::pair<int, int> result; QTextCursor cursor = offsetCursor; switch (boundaryType) { case CharBoundary: - result.first = cursor.position(); - cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); - result.second = cursor.position(); - break; + return qAccessibleTextBoundaryHelperHelper(cursor, QTextCursor::NoMove, + QTextCursor::NextCharacter); case WordBoundary: - cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::MoveAnchor); - result.first = cursor.position(); - cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); - result.second = cursor.position(); - break; + return qAccessibleTextBoundaryHelperHelper(cursor, QTextCursor::StartOfWord, + QTextCursor::EndOfWord); case SentenceBoundary: { // QCursor does not provide functionality to move to next sentence. // We therefore find the current block, then go through the block using // QTextBoundaryFinder and find the sentence the \offset represents - cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); - result.first = cursor.position(); - cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); - result.second = cursor.position(); + std::pair<int, int> result = qAccessibleTextBoundaryHelperHelper( + cursor, QTextCursor::StartOfBlock, QTextCursor::EndOfBlock); QString blockText = cursor.selectedText(); const int offsetWithinBlockText = offsetCursor.position() - result.first; QTextBoundaryFinder sentenceFinder(QTextBoundaryFinder::Sentence, blockText); @@ -1018,25 +1021,19 @@ std::pair< int, int > QAccessible::qAccessibleTextBoundaryHelper(const QTextCurs result.second = result.first + nextBoundary; if (prevBoundary != -1) result.first += prevBoundary; - break; } + return result; + } case LineBoundary: - cursor.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor); - result.first = cursor.position(); - cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); - result.second = cursor.position(); - break; + return qAccessibleTextBoundaryHelperHelper(cursor, QTextCursor::StartOfLine, + QTextCursor::EndOfLine); case ParagraphBoundary: - cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); - result.first = cursor.position(); - cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); - result.second = cursor.position(); - break; + return qAccessibleTextBoundaryHelperHelper(cursor, QTextCursor::StartOfBlock, + QTextCursor::EndOfBlock); case NoBoundary: - result.first = 0; - result.second = characterCount; - break; + return qAccessibleTextBoundaryHelperHelper(cursor, QTextCursor::Start, QTextCursor::End); } - return result; + + Q_UNREACHABLE_RETURN({}); } /*! @@ -2274,13 +2271,16 @@ QString QAccessibleTextInterface::textBeforeOffset(int offset, QAccessible::Text break; } while (boundary.toPreviousBoundary() > 0); Q_ASSERT(boundary.position() >= 0); - *endOffset = boundary.position(); + const int endPos = boundary.position(); while (boundary.toPreviousBoundary() > 0) { if ((boundary.boundaryReasons() & (QTextBoundaryFinder::StartOfItem | QTextBoundaryFinder::EndOfItem))) break; } - Q_ASSERT(boundary.position() >= 0); + if (boundary.position() < 0) + return QString(); + + *endOffset = endPos; *startOffset = boundary.position(); return txt.mid(*startOffset, *endOffset - *startOffset); @@ -2437,13 +2437,17 @@ QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible::TextBoun break; } while (boundary.toPreviousBoundary() > 0); Q_ASSERT(boundary.position() >= 0); - *startOffset = boundary.position(); + const int startPos = boundary.position(); while (boundary.toNextBoundary() < txt.size()) { if ((boundary.boundaryReasons() & (QTextBoundaryFinder::StartOfItem | QTextBoundaryFinder::EndOfItem))) break; + if (boundary.position() == -1) + return QString(); } + Q_ASSERT(boundary.position() <= txt.size()); + *startOffset = startPos; *endOffset = boundary.position(); return txt.mid(*startOffset, *endOffset - *startOffset); |
