: 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();
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);
}
///
- 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());
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;
}
};
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:
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();
}
}
+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)
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);