]> git.lyx.org Git - features.git/commitdiff
Fix perf issues and crash when showing 1'100'000 items (#9968)
authorGuillaume Munch <gm@lyx.org>
Thu, 10 Mar 2016 01:08:51 +0000 (01:08 +0000)
committerGuillaume Munch <gm@lyx.org>
Fri, 11 Mar 2016 01:15:47 +0000 (01:15 +0000)
src/frontends/qt4/GuiSymbols.cpp

index dad021177248fa591ab6fb2792f421ad99a4d340..5032e51e74efbb287d66778d4c9587220029bddb 100644 (file)
@@ -27,8 +27,6 @@
 #include "support/gettext.h"
 
 #include <QChar>
-#include <QPixmap>
-#include <QListWidgetItem>
 #include <QString>
 
 #include <cstdio>
@@ -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<char_type> 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());
 }