* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
* \author John Levon
* \author Jean-Marc Lasgouttes
* \author Angus Leeming
#include "FuncRequest.h"
#include "FuncStatus.h"
#include "Layout.h"
-#include "LyXAction.h"
#include "LyXFunc.h"
#include "LyXRC.h"
#include "Paragraph.h"
#include "support/filetools.h"
#include "support/gettext.h"
#include "support/lstrings.h"
-#include "support/lyxalgo.h" // sorted
#include <QAbstractItemDelegate>
#include <QAbstractTextDocumentLayout>
#include "support/lassert.h"
-#include <map>
-#include <vector>
-
using namespace std;
using namespace lyx::support;
-static void initializeResources()
-{
- static bool initialized = false;
- if (!initialized) {
- Q_INIT_RESOURCE(Resources);
- initialized = true;
- }
-}
-
-
namespace lyx {
namespace frontend {
-namespace {
-
-struct PngMap {
- QString key;
- QString value;
-};
-
-
-bool operator<(PngMap const & lhs, PngMap const & rhs)
-{
- return lhs.key < rhs.key;
-}
-
-
-class CompareKey {
-public:
- CompareKey(QString const & name) : name_(name) {}
- bool operator()(PngMap const & other) const { return other.key == name_; }
-private:
- QString const name_;
-};
-
-
-// this must be sorted alphabetically
-// Upper case comes before lower case
-PngMap sorted_png_map[] = {
- { "Bumpeq", "bumpeq2" },
- { "Cap", "cap2" },
- { "Cup", "cup2" },
- { "Delta", "delta2" },
- { "Downarrow", "downarrow2" },
- { "Gamma", "gamma2" },
- { "Lambda", "lambda2" },
- { "Leftarrow", "leftarrow2" },
- { "Leftrightarrow", "leftrightarrow2" },
- { "Longleftarrow", "longleftarrow2" },
- { "Longleftrightarrow", "longleftrightarrow2" },
- { "Longrightarrow", "longrightarrow2" },
- { "Omega", "omega2" },
- { "Phi", "phi2" },
- { "Pi", "pi2" },
- { "Psi", "psi2" },
- { "Rightarrow", "rightarrow2" },
- { "Sigma", "sigma2" },
- { "Subset", "subset2" },
- { "Supset", "supset2" },
- { "Theta", "theta2" },
- { "Uparrow", "uparrow2" },
- { "Updownarrow", "updownarrow2" },
- { "Upsilon", "upsilon2" },
- { "Vdash", "vdash3" },
- { "Vert", "vert2" },
- { "Xi", "xi2" },
- { "nLeftarrow", "nleftarrow2" },
- { "nLeftrightarrow", "nleftrightarrow2" },
- { "nRightarrow", "nrightarrow2" },
- { "nVDash", "nvdash3" },
- { "nvDash", "nvdash2" },
- { "textrm \\AA", "textrm_AA"},
- { "textrm \\O", "textrm_O"},
- { "vDash", "vdash2" }
-};
-
-size_t const nr_sorted_png_map = sizeof(sorted_png_map) / sizeof(PngMap);
-
-
-QString findPng(QString const & name)
-{
- PngMap const * const begin = sorted_png_map;
- PngMap const * const end = begin + nr_sorted_png_map;
- LASSERT(sorted(begin, end), /**/);
-
- PngMap const * const it = find_if(begin, end, CompareKey(name));
-
- QString png_name;
- if (it != end) {
- png_name = it->value;
- } else {
- png_name = name;
- png_name.replace('_', "underscore");
- png_name.replace(' ', '_');
-
- // This way we can have "math-delim { }" on the toolbar.
- 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(" << name << ")\n"
- << "Looking for math PNG called \"" << png_name << '"');
- return png_name;
-}
-
-} // namespace anon
-
-
-/// return a icon for the given action
-static QIcon getIcon(FuncRequest const & f, bool unknown)
-{
- initializeResources();
- QPixmap pm;
- QString name1;
- QString name2;
- QString path;
- switch (f.action) {
- case LFUN_MATH_INSERT:
- if (!f.argument().empty()) {
- path = "math/";
- name1 = findPng(toqstr(f.argument()).mid(1));
- }
- break;
- case LFUN_MATH_DELIM:
- case LFUN_MATH_BIGDELIM:
- path = "math/";
- name1 = findPng(toqstr(f.argument()));
- break;
- case LFUN_CALL:
- path = "commands/";
- name1 = toqstr(f.argument());
- break;
- default:
- name2 = toqstr(lyxaction.getActionName(f.action));
- name1 = name2;
-
- if (!f.argument().empty()) {
- name1 = name2 + ' ' + toqstr(f.argument());
- name1.replace(' ', '_');
- }
- }
-
- string fullname = libFileSearch("images/" + path, name1, "png").absFilename();
- if (pm.load(toqstr(fullname)))
- return pm;
-
- fullname = libFileSearch("images/" + path, name2, "png").absFilename();
- if (pm.load(toqstr(fullname)))
- return pm;
-
- if (pm.load(":/images/" + path + name1 + ".png"))
- return pm;
-
- if (pm.load(":/images/" + path + name2 + ".png"))
- return pm;
-
- LYXERR(Debug::GUI, "Cannot find icon for command \""
- << lyxaction.getActionName(f.action)
- << '(' << to_utf8(f.argument()) << ")\"");
- if (unknown)
- pm.load(":/images/unknown.png");
-
- return pm;
-}
-
-
/////////////////////////////////////////////////////////////////////
//
// GuiLayoutBox
filterModel_->triggerLayoutChange();
if (!s.isEmpty())
- owner_.message(_("Filtering layouts with \"" + fromqstr(s) + "\". "
- "Press ESC to remove filter."));
+ owner_.message(bformat(_("Filtering layouts with \"%1$s\". "
+ "Press ESC to remove filter."),
+ qstring_to_ucs4(s)));
else
owner_.message(_("Enter characters to filter the layout list."));
}
bool small = size.height() < 20;
setAttribute(Qt::WA_MacSmallSize, small);
setAttribute(Qt::WA_MacNormalSize, !small);
+#else
+ (void)size; // suppress warning
#endif
}
if (!text_class_)
return;
- QString const & name = toqstr((*text_class_)[layout].name());
- if (name == currentText())
+ Layout const & lay = (*text_class_)[layout];
+ QString const newLayout = toqstr(lay.name());
+
+ int const curItem = currentIndex();
+ QModelIndex const mindex =
+ filterModel_->mapToSource(filterModel_->index(curItem, 1));
+ QString const & currentLayout = model_->itemFromIndex(mindex)->text();
+ if (newLayout == currentLayout) {
+ LYXERR(Debug::GUI, "Already had " << newLayout << " selected.");
return;
+ }
- QList<QStandardItem *> r = model_->findItems(name, Qt::MatchExactly, 1);
+ QList<QStandardItem *> r = model_->findItems(newLayout, Qt::MatchExactly, 1);
if (r.empty()) {
- LYXERR0("Trying to select non existent layout type " << name);
+ LYXERR0("Trying to select non existent layout type " << newLayout);
return;
}
void GuiLayoutBox::addItemSort(docstring const & item, docstring const & category,
- bool sorted, bool sortedByCat)
+ bool sorted, bool sortedByCat, bool unknown)
{
QString qitem = toqstr(item);
- QString titem = toqstr(translateIfPossible(item));
+ // FIXME This is wrong for RTL, I'd suppose.
+ QString titem = toqstr(translateIfPossible(item) +
+ (unknown ? _(" (unknown)") : from_ascii("")));
QString qcat = toqstr(translateIfPossible(category));
QList<QStandardItem *> 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());
return;
for (; lit != len; ++lit) {
docstring const & name = lit->name();
- bool const useEmpty = inset_->forceEmptyLayout() || inset_->useEmptyLayout();
+ bool const useEmpty = inset_->forcePlainLayout() || inset_->usePlainLayout();
// if this inset requires the empty layout, we skip the default
// layout
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_ && !useEmpty)
+ if (name == text_class_->plainLayoutName() && inset_ && !useEmpty)
+ continue;
+ // obsoleted layouts are skipped as well
+ if (!lit->obsoleted_by().empty())
continue;
- addItemSort(name, lit->category(), lyxrc.sort_layouts, lyxrc.group_layouts);
+ addItemSort(name, lit->category(), lyxrc.sort_layouts,
+ lyxrc.group_layouts, lit->isUnknown());
}
set(owner_.view()->cursor().innerParagraph().layout().name());
// needed to recalculate size hint
hide();
setMinimumWidth(sizeHint().width());
- setEnabled(!buffer->isReadonly());
+ setEnabled(!buffer->isReadonly() &&
+ lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled());
show();
}
{
// get selection
QModelIndex mindex = filterModel_->mapToSource(filterModel_->index(index, 1));
- docstring const layoutName =
- qstring_to_ucs4(model_->itemFromIndex(mindex)->text());
-
+ docstring layoutName = qstring_to_ucs4(model_->itemFromIndex(mindex)->text());
owner_.setFocus();
if (!text_class_) {
resetFilter();
return;
}
- lyxerr << "ERROR (layoutSelected): layout not found!" << endl;
+ LYXERR0("ERROR (layoutSelected): layout " << layoutName << " not found!");
}
GuiToolbar::GuiToolbar(ToolbarInfo const & tbinfo, GuiView & owner)
- : QToolBar(qt_(tbinfo.gui_name), &owner), visibility_(0),
+ : QToolBar(toqstr(tbinfo.gui_name), &owner), visibility_(0),
allowauto_(false), owner_(owner), layout_(0), command_buffer_(0),
tbinfo_(tbinfo), filled_(false)
{
+ setIconSize(owner.iconSize());
+ connect(&owner, SIGNAL(iconSizeChanged(QSize)), this,
+ SLOT(setIconSize(QSize)));
+
// Toolbar dragging is allowed.
setMovable(true);
// This is used by QMainWindow::restoreState for proper main window state
// restauration.
setObjectName(toqstr(tbinfo.name));
-
restoreSession();
}
ToolbarInfo const * tbinfo = guiApp->toolbars().info(tbitem_.name_);
if (!tbinfo) {
- lyxerr << "Unknown toolbar " << tbitem_.name_ << endl;
+ LYXERR0("Unknown toolbar " << tbitem_.name_);
return;
}
IconPalette * panel = new IconPalette(this);
connect(bar_, SIGNAL(updated()), m, SLOT(updateParent()));
ToolbarInfo const * tbinfo = guiApp->toolbars().info(tbitem_.name_);
if (!tbinfo) {
- lyxerr << "Unknown toolbar " << tbitem_.name_ << endl;
+ LYXERR0("Unknown toolbar " << tbitem_.name_);
return;
}
ToolbarInfo::item_iterator it = tbinfo->items.begin();
QString GuiToolbar::sessionKey() const
{
- return "view-" + QString::number(owner_.id()) + "/" + objectName();
+ return "views/" + QString::number(owner_.id()) + "/" + objectName();
}
} // namespace frontend
} // namespace lyx
-#include "GuiToolbar_moc.cpp"
+#include "moc_GuiToolbar.cpp"