From b3bed2927ea41297a8ca641e39112528fc179163 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Thu, 10 Mar 2016 01:08:51 +0000 Subject: [PATCH] Fix perf issues and crash when showing 1'100'000 items (#9968) --- src/frontends/qt4/GuiSymbols.cpp | 54 ++++++++++++++++---------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/frontends/qt4/GuiSymbols.cpp b/src/frontends/qt4/GuiSymbols.cpp index dad0211772..5032e51e74 100644 --- a/src/frontends/qt4/GuiSymbols.cpp +++ b/src/frontends/qt4/GuiSymbols.cpp @@ -27,8 +27,6 @@ #include "support/gettext.h" #include -#include -#include #include #include @@ -169,7 +167,7 @@ QString getBlock(char_type c) && c <= unicode_blocks[lastBlock].end) return qt_(unicode_blocks[lastBlock].name); - // c falls into an uncovered area, but we can guess which + // c falls into an uncovered area, but we can guess which if (c > unicode_blocks[lastBlock].end && c < unicode_blocks[lastBlock + 1].start) return QString(); @@ -195,11 +193,11 @@ QString getBlock(char_type c) // ///////////////////////////////////////////////////////////////////// -class GuiSymbols::Model : public QAbstractItemModel +class GuiSymbols::Model : public QAbstractListModel { public: Model(GuiSymbols * parent) - : QAbstractItemModel(parent) + : QAbstractListModel(parent) {} QModelIndex index(int row, int column, QModelIndex const &) const @@ -217,42 +215,40 @@ public: return symbols_.count(); } - int columnCount(QModelIndex const &) const - { - return 1; - } - QVariant data(QModelIndex const & index, int role) const { static QString const strCharacter = qt_("Character: "); static QString const strCodePoint = qt_("Code Point: "); - char_type c = symbols_.at(index.row()); + char_type c = symbols_.at(index.row()); - if (role == Qt::TextAlignmentRole) + switch (role) { + case Qt::TextAlignmentRole: return QVariant(Qt::AlignCenter); - - if (role == Qt::DisplayRole) + case Qt::DisplayRole: return toqstr(c); - - if (role == Qt::ToolTipRole) { - // FIXME THREAD - static char codeName[10]; - + case Qt::ToolTipRole: { + char codeName[10]; sprintf(codeName, "0x%04x", c); return strCharacter + toqstr(c) + '\n' + strCodePoint + QLatin1String(codeName); } - - //LYXERR0("role: " << role << " row: " << index.row()); - return QVariant(); + case Qt::SizeHintRole: + // Fix many symbols not displaying in combination with + // setUniformItemSizes + return QSize(1000,1000); + default: + return QVariant(); + } } void setSymbols(QList const & symbols) { - QAbstractItemModel::beginResetModel(); + beginResetModel(); + beginInsertRows(QModelIndex(), 0, symbols.size() - 1); symbols_ = symbols; - QAbstractItemModel::endResetModel(); + endInsertRows(); + endResetModel(); } private: @@ -277,16 +273,20 @@ GuiSymbols::GuiSymbols(GuiView & lv) setFocusProxy(symbolsLW); symbolsLW->setViewMode(QListView::IconMode); + symbolsLW->setLayoutMode(QListView::Batched); + symbolsLW->setBatchSize(1000); + symbolsLW->setUniformItemSizes(true); + // increase the display size of the symbols a bit QFont font = symbolsLW->font(); const int size = font.pointSize() + 3; font.setPointSize(size); symbolsLW->setFont(font); QFontMetrics fm(font); - const int cellHeight = fm.height() + 2; + const int cellHeight = fm.height() + 6; // FIXME: using at least cellHeight because of // QFontMetrics::maxWidth() is returning 0 with Qt/Cocoa on Mac OS - const int cellWidth = max(cellHeight, fm.maxWidth() + 2); + const int cellWidth = max(cellHeight - 2, fm.maxWidth() + 4); symbolsLW->setGridSize(QSize(cellWidth, cellHeight)); symbolsLW->setModel(model_); } @@ -387,7 +387,7 @@ void GuiSymbols::on_categoryFilterCB_toggled(bool on) { updateSymbolList(on); if (on) - scrollToItem(categoryCO->currentText()); + scrollToItem(categoryCO->currentText()); } -- 2.39.2