diff options
Diffstat (limited to 'src/widgets/widgets/qfontcombobox.cpp')
-rw-r--r-- | src/widgets/widgets/qfontcombobox.cpp | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/src/widgets/widgets/qfontcombobox.cpp b/src/widgets/widgets/qfontcombobox.cpp index a7f31995e1..c80687c7ed 100644 --- a/src/widgets/widgets/qfontcombobox.cpp +++ b/src/widgets/widgets/qfontcombobox.cpp @@ -3,8 +3,9 @@ #include "qfontcombobox.h" +#include <qabstractitemdelegate.h> +#include <qaccessible.h> #include <qstringlistmodel.h> -#include <qitemdelegate.h> #include <qlistview.h> #include <qpainter.h> #include <qevent.h> @@ -12,6 +13,8 @@ #include <private/qcombobox_p.h> #include <qdebug.h> +#include <array> + QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; @@ -100,7 +103,7 @@ static QFontDatabase::WritingSystem writingSystemFromLocale() static QFontDatabase::WritingSystem writingSystemForFont(const QFont &font, bool *hasLatin) { - QList<QFontDatabase::WritingSystem> writingSystems = QFontDatabase::writingSystems(font.families().first()); + QList<QFontDatabase::WritingSystem> writingSystems = QFontDatabase::writingSystems(font.families().constFirst()); // qDebug() << font.families().first() << writingSystems; // this just confuses the algorithm below. Vietnamese is Latin with lots of special chars @@ -147,16 +150,15 @@ static QFontDatabase::WritingSystem writingSystemForFont(const QFont &font, bool class QFontComboBoxPrivate : public QComboBoxPrivate { public: - inline QFontComboBoxPrivate() { filters = QFontComboBox::AllFonts; } - - QFontComboBox::FontFilters filters; + QFontComboBox::FontFilters filters = QFontComboBox::AllFonts; QFont currentFont; QHash<QFontDatabase::WritingSystem, QString> sampleTextForWritingSystem; QHash<QString, QString> sampleTextForFontFamily; QHash<QString, QFont> displayFontForFontFamily; + std::array<QMetaObject::Connection, 2> connections; - void _q_updateModel(); - void _q_currentChanged(const QString &); + void updateModel(); + void currentChanged(const QString &); Q_DECLARE_PUBLIC(QFontComboBox) }; @@ -281,7 +283,7 @@ QSize QFontFamilyDelegate::sizeHint(const QStyleOptionViewItem &option, } -void QFontComboBoxPrivate::_q_updateModel() +void QFontComboBoxPrivate::updateModel() { Q_Q(QFontComboBox); @@ -297,29 +299,28 @@ void QFontComboBoxPrivate::_q_updateModel() QFontFamilyDelegate *delegate = qobject_cast<QFontFamilyDelegate *>(q->view()->itemDelegate()); QFontDatabase::WritingSystem system = delegate ? delegate->writingSystem : QFontDatabase::Any; - QStringList list = QFontDatabase::families(system); + const QStringList list = QFontDatabase::families(system); QStringList result; int offset = 0; QFontInfo fi(currentFont); - for (int i = 0; i < list.size(); ++i) { - if (QFontDatabase::isPrivateFamily(list.at(i))) + for (const auto &family : list) { + if (QFontDatabase::isPrivateFamily(family)) continue; if ((filters & scalableMask) && (filters & scalableMask) != scalableMask) { - if (bool(filters & QFontComboBox::ScalableFonts) != QFontDatabase::isSmoothlyScalable(list.at(i))) + if (bool(filters & QFontComboBox::ScalableFonts) != QFontDatabase::isSmoothlyScalable(family)) continue; } if ((filters & spacingMask) && (filters & spacingMask) != spacingMask) { - if (bool(filters & QFontComboBox::MonospacedFonts) != QFontDatabase::isFixedPitch(list.at(i))) + if (bool(filters & QFontComboBox::MonospacedFonts) != QFontDatabase::isFixedPitch(family)) continue; } - result += list.at(i); - if (list.at(i) == fi.family() || list.at(i).startsWith(fi.family() + " ["_L1)) + result += family; + if (family == fi.family() || family.startsWith(fi.family() + " ["_L1)) offset = result.size() - 1; } - list = result; //we need to block the signals so that the model doesn't emit reset //this prevents the current index from changing @@ -327,10 +328,17 @@ void QFontComboBoxPrivate::_q_updateModel() ///TODO: we should finda way to avoid blocking signals and have a real update of the model { const QSignalBlocker blocker(m); - m->setStringList(list); + m->setStringList(result); + // Since the modelReset signal is blocked the view will not emit an accessibility event + #if QT_CONFIG(accessibility) + if (QAccessible::isActive()) { + QAccessibleTableModelChangeEvent accessibleEvent(q->view(), QAccessibleTableModelChangeEvent::ModelReset); + QAccessible::updateAccessibility(&accessibleEvent); + } + #endif } - if (list.isEmpty()) { + if (result.isEmpty()) { if (currentFont != QFont()) { currentFont = QFont(); emit q->currentFontChanged(currentFont); @@ -341,10 +349,10 @@ void QFontComboBoxPrivate::_q_updateModel() } -void QFontComboBoxPrivate::_q_currentChanged(const QString &text) +void QFontComboBoxPrivate::currentChanged(const QString &text) { Q_Q(QFontComboBox); - QStringList families = currentFont.families(); + const QStringList families = currentFont.families(); if (families.isEmpty() || families.first() != text) { currentFont.setFamilies(QStringList{text}); emit q->currentFontChanged(currentFont); @@ -381,7 +389,7 @@ void QFontComboBoxPrivate::_q_currentChanged(const QString &text) \image windowsvista-fontcombobox.png Screenshot of QFontComboBox on Windows Vista - \sa QComboBox, QFont, QFontInfo, QFontMetrics, QFontDatabase, {Character Map Example} + \sa QComboBox, QFont, QFontInfo, QFontMetrics, QFontDatabase */ /*! @@ -402,11 +410,12 @@ QFontComboBox::QFontComboBox(QWidget *parent) lview->setUniformItemSizes(true); setWritingSystem(QFontDatabase::Any); - connect(this, SIGNAL(currentTextChanged(QString)), - this, SLOT(_q_currentChanged(QString))); - - connect(qApp, SIGNAL(fontDatabaseChanged()), - this, SLOT(_q_updateModel())); + d->connections = { + QObjectPrivate::connect(this, &QFontComboBox::currentTextChanged, + d, &QFontComboBoxPrivate::currentChanged), + QObjectPrivate::connect(qApp, &QGuiApplication::fontDatabaseChanged, + d, &QFontComboBoxPrivate::updateModel), + }; } @@ -415,6 +424,9 @@ QFontComboBox::QFontComboBox(QWidget *parent) */ QFontComboBox::~QFontComboBox() { + Q_D(const QFontComboBox); + for (const QMetaObject::Connection &connection : d->connections) + QObject::disconnect(connection); } /*! @@ -433,7 +445,7 @@ void QFontComboBox::setWritingSystem(QFontDatabase::WritingSystem script) QFontFamilyDelegate *delegate = qobject_cast<QFontFamilyDelegate *>(view()->itemDelegate()); if (delegate) delegate->writingSystem = script; - d->_q_updateModel(); + d->updateModel(); } QFontDatabase::WritingSystem QFontComboBox::writingSystem() const @@ -469,7 +481,7 @@ void QFontComboBox::setFontFilters(FontFilters filters) { Q_D(QFontComboBox); d->filters = filters; - d->_q_updateModel(); + d->updateModel(); } QFontComboBox::FontFilters QFontComboBox::fontFilters() const @@ -495,8 +507,8 @@ void QFontComboBox::setCurrentFont(const QFont &font) Q_D(QFontComboBox); if (font != d->currentFont) { d->currentFont = font; - d->_q_updateModel(); - if (d->currentFont == font) { //else the signal has already be emitted by _q_updateModel + d->updateModel(); + if (d->currentFont == font) { //else the signal has already be emitted by updateModel emit currentFontChanged(d->currentFont); } } |