* \author John Levon
* \author Jean-Marc Lasgouttes
* \author Angus Leeming
+ * \author Stefan Schimanski
* \author Abdelrazak Younes
*
* Full author contact details are available in file CREDITS.
#include <QAbstractTextDocumentLayout>
#include <QApplication>
#include <QComboBox>
+#include <QFontMetrics>
#include <QHeaderView>
+#include <QItemDelegate>
#include <QKeyEvent>
#include <QList>
+#include <QListView>
#include <QPainter>
#include <QPixmap>
#include <QSortFilterProxyModel>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QTextDocument>
+#include <QTextFrame>
#include <QToolBar>
#include <QToolButton>
#include <QVariant>
-#include <boost/assert.hpp>
+#include "support/assert.h"
+
+#include <map>
+#include <vector>
using namespace std;
using namespace lyx::support;
namespace {
struct PngMap {
- char const * key;
- char const * value;
+ QString key;
+ QString value;
};
bool operator<(PngMap const & lhs, PngMap const & rhs)
{
- return strcmp(lhs.key, rhs.key) < 0;
+ return lhs.key < rhs.key;
}
class CompareKey {
public:
- CompareKey(string const & name) : name_(name) {}
+ CompareKey(QString const & name) : name_(name) {}
bool operator()(PngMap const & other) const { return other.key == name_; }
private:
- string const name_;
+ QString const name_;
};
+// this must be sorted alphabetically
+// Upper case comes before lower case
PngMap sorted_png_map[] = {
{ "Bumpeq", "bumpeq2" },
{ "Cap", "cap2" },
{ "Updownarrow", "updownarrow2" },
{ "Upsilon", "upsilon2" },
{ "Vdash", "vdash3" },
+ { "Vert", "vert2" },
{ "Xi", "xi2" },
{ "nLeftarrow", "nleftarrow2" },
{ "nLeftrightarrow", "nleftrightarrow2" },
size_t const nr_sorted_png_map = sizeof(sorted_png_map) / sizeof(PngMap);
-string const find_png(string const & name)
+QString findPng(QString const & name)
{
PngMap const * const begin = sorted_png_map;
PngMap const * const end = begin + nr_sorted_png_map;
- BOOST_ASSERT(sorted(begin, end));
+ LASSERT(sorted(begin, end), /**/);
PngMap const * const it = find_if(begin, end, CompareKey(name));
- string png_name;
- if (it != end)
+ QString png_name;
+ if (it != end) {
png_name = it->value;
- else {
- png_name = subst(name, "_", "underscore");
- png_name = subst(png_name, ' ', '_');
+ } else {
+ png_name = name;
+ png_name.replace('_', "underscore");
+ png_name.replace(' ', '_');
// This way we can have "math-delim { }" on the toolbar.
- png_name = subst(png_name, "(", "lparen");
- png_name = subst(png_name, ")", "rparen");
- png_name = subst(png_name, "[", "lbracket");
- png_name = subst(png_name, "]", "rbracket");
- png_name = subst(png_name, "{", "lbrace");
- png_name = subst(png_name, "}", "rbrace");
- png_name = subst(png_name, "|", "bars");
- png_name = subst(png_name, ",", "thinspace");
- png_name = subst(png_name, ":", "mediumspace");
- png_name = subst(png_name, ";", "thickspace");
- png_name = subst(png_name, "!", "negthinspace");
- }
-
- LYXERR(Debug::GUI, "find_png(" << name << ")\n"
- << "Looking for math PNG called \"" << png_name << '"');
+ png_name.replace('(', "lparen");
+ png_name.replace(')', "rparen");
+ png_name.replace('[', "lbracket");
+ png_name.replace(']', "rbracket");
+ png_name.replace('{', "lbrace");
+ png_name.replace('}', "rbrace");
+ png_name.replace('|', "bars");
+ png_name.replace(',', "thinspace");
+ png_name.replace(':', "mediumspace");
+ png_name.replace(';', "thickspace");
+ png_name.replace('!', "negthinspace");
+ }
+
+ LYXERR(Debug::GUI, "findPng(" << fromqstr(name) << ")\n"
+ << "Looking for math PNG called \"" << fromqstr(png_name) << '"');
return png_name;
}
{
initializeResources();
QPixmap pm;
- string name1;
- string name2;
- string path;
- string fullname;
-
+ QString name1;
+ QString name2;
+ QString path;
switch (f.action) {
case LFUN_MATH_INSERT:
if (!f.argument().empty()) {
path = "math/";
- name1 = find_png(to_utf8(f.argument()).substr(1));
+ name1 = findPng(toqstr(f.argument()).mid(1));
}
break;
case LFUN_MATH_DELIM:
case LFUN_MATH_BIGDELIM:
path = "math/";
- name1 = find_png(to_utf8(f.argument()));
+ name1 = findPng(toqstr(f.argument()));
break;
case LFUN_CALL:
path = "commands/";
- name1 = to_utf8(f.argument());
+ name1 = toqstr(f.argument());
break;
default:
- name2 = lyxaction.getActionName(f.action);
+ name2 = toqstr(lyxaction.getActionName(f.action));
name1 = name2;
- if (!f.argument().empty())
- name1 = subst(name2 + ' ' + to_utf8(f.argument()), ' ', '_');
+ if (!f.argument().empty()) {
+ name1 = name2 + ' ' + toqstr(f.argument());
+ name1.replace(' ', '_');
+ }
}
- fullname = libFileSearch("images/" + path, name1, "png").absFilename();
+ string fullname = libFileSearch("images/" + path, name1, "png").absFilename();
if (pm.load(toqstr(fullname)))
return pm;
if (pm.load(toqstr(fullname)))
return pm;
- if (pm.load(":/images/" + toqstr(path + name1) + ".png"))
+ if (pm.load(":/images/" + path + name1 + ".png"))
return pm;
- if (pm.load(":/images/" + toqstr(path + name2) + ".png"))
+ if (pm.load(":/images/" + path + name2 + ".png"))
return pm;
LYXERR(Debug::GUI, "Cannot find icon for command \""
//
/////////////////////////////////////////////////////////////////////
-class FilterItemDelegate : public QAbstractItemDelegate {
+class LayoutItemDelegate : public QItemDelegate {
public:
///
- explicit FilterItemDelegate(QObject * parent = 0)
- : QAbstractItemDelegate(parent) {}
+ explicit LayoutItemDelegate(QObject * parent = 0)
+ : QItemDelegate(parent)
+ {}
///
void paint(QPainter * painter, QStyleOptionViewItem const & option,
- QModelIndex const & index) const {
- QComboBox * combo = static_cast<QComboBox *>(parent());
- QStyleOptionMenuItem opt = getStyleOption(option, index);
+ QModelIndex const & index) const
+ {
+ QStyleOptionViewItem opt = option;
- // draw line with small text string for separator
- if (opt.text.left(2) == "--") {
- painter->save();
-
- // set options for the separator, the first 8/18 of the vertical space
- QStyleOptionMenuItem sopt = opt;
- sopt.state = QStyle::State_Active | QStyle::State_Enabled;
- sopt.checked = false;
- sopt.text = QString();
- sopt.rect.setHeight(sopt.rect.height() * 8 / 18);
- sopt.menuRect.setHeight(sopt.menuRect.height() * 8 / 18);
-
- // use the style with an empty text to paint the background
- painter->eraseRect(sopt.rect);
- combo->style()->drawControl(QStyle::CE_MenuItem, &sopt, painter, combo->view());
-
- // draw the centered text, small and bold
- QPen pen;
- pen.setWidth(1);
- pen.setColor(sopt.palette.text().color());
- painter->setPen(pen);
- QFont font = sopt.font;
- font.setBold(true);
- font.setWeight(QFont::Black);
- font.setPointSize(sopt.font.pointSize() * 8 / 10);
- painter->setFont(font);
- QRect brect;
- painter->drawText(sopt.rect, Qt::AlignCenter, "Modules", &brect);
-
- // draw the horizontal line
- QColor lcol = sopt.palette.text().color();
- lcol.setAlpha(127);
- painter->setPen(lcol);
- painter->drawLine(sopt.rect.x(), sopt.rect.y() + sopt.rect.height() / 2 ,
- brect.left() - 1, sopt.rect.y() + sopt.rect.height() / 2);
- painter->drawLine(brect.right() + 1, sopt.rect.y() + sopt.rect.height() / 2,
- sopt.rect.right(), sopt.rect.y() + sopt.rect.height() / 2);
+ // default background
+ painter->fillRect(opt.rect, opt.palette.color(QPalette::Base));
+
+ // category header?
+ if (lyxrc.group_layouts) {
+ QSortFilterProxyModel const * model
+ = static_cast<QSortFilterProxyModel const *>(index.model());
- painter->restore();
+ QString stdCat = category(*model->sourceModel(), 0);
+ QString cat = category(*index.model(), index.row());
- // move rect down 8/20 of the original height
- opt.rect.setTop(sopt.rect.y() + sopt.rect.height());
- opt.menuRect = opt.rect;
+ // not the standard layout and not the same as in the previous line?
+ if (stdCat != cat
+ && (index.row() == 0 || cat != category(*index.model(), index.row() - 1))) {
+ painter->save();
+
+ // draw unselected background
+ QStyle::State state = opt.state;
+ opt.state = opt.state & ~QStyle::State_Selected;
+ drawBackground(painter, opt, index);
+ opt.state = state;
+
+ // draw category header
+ drawCategoryHeader(painter, opt,
+ category(*index.model(), index.row()));
+
+ // move rect down below header
+ opt.rect.setTop(opt.rect.top() + headerHeight(opt));
+
+ painter->restore();
+ }
}
- // 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();
- QString text = underlineFilter(opt.text);
- opt.text = QString();
- painter->eraseRect(opt.rect);
- combo->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, combo->view());
- painter->restore();
-
+ QItemDelegate::paint(painter, opt, index);
+ }
+
+ ///
+ void drawDisplay(QPainter * painter, QStyleOptionViewItem const & opt,
+ const QRect & /*rect*/, const QString & text ) const
+ {
+ QString utext = underlineFilter(text);
+
// Draw the rich text.
painter->save();
QColor col = opt.palette.text().color();
QTextDocument doc;
doc.setDefaultFont(opt.font);
- doc.setHtml(text);
- painter->translate(opt.rect.x() + 20, opt.rect.y());
+ doc.setHtml(utext);
+
+ QTextFrameFormat fmt = doc.rootFrame()->frameFormat();
+ fmt.setMargin(0);
+ doc.rootFrame()->setFrameFormat(fmt);
+
+ painter->translate(opt.rect.x() + 5,
+ opt.rect.y() + (opt.rect.height() - opt.fontMetrics.height()) / 2);
doc.documentLayout()->draw(painter, context);
painter->restore();
}
///
- QSize sizeHint(QStyleOptionViewItem const & option,
- QModelIndex const & index) const {
- QComboBox * combo = static_cast<QComboBox *>(parent());
-
- QStyleOptionMenuItem opt = getStyleOption(option, index);
- QSize size = combo->style()->sizeFromContents(
- QStyle::CT_MenuItem, &opt, option.rect.size(), combo);
- if (opt.text.left(2) == "--")
- size.setHeight(size.height() * 18 / 10);
+ QSize sizeHint(QStyleOptionViewItem const & opt,
+ QModelIndex const & index) const
+ {
+ GuiLayoutBox * combo = static_cast<GuiLayoutBox *>(parent());
+ QSortFilterProxyModel const * model
+ = static_cast<QSortFilterProxyModel const *>(index.model());
+ QSize size = QItemDelegate::sizeHint(opt, index);
+
+ /// QComboBox uses the first row height to estimate the
+ /// complete popup height during QComboBox::showPopup().
+ /// To avoid scrolling we have to sneak in space for the headers.
+ /// So we tweak this value accordingly. It's not nice, but the
+ /// only possible way it seems.
+ if (lyxrc.group_layouts && index.row() == 0 && combo->inShowPopup_) {
+ int itemHeight = size.height();
+
+ // we have to show \c cats many headers:
+ unsigned cats = combo->visibleCategories_;
+
+ // and we have \c n items to distribute the needed space over
+ unsigned n = combo->model()->rowCount();
+
+ // so the needed average height (rounded upwards) is:
+ size.setHeight((headerHeight(opt) * cats + itemHeight * n + n - 1) / n);
+ return size;
+ }
+
+ // Add space for the category headers here?
+ // Not for the standard layout though.
+ QString stdCat = category(*model->sourceModel(), 0);
+ QString cat = category(*index.model(), index.row());
+ if (lyxrc.group_layouts && stdCat != cat
+ && (index.row() == 0 || cat != category(*index.model(), index.row() - 1))) {
+ size.setHeight(size.height() + headerHeight(opt));
+ }
+
return size;
}
private:
+ ///
+ QString category(QAbstractItemModel const & model, int row) const
+ {
+ return model.data(model.index(row, 2), Qt::DisplayRole).toString();
+ }
+
+ ///
+ int headerHeight(QStyleOptionViewItem const & opt) const
+ {
+ return opt.fontMetrics.height() * 8 / 10;
+ }
+ ///
+ void drawCategoryHeader(QPainter * painter, QStyleOptionViewItem const & opt,
+ QString const & category) const
+ {
+ // slightly blended color
+ QColor lcol = opt.palette.text().color();
+ lcol.setAlpha(127);
+ painter->setPen(lcol);
+
+ // set 80% scaled, bold font
+ QFont font = opt.font;
+ font.setBold(true);
+ font.setWeight(QFont::Black);
+ font.setPointSize(opt.font.pointSize() * 8 / 10);
+ painter->setFont(font);
+
+ // draw the centered text
+ QFontMetrics fm(font);
+ int w = fm.width(category);
+ int x = opt.rect.x() + (opt.rect.width() - w) / 2;
+ int y = opt.rect.y() + fm.ascent();
+ int left = x;
+ int right = x + w;
+ painter->drawText(x, y, category);
+
+ // the vertical position of the line: middle of lower case chars
+ int ymid = y - 1 - fm.xHeight() / 2; // -1 for the baseline
+
+ // draw the horizontal line
+ if (!category.isEmpty()) {
+ painter->drawLine(opt.rect.x(), ymid, left - 1, ymid);
+ painter->drawLine(right + 1, ymid, opt.rect.right(), ymid);
+ } else
+ painter->drawLine(opt.rect.x(), ymid, opt.rect.right(), ymid);
+ }
+
+
///
QString underlineFilter(QString const & s) const
{
p->filter();
for (int i = 0; i < f.length(); ++i) {
int p = s.indexOf(f[i], lastp + 1, Qt::CaseInsensitive);
- BOOST_ASSERT(p != -1);
+ LASSERT(p != -1, /**/);
if (lastp == p - 1 && lastp != -1) {
// remove ")" and append "x)"
r = r.left(r.length() - 4) + s[p] + "</u>";
r += s.mid(lastp + 1);
return r;
}
-
- ///
- QStyleOptionMenuItem getStyleOption(QStyleOptionViewItem const & option,
- QModelIndex const & index) const
- {
- QComboBox * combo = static_cast<QComboBox *>(parent());
-
- // create the options for a menu item
- QStyleOptionMenuItem menuOption;
- menuOption.palette = QApplication::palette("QMenu");
- menuOption.checkType = QStyleOptionMenuItem::NonExclusive;
- menuOption.state = QStyle::State_Active | QStyle::State_Enabled;
- menuOption.menuRect = option.rect;
- menuOption.rect = option.rect;
- menuOption.font = combo->font();
- menuOption.fontMetrics = QFontMetrics(menuOption.font);
- menuOption.tabWidth = 0;
- menuOption.text = index.model()->data(index, Qt::DisplayRole).toString()
- .replace(QLatin1Char('&'), QLatin1String("&&"));
- menuOption.menuItemType = QStyleOptionMenuItem::Normal;
- if (option.state & QStyle::State_Selected)
- menuOption.state |= QStyle::State_Selected;
- menuOption.checked = combo->currentIndex() == index.row();
-
- return menuOption;
- }
};
-class GuiFilterProxyModel : public QSortFilterProxyModel
-{
+class GuiLayoutFilterModel : public QSortFilterProxyModel {
public:
///
- GuiFilterProxyModel(QObject * parent)
- : QSortFilterProxyModel(parent) {}
-
- ///
- void setCharFilter(QString const & f)
- {
- setFilterRegExp(charFilterRegExp(f));
- dataChanged(index(0, 0), index(rowCount() - 1, 1));
- }
-
-private:
+ GuiLayoutFilterModel(QObject * parent = 0)
+ : QSortFilterProxyModel(parent)
+ {}
+
///
- QString charFilterRegExp(QString const & filter)
+ void triggerLayoutChange()
{
- QString re;
- for (int i = 0; i < filter.length(); ++i)
- re += ".*" + QRegExp::escape(filter[i]);
- return re;
+ layoutAboutToBeChanged();
+ layoutChanged();
}
};
-GuiLayoutBox::GuiLayoutBox(GuiView & owner)
- : owner_(owner), filterItemDelegate_(new FilterItemDelegate(this))
+GuiLayoutBox::GuiLayoutBox(GuiToolbar * bar, GuiView & owner)
+ : owner_(owner), bar_(bar), lastSel_(-1),
+ layoutItemDelegate_(new LayoutItemDelegate(this)),
+ visibleCategories_(0), inShowPopup_(false)
{
setSizeAdjustPolicy(QComboBox::AdjustToContents);
setFocusPolicy(Qt::ClickFocus);
// 1st: translated layout names
// 2nd: raw layout names
model_ = new QStandardItemModel(0, 2, this);
- filterModel_ = new GuiFilterProxyModel(this);
+ filterModel_ = new GuiLayoutFilterModel(this);
filterModel_->setSourceModel(model_);
- filterModel_->setDynamicSortFilter(true);
- filterModel_->setFilterCaseSensitivity(Qt::CaseInsensitive);
setModel(filterModel_);
// for the filtering we have to intercept characters
view()->installEventFilter(this);
- view()->setItemDelegateForColumn(0, filterItemDelegate_);
+ view()->setItemDelegateForColumn(0, layoutItemDelegate_);
QObject::connect(this, SIGNAL(activated(int)),
- this, SLOT(selected(int)));
+ this, SLOT(selected(int)));
+ QObject::connect(bar_, SIGNAL(iconSizeChanged(QSize)),
+ this, SLOT(setIconSize(QSize)));
+
owner_.setLayoutDialog(this);
updateContents(true);
}
void GuiLayoutBox::setFilter(QString const & s)
{
+ bool enabled = view()->updatesEnabled();
+ view()->setUpdatesEnabled(false);
+
// remember old selection
int sel = currentIndex();
if (sel != -1)
lastSel_ = filterModel_->mapToSource(filterModel_->index(sel, 0)).row();
filter_ = s;
- filterModel_->setCharFilter(s);
+ filterModel_->setFilterRegExp(charFilterRegExp(filter_));
+ countCategories();
// restore old selection
if (lastSel_ != -1) {
// Workaround to resize to content size
// FIXME: There must be a better way. The QComboBox::AdjustToContents)
// does not help.
- if (view()->isVisible())
+ if (view()->isVisible()) {
+ // call QComboBox::showPopup. But set the inShowPopup_ flag to switch on
+ // the hack in the item delegate to make space for the headers.
+ // We do not call our implementation of showPopup because that
+ // would reset the filter again. This is only needed if the user clicks
+ // on the QComboBox.
+ LASSERT(!inShowPopup_, /**/);
+ inShowPopup_ = true;
QComboBox::showPopup();
+ inShowPopup_ = false;
+
+ // The item delegate hack is off again. So trigger a relayout of the popup.
+ filterModel_->triggerLayoutChange();
+
+ if (!s.isEmpty())
+ owner_.message(_("Filtering layouts with \"" + fromqstr(s) + "\". "
+ "Press ESC to remove filter."));
+ else
+ owner_.message(_("Enter characters to filter the layout list."));
+ }
+
+ view()->setUpdatesEnabled(enabled);
+}
+
+
+void GuiLayoutBox::countCategories()
+{
+ int n = filterModel_->rowCount();
+ visibleCategories_ = 0;
+ if (n == 0 || !lyxrc.group_layouts)
+ return;
+
+ // skip the "Standard" category
+ QString prevCat = model_->index(0, 2).data().toString();
+
+ // count categories
+ for (int i = 0; i < n; ++i) {
+ QString cat = filterModel_->index(i, 2).data().toString();
+ if (cat != prevCat)
+ ++visibleCategories_;
+ prevCat = cat;
+ }
+}
+
+
+QString GuiLayoutBox::charFilterRegExp(QString const & filter)
+{
+ QString re;
+ for (int i = 0; i < filter.length(); ++i) {
+ QChar c = filter[i];
+ if (c.isLower())
+ re += ".*[" + QRegExp::escape(c) + QRegExp::escape(c.toUpper()) + "]";
+ else
+ re += ".*" + QRegExp::escape(c);
+ }
+ return re;
}
void GuiLayoutBox::showPopup()
{
- resetFilter();
owner_.message(_("Enter characters to filter the layout list."));
+
+ bool enabled = view()->updatesEnabled();
+ view()->setUpdatesEnabled(false);
+
+ resetFilter();
+
+ // call QComboBox::showPopup. But set the inShowPopup_ flag to switch on
+ // the hack in the item delegate to make space for the headers.
+ LASSERT(!inShowPopup_, /**/);
+ inShowPopup_ = true;
QComboBox::showPopup();
+ inShowPopup_ = false;
+
+ // The item delegate hack is off again. So trigger a relayout of the popup.
+ filterModel_->triggerLayoutChange();
+
+ view()->setUpdatesEnabled(enabled);
}
return QComboBox::eventFilter(o, e);
}
+
+void GuiLayoutBox::setIconSize(QSize size)
+{
+#ifdef Q_WS_MACX
+ bool small = size.height() < 20;
+ setAttribute(Qt::WA_MacSmallSize, small);
+ setAttribute(Qt::WA_MacNormalSize, !small);
+#endif
+}
+
void GuiLayoutBox::set(docstring const & layout)
{
}
-void GuiLayoutBox::addItemSort(docstring const & item, bool sorted)
+void GuiLayoutBox::addItemSort(docstring const & item, docstring const & category,
+ bool sorted, bool sortedByCat)
{
QString qitem = toqstr(item);
QString titem = toqstr(translateIfPossible(item));
+ QString qcat = toqstr(translateIfPossible(category));
QList<QStandardItem *> row;
row.append(new QStandardItem(titem));
row.append(new QStandardItem(qitem));
+ row.append(new QStandardItem(qcat));
- // the simple unsorted case
+ // the first entry is easy
int const end = model_->rowCount();
- if (!sorted || end < 2 || qitem[0].category() != QChar::Letter_Uppercase) {
+ if (end == 0) {
model_->appendRow(row);
return;
}
- // find row to insert the item, after the separator if it exists
- int i = 1; // skip the Standard layout
+ // find category
+ int i = 0;
+ if (sortedByCat) {
+ while (i < end && model_->item(i, 2)->text() != qcat)
+ ++i;
+ }
+
+ // skip the Standard layout
+ if (i == 0)
+ ++i;
- QList<QStandardItem *> sep = model_->findItems("--", Qt::MatchStartsWith);
- if (!sep.isEmpty())
- i = sep.first()->index().row() + 1;
- if (i < model_->rowCount()) {
+ // the simple unsorted case
+ if (!sorted) {
+ if (sortedByCat) {
+ // jump to the end of the category group
+ while (i < end && model_->item(i, 2)->text() == qcat)
+ ++i;
+ model_->insertRow(i, row);
+ } else
+ model_->appendRow(row);
+ return;
+ }
+
+ // find row to insert the item, after the separator if it exists
+ if (i < end) {
// 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;
+ while (i != end
+ && model_->item(i, 0)->text().compare(titem) < 0
+ && (!sortedByCat || model_->item(i, 2)->text() == qcat))
++i;
- if (i == end)
- break;
- is = model_->item(i, 0)->text();
- }
}
model_->insertRow(i, row);
// or we've moved from one inset to another
DocumentClass const * text_class = &buffer->params().documentClass();
Inset const * inset =
- owner_.view()->cursor().innerParagraph().inInset();
+ owner_.view()->cursor().innerParagraph().inInset();
if (!reset && text_class_ == text_class && inset_ == inset) {
- set(owner_.view()->cursor().innerParagraph().layout()->name());
+ set(owner_.view()->cursor().innerParagraph().layout().name());
return;
}
model_->clear();
DocumentClass::const_iterator lit = text_class_->begin();
DocumentClass::const_iterator len = text_class_->end();
+
for (; lit != len; ++lit) {
docstring const & name = lit->name();
+ bool const useEmpty = inset_->forceEmptyLayout() || inset_->useEmptyLayout();
// if this inset requires the empty layout, we skip the default
// layout
- if (name == text_class_->defaultLayoutName() && inset &&
- (inset->forceEmptyLayout() || inset->useEmptyLayout()))
+ if (name == text_class_->defaultLayoutName() && inset_ && useEmpty)
continue;
// if it doesn't require the empty layout, we skip it
- if (name == text_class_->emptyLayoutName() && inset &&
- !inset->forceEmptyLayout() && !inset->useEmptyLayout())
+ if (name == text_class_->emptyLayoutName() && inset_ && !useEmpty)
continue;
- addItemSort(name, lyxrc.sort_layouts);
+ addItemSort(name, lit->category(), lyxrc.sort_layouts, lyxrc.group_layouts);
}
- set(owner_.view()->cursor().innerParagraph().layout()->name());
-
+ set(owner_.view()->cursor().innerParagraph().layout().name());
+ countCategories();
+
// needed to recalculate size hint
hide();
setMinimumWidth(sizeHint().width());
Action * GuiToolbar::addItem(ToolbarItem const & item)
{
- Action * act = new Action(owner_,
- getIcon(item.func_, false),
- toqstr(item.label_), item.func_, toqstr(item.label_));
+ Action * act = new Action(&owner_, getIcon(item.func_, false),
+ toqstr(item.label_), item.func_, toqstr(item.label_), this);
actions_.append(act);
return act;
}
addSeparator();
break;
case ToolbarItem::LAYOUTS:
- layout_ = new GuiLayoutBox(owner_);
+ layout_ = new GuiLayoutBox(this, owner_);
addWidget(layout_);
break;
case ToolbarItem::MINIBUFFER: