diff options
Diffstat (limited to 'src/widgets/accessible')
-rw-r--r-- | src/widgets/accessible/itemviews.cpp | 10 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidget.cpp | 16 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidgets.cpp | 80 | ||||
-rw-r--r-- | src/widgets/accessible/simplewidgets.cpp | 4 |
4 files changed, 75 insertions, 35 deletions
diff --git a/src/widgets/accessible/itemviews.cpp b/src/widgets/accessible/itemviews.cpp index 1b724c9a17..a7c1c75066 100644 --- a/src/widgets/accessible/itemviews.cpp +++ b/src/widgets/accessible/itemviews.cpp @@ -132,7 +132,7 @@ QAccessibleInterface *QAccessibleTable::cellAt(int row, int column) const return 0; Q_ASSERT(role() != QAccessible::Tree); QModelIndex index = view()->model()->index(row, column, view()->rootIndex()); - if (!index.isValid()) { + if (Q_UNLIKELY(!index.isValid())) { qWarning() << "QAccessibleTable::cellAt: invalid index: " << index << " for " << view(); return 0; } @@ -505,7 +505,7 @@ QAccessibleInterface *QAccessibleTable::child(int logicalIndex) const if (!iface) { QModelIndex index = view()->model()->index(row, column, view()->rootIndex()); - if (!index.isValid()) { + if (Q_UNLIKELY(!index.isValid())) { qWarning() << "QAccessibleTable::child: Invalid index at: " << row << column; return 0; } @@ -666,7 +666,7 @@ QModelIndex QAccessibleTree::indexFromLogical(int row, int column) const return QModelIndex(); const QTreeView *treeView = qobject_cast<const QTreeView*>(view()); - if ((row < 0) || (column < 0) || (treeView->d_func()->viewItems.count() <= row)) { + if (Q_UNLIKELY(row < 0 || column < 0 || treeView->d_func()->viewItems.count() <= row)) { qWarning() << "QAccessibleTree::indexFromLogical: invalid index: " << row << column << " for " << treeView; return QModelIndex(); } @@ -776,7 +776,7 @@ int QAccessibleTree::indexOfChild(const QAccessibleInterface *iface) const QAccessibleInterface *QAccessibleTree::cellAt(int row, int column) const { QModelIndex index = indexFromLogical(row, column); - if (!index.isValid()) { + if (Q_UNLIKELY(!index.isValid())) { qWarning() << "Requested invalid tree cell: " << row << column; return 0; } @@ -835,7 +835,7 @@ bool QAccessibleTree::selectRow(int row) QAccessibleTableCell::QAccessibleTableCell(QAbstractItemView *view_, const QModelIndex &index_, QAccessible::Role role_) : /* QAccessibleSimpleEditableTextInterface(this), */ view(view_), m_index(index_), m_role(role_) { - if (!index_.isValid()) + if (Q_UNLIKELY(!index_.isValid())) qWarning() << "QAccessibleTableCell::QAccessibleTableCell with invalid index: " << index_; } diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index 3a9422cc26..e540980a14 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -53,10 +53,9 @@ QT_BEGIN_NAMESPACE static QList<QWidget*> childWidgets(const QWidget *widget) { - QList<QObject*> list = widget->children(); QList<QWidget*> widgets; - for (int i = 0; i < list.size(); ++i) { - QWidget *w = qobject_cast<QWidget *>(list.at(i)); + for (QObject *o : widget->children()) { + QWidget *w = qobject_cast<QWidget *>(o); if (w && !w->isWindow() && !qobject_cast<QFocusFrame*>(w) #if !defined(QT_NO_MENU) @@ -77,9 +76,8 @@ static QString buddyString(const QWidget *widget) if (!parent) return QString(); #ifndef QT_NO_SHORTCUT - QObjectList ol = parent->children(); - for (int i = 0; i < ol.size(); ++i) { - QLabel *label = qobject_cast<QLabel*>(ol.at(i)); + for (QObject *o : parent->children()) { + QLabel *label = qobject_cast<QLabel*>(o); if (label && label->buddy() == widget) return label->text(); } @@ -274,7 +272,7 @@ public: void QAccessibleWidget::addControllingSignal(const QString &signal) { QByteArray s = QMetaObject::normalizedSignature(signal.toLatin1()); - if (object()->metaObject()->indexOfSignal(s) < 0) + if (Q_UNLIKELY(object()->metaObject()->indexOfSignal(s) < 0)) qWarning("Signal %s unknown in %s", s.constData(), object()->metaObject()->className()); d->primarySignals << QLatin1String(s); } @@ -302,8 +300,8 @@ QAccessibleWidget::relations(QAccessible::Relation match /*= QAccessible::AllRel // ideally we would go through all objects and check, but that // will be too expensive const QList<QWidget*> kids = childWidgets(parent); - for (int i = 0; i < kids.count(); ++i) { - if (QLabel *labelSibling = qobject_cast<QLabel*>(kids.at(i))) { + for (QWidget *kid : kids) { + if (QLabel *labelSibling = qobject_cast<QLabel*>(kid)) { if (labelSibling->buddy() == widget()) { QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(labelSibling); rels.append(qMakePair(iface, rel)); diff --git a/src/widgets/accessible/qaccessiblewidgets.cpp b/src/widgets/accessible/qaccessiblewidgets.cpp index adf908b821..83ea83a922 100644 --- a/src/widgets/accessible/qaccessiblewidgets.cpp +++ b/src/widgets/accessible/qaccessiblewidgets.cpp @@ -71,10 +71,9 @@ QList<QWidget*> childWidgets(const QWidget *widget) { if (widget == 0) return QList<QWidget*>(); - QList<QObject*> list = widget->children(); QList<QWidget*> widgets; - for (int i = 0; i < list.size(); ++i) { - QWidget *w = qobject_cast<QWidget *>(list.at(i)); + for (QObject *o : widget->children()) { + QWidget *w = qobject_cast<QWidget *>(o); if (!w) continue; QString objectName = w->objectName(); @@ -282,7 +281,7 @@ void QAccessibleTextEdit::scrollToSubstring(int startIndex, int endIndex) r.y() + edit->verticalScrollBar()->value()); // E V I L, but ensureVisible is not public - if (!QMetaObject::invokeMethod(edit, "_q_ensureVisible", Q_ARG(QRectF, r))) + if (Q_UNLIKELY(!QMetaObject::invokeMethod(edit, "_q_ensureVisible", Q_ARG(QRectF, r)))) qWarning("AccessibleTextEdit::scrollToSubstring failed!"); } @@ -708,6 +707,53 @@ int QAccessibleTextWidget::selectionCount() const return textCursor().hasSelection() ? 1 : 0; } +namespace { +/*! + \internal + \brief Helper class for AttributeFormatter + + This class is returned from AttributeFormatter's indexing operator to act + as a proxy for the following assignment. + + It uses perfect forwarding in its assignment operator to amend the RHS + with the formatting of the key, using QStringBuilder. Consequently, the + RHS can be anything that QStringBuilder supports. +*/ +class AttributeFormatterRef { + QString &string; + const char *key; + friend class AttributeFormatter; + AttributeFormatterRef(QString &string, const char *key) : string(string), key(key) {} +public: + template <typename RHS> + void operator=(RHS &&rhs) + { string += QLatin1String(key) + QLatin1Char(':') + std::forward<RHS>(rhs) + QLatin1Char(';'); } +}; + +/*! + \internal + \brief Small string-builder class that supports a map-like API to serialize key-value pairs. + \code + AttributeFormatter attrs; + attrs["foo"] = QLatinString("hello") + world + QLatin1Char('!'); + \endcode + The key type is always \c{const char*}, and the right-hand-side can + be any QStringBuilder expression. + + Breaking it down, this class provides the indexing operator, stores + the key in an instance of, and then returns, AttributeFormatterRef, + which is the class that provides the assignment part of the operation. +*/ +class AttributeFormatter { + QString string; +public: + AttributeFormatterRef operator[](const char *key) + { return AttributeFormatterRef(string, key); } + + QString toFormatted() const { return string; } +}; +} // unnamed namespace + QString QAccessibleTextWidget::attributes(int offset, int *startOffset, int *endOffset) const { /* The list of attributes can be found at: @@ -767,8 +813,10 @@ QString QAccessibleTextWidget::attributes(int offset, int *startOffset, int *end QTextBlockFormat blockFormat = cursor.blockFormat(); - QMap<QByteArray, QString> attrs; - QString family = charFormat.font().family(); + const QFont charFormatFont = charFormat.font(); + + AttributeFormatter attrs; + QString family = charFormatFont.family(); if (!family.isEmpty()) { family = family.replace('\\',QStringLiteral("\\\\")); family = family.replace(':',QStringLiteral("\\:")); @@ -779,18 +827,18 @@ QString QAccessibleTextWidget::attributes(int offset, int *startOffset, int *end attrs["font-family"] = QString::fromLatin1("\"%1\"").arg(family); } - int fontSize = int(charFormat.font().pointSize()); + int fontSize = int(charFormatFont.pointSize()); if (fontSize) attrs["font-size"] = QString::fromLatin1("%1pt").arg(fontSize); //Different weight values are not handled - attrs["font-weight"] = QString::fromLatin1(charFormat.font().weight() > QFont::Normal ? "bold" : "normal"); + attrs["font-weight"] = QString::fromLatin1(charFormatFont.weight() > QFont::Normal ? "bold" : "normal"); - QFont::Style style = charFormat.font().style(); + QFont::Style style = charFormatFont.style(); attrs["font-style"] = QString::fromLatin1((style == QFont::StyleItalic) ? "italic" : ((style == QFont::StyleOblique) ? "oblique": "normal")); QTextCharFormat::UnderlineStyle underlineStyle = charFormat.underlineStyle(); - if (underlineStyle == QTextCharFormat::NoUnderline && charFormat.font().underline()) // underline could still be set in the default font + if (underlineStyle == QTextCharFormat::NoUnderline && charFormatFont.underline()) // underline could still be set in the default font underlineStyle = QTextCharFormat::SingleUnderline; QString underlineStyleValue; switch (underlineStyle) { @@ -857,12 +905,7 @@ QString QAccessibleTextWidget::attributes(int offset, int *startOffset, int *end break; } - QString result; - foreach (const QByteArray &attributeName, attrs.keys()) { - result.append(QString::fromLatin1(attributeName)).append(':').append(attrs[attributeName]).append(';'); - } - - return result; + return attrs.toFormatted(); } int QAccessibleTextWidget::cursorPosition() const @@ -1056,10 +1099,9 @@ QAccessibleInterface *QAccessibleMainWindow::childAt(int x, int y) const if (!QRect(gp.x(), gp.y(), w->width(), w->height()).contains(x, y)) return 0; - QWidgetList kids = childWidgets(mainWindow()); + const QWidgetList kids = childWidgets(mainWindow()); QPoint rp = mainWindow()->mapFromGlobal(QPoint(x, y)); - for (int i = 0; i < kids.size(); ++i) { - QWidget *child = kids.at(i); + for (QWidget *child : kids) { if (!child->isWindow() && !child->isHidden() && child->geometry().contains(rp)) { return QAccessible::queryAccessibleInterface(child); } diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp index 065c618cf7..e77839cc12 100644 --- a/src/widgets/accessible/simplewidgets.cpp +++ b/src/widgets/accessible/simplewidgets.cpp @@ -570,8 +570,8 @@ QAccessibleGroupBox::relations(QAccessible::Relation match /* = QAccessible::All if ((match & QAccessible::Labelled) && (!groupBox()->title().isEmpty())) { const QList<QWidget*> kids = childWidgets(widget()); - for (int i = 0; i < kids.count(); ++i) { - QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kids.at(i)); + for (QWidget *kid : kids) { + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kid); if (iface) rels.append(qMakePair(iface, QAccessible::Relation(QAccessible::Labelled))); } |