]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiToolbar.cpp
do what the FIXME suggested
[lyx.git] / src / frontends / qt4 / GuiToolbar.cpp
index 642773edb8c12c5751b8a6bdba76dd65a51c7da1..ed6277df583dca60083a741d130b6381a8bde518 100644 (file)
@@ -248,22 +248,27 @@ public:
        : QAbstractItemDelegate(parent) {}
        
        ///
-       void paint(QPainter * painter, const QStyleOptionViewItem & option,
-               const QModelIndex &index) const {
+       void paint(QPainter * painter, QStyleOptionViewItem const & option,
+               QModelIndex const & index) const {
                QComboBox * combo = static_cast<QComboBox const *>(parent());
                
                // Draw using the menu item style (this is how QComboBox does it).
                // But for the rich text drawing below we will call it with an
                // empty string, and later then draw over it the real string.
+               painter->save();
                QStyleOptionMenuItem opt = getStyleOption(option, index);
                QString text = underlineFilter(opt.text);
                opt.text = QString();
                painter->eraseRect(option.rect);
-               combo->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, combo);
+               combo->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, combo->view());
+               painter->restore();
+               
+               // don't draw string for separator
+               if (opt.menuItemType == QStyleOptionMenuItem::Separator)
+                       return;
                
                // Draw the rich text.
                painter->save();
-               
                QColor col = opt.palette.text().color();
                if (opt.state & QStyle::State_Selected)
                        col = opt.palette.highlightedText().color();
@@ -273,15 +278,14 @@ public:
                QTextDocument doc;
                doc.setDefaultFont(opt.font);
                doc.setHtml(text);
-               doc.setPageSize(QSize(opt.rect.width() - 20, opt.rect.height()));
-               painter->translate(opt.rect.x() + 20, opt.rect.y() - opt.rect.height());
+               painter->translate(opt.rect.x() + 20, opt.rect.y());
                doc.documentLayout()->draw(painter, context);
                painter->restore();
        }
        
        ///
-       QSize sizeHint(const QStyleOptionViewItem &option,
-               const QModelIndex &index) const {
+       QSize sizeHint(QStyleOptionViewItem const & option,
+               QModelIndex const & index) const {
                QComboBox * combo = static_cast<QComboBox const *>(parent());
 
                QStyleOptionMenuItem opt = getStyleOption(option, index);
@@ -321,8 +325,8 @@ private:
        }
 
        ///
-       QStyleOptionMenuItem getStyleOption(const QStyleOptionViewItem &option,
-               const QModelIndex &index) const
+       QStyleOptionMenuItem getStyleOption(QStyleOptionViewItem const & option,
+               QModelIndex const & index) const
        {
                QComboBox * combo = static_cast<QComboBox const *>(parent());
 
@@ -334,14 +338,18 @@ private:
                        menuOption.state |= QStyle::State_Selected;
                menuOption.checkType = QStyleOptionMenuItem::NonExclusive;
                menuOption.checked = combo->currentIndex() == index.row();
-               menuOption.menuItemType = QStyleOptionMenuItem::Normal;
                menuOption.text = index.model()->data(index, Qt::DisplayRole).toString()
                        .replace(QLatin1Char('&'), QLatin1String("&&"));
+               if (menuOption.text.left(2) == "--")
+                       menuOption.menuItemType = QStyleOptionMenuItem::Separator;
+               else
+                       menuOption.menuItemType = QStyleOptionMenuItem::Normal;
                menuOption.tabWidth = 0;
                menuOption.menuRect = option.rect;
                menuOption.rect = option.rect;
                menuOption.font = combo->font();
                menuOption.fontMetrics = QFontMetrics(menuOption.font);
+               
                return menuOption;
        }
 };
@@ -352,13 +360,13 @@ class GuiFilterProxyModel : public QSortFilterProxyModel
 public:
        ///
        GuiFilterProxyModel(QObject * parent)
-       : QSortFilterProxyModel(parent) {}
+               : QSortFilterProxyModel(parent) {}
 
        ///
        void setCharFilter(QString const & f)
        {
                setFilterRegExp(charFilterRegExp(f));
-               reset();
+               dataChanged(index(0, 0), index(rowCount() - 1, 1));
        }
 
 private:
@@ -418,6 +426,12 @@ void GuiLayoutBox::setFilter(QString const & s)
                if (i.isValid())
                        setCurrentIndex(i.row());
        }
+       
+       // Workaround to resize to content size
+       // FIXME: There must be a better way. The QComboBox::AdjustToContents)
+       //        does not help.
+       if (view()->isVisible())
+               QComboBox::showPopup();
 }
 
 
@@ -427,6 +441,14 @@ void GuiLayoutBox::resetFilter()
 }
 
 
+void GuiLayoutBox::showPopup()
+{
+       resetFilter();
+       owner_.message(_("Enter characters to filter the layout list."));
+       QComboBox::showPopup();
+}
+
+
 bool GuiLayoutBox::eventFilter(QObject * o, QEvent * e)
 {
        if (e->type() != QEvent::KeyPress)
@@ -514,17 +536,24 @@ void GuiLayoutBox::addItemSort(docstring const & item, bool sorted)
                return;
        }
 
-       // find row to insert the item
+       // find row to insert the item, after the separator if it exists
        int i = 1; // skip the Standard layout
-       QString is = model_->item(i, 0)->text();
-       while (is.compare(titem) < 0) {
-               // e.g. --Separator--
-               if (is[0].category() != QChar::Letter_Uppercase)
-                       break;
-               ++i;
-               if (i == end)
-                       break;
-               is = model_->item(i, 0)->text();
+       
+       QList<QStandardItem *> sep = model_->findItems("--", Qt::MatchStartsWith);
+       if (!sep.isEmpty())
+               i = sep.first()->index().row() + 1;
+       if (i < model_->rowCount()) {
+               // find alphabetic position
+               QString is = model_->item(i, 0)->text();
+               while (is.compare(titem) < 0) {
+                       // e.g. --Separator--
+                       if (is.at(0).category() != QChar::Letter_Uppercase)
+                               break;
+                       ++i;
+                       if (i == end)
+                               break;
+                       is = model_->item(i, 0)->text();
+               }
        }
 
        model_->insertRow(i, row);