diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2019-08-15 16:00:45 +0200 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2019-09-03 09:12:50 +0200 |
commit | 121887b051150af7490f79402248e92c7d7d0f0a (patch) | |
tree | 31cbb6dc4b42e5a7a52bbdf25cff8c4c4b7cc4f5 | |
parent | a8aa08498a7a16b40a4559034abb47e37d719ba4 (diff) |
distancefieldgenerator: Fix performance when selecting unicode ranges
Calling the QItemSelectionModel::select() function that takes a single
index is extremely slow, so for large ranges that span e.g. 20000 glyphs
in the font, such as some of the Chinese ideographic ranges can, the
application would appear to freeze for many seconds while updating
the selections.
Instead we use the overload that takes a QList.
Metrics: For a specific CJK font, this reduces the time taken when
selecting a single unicode range from 30 seconds to 70 ms.
[ChangeLog][Distance Field Generator] Improved performance when
selecting unicode ranges in large fonts.
Task-number: QTBUG-77499
Change-Id: I7ed9bec26b3cbc7e273d305f270a4a6690a81407
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r-- | src/distancefieldgenerator/mainwindow.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/distancefieldgenerator/mainwindow.cpp b/src/distancefieldgenerator/mainwindow.cpp index ee4475ada..6bc793ede 100644 --- a/src/distancefieldgenerator/mainwindow.cpp +++ b/src/distancefieldgenerator/mainwindow.cpp @@ -693,18 +693,25 @@ void MainWindow::updateUnicodeRanges() this, &MainWindow::updateSelection); + QItemSelection selectedItems; + for (int i = 0; i < ui->lwUnicodeRanges->count(); ++i) { QListWidgetItem *item = ui->lwUnicodeRanges->item(i); - DistanceFieldModel::UnicodeRange unicodeRange = item->data(Qt::UserRole).value<DistanceFieldModel::UnicodeRange>(); - QList<glyph_t> glyphIndexes = m_model->glyphIndexesForUnicodeRange(unicodeRange); - for (glyph_t glyphIndex : glyphIndexes) { - QModelIndex index = m_model->index(glyphIndex); - ui->lvGlyphs->selectionModel()->select(index, item->isSelected() - ? QItemSelectionModel::Select - : QItemSelectionModel::Deselect); + if (item->isSelected()) { + DistanceFieldModel::UnicodeRange unicodeRange = item->data(Qt::UserRole).value<DistanceFieldModel::UnicodeRange>(); + QList<glyph_t> glyphIndexes = m_model->glyphIndexesForUnicodeRange(unicodeRange); + + for (glyph_t glyphIndex : glyphIndexes) { + QModelIndex index = m_model->index(glyphIndex); + selectedItems.select(index, index); + } } } + ui->lvGlyphs->selectionModel()->clearSelection(); + if (!selectedItems.isEmpty()) + ui->lvGlyphs->selectionModel()->select(selectedItems, QItemSelectionModel::Select); + connect(ui->lvGlyphs->selectionModel(), &QItemSelectionModel::selectionChanged, this, |