summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2019-08-15 16:00:45 +0200
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2019-09-03 09:12:50 +0200
commit121887b051150af7490f79402248e92c7d7d0f0a (patch)
tree31cbb6dc4b42e5a7a52bbdf25cff8c4c4b7cc4f5
parenta8aa08498a7a16b40a4559034abb47e37d719ba4 (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.cpp21
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,