]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiToolbar.cpp
Compil fix.
[lyx.git] / src / frontends / qt4 / GuiToolbar.cpp
index dda821ceb2438da70fc48a68a8174b738d13a2a3..6fc2d1ae7912ac43b3f9ca496a6fe88778f5630a 100644 (file)
 
 #include <config.h>
 
-#include "GuiView.h"
-#include "GuiCommandBuffer.h"
 #include "GuiToolbar.h"
-#include "LyXAction.h"
+
 #include "Action.h"
-#include "qt_helpers.h"
+#include "GuiApplication.h"
+#include "GuiCommandBuffer.h"
+#include "GuiView.h"
+#include "IconPalette.h"
 #include "InsertTableWidget.h"
+#include "qt_helpers.h"
+#include "Toolbars.h"
 
 #include "Buffer.h"
 #include "BufferParams.h"
 #include "Cursor.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
-#include "IconPalette.h"
 #include "Layout.h"
+#include "LyXAction.h"
 #include "LyXFunc.h"
 #include "LyXRC.h"
 #include "Paragraph.h"
 #include "TextClass.h"
-#include "ToolbarBackend.h"
 
 #include "support/debug.h"
 #include "support/filetools.h"
 #include <QListView>
 #include <QPainter>
 #include <QPixmap>
+#include <QSettings>
 #include <QSortFilterProxyModel>
 #include <QStandardItem>
 #include <QStandardItemModel>
+#include <QString>
 #include <QTextDocument>
 #include <QTextFrame>
 #include <QToolBar>
 #include <QToolButton>
 #include <QVariant>
 
-#include <boost/assert.hpp>
+#include "support/lassert.h"
 
 #include <map>
 #include <vector>
@@ -108,6 +112,8 @@ private:
 };
 
 
+// this must be sorted alphabetically
+// Upper case comes before lower case
 PngMap sorted_png_map[] = {
        { "Bumpeq", "bumpeq2" },
        { "Cap", "cap2" },
@@ -134,6 +140,7 @@ PngMap sorted_png_map[] = {
        { "Updownarrow", "updownarrow2" },
        { "Upsilon", "upsilon2" },
        { "Vdash", "vdash3" },
+       { "Vert", "vert2" },
        { "Xi", "xi2" },
        { "nLeftarrow", "nleftarrow2" },
        { "nLeftrightarrow", "nleftrightarrow2" },
@@ -152,7 +159,7 @@ 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));
 
@@ -178,8 +185,8 @@ QString findPng(QString const & name)
                png_name.replace('!', "negthinspace");
        }
 
-       LYXERR(Debug::GUI, "findPng(" << fromqstr(name) << ")\n"
-               << "Looking for math PNG called \"" << fromqstr(png_name) << '"');
+       LYXERR(Debug::GUI, "findPng(" << name << ")\n"
+               << "Looking for math PNG called \"" << png_name << '"');
        return png_name;
 }
 
@@ -431,7 +438,7 @@ private:
                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>";
@@ -526,7 +533,7 @@ void GuiLayoutBox::setFilter(QString const & s)
                // 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.
-               BOOST_ASSERT(!inShowPopup_);
+               LASSERT(!inShowPopup_, /**/);
                inShowPopup_ = true;
                QComboBox::showPopup();
                inShowPopup_ = false;
@@ -596,7 +603,7 @@ void GuiLayoutBox::showPopup()
 
        // call QComboBox::showPopup. But set the inShowPopup_ flag to switch on
        // the hack in the item delegate to make space for the headers.
-       BOOST_ASSERT(!inShowPopup_);
+       LASSERT(!inShowPopup_, /**/);
        inShowPopup_ = true;
        QComboBox::showPopup();
        inShowPopup_ = false;
@@ -680,8 +687,7 @@ void GuiLayoutBox::set(docstring const & layout)
 
        QList<QStandardItem *> r = model_->findItems(name, Qt::MatchExactly, 1);
        if (r.empty()) {
-               lyxerr << "Trying to select non existent layout type "
-                       << fromqstr(name) << endl;
+               LYXERR0("Trying to select non existent layout type " << name);
                return;
        }
 
@@ -735,7 +741,7 @@ void GuiLayoutBox::addItemSort(docstring const & item, docstring const & categor
        if (i < end) {
                // find alphabetic position
                while (i != end
-                      && model_->item(i, 0)->text().compare(titem) < 0 
+                      && model_->item(i, 0)->text().localeAwareCompare(titem) < 0 
                       && (!sortedByCat || model_->item(i, 2)->text() == qcat))
                        ++i;
        }
@@ -773,16 +779,16 @@ void GuiLayoutBox::updateContents(bool reset)
        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, lit->category(), lyxrc.sort_layouts, lyxrc.group_layouts);
        }
@@ -835,8 +841,8 @@ void GuiLayoutBox::selected(int index)
 
 
 GuiToolbar::GuiToolbar(ToolbarInfo const & tbinfo, GuiView & owner)
-       : QToolBar(qt_(tbinfo.gui_name), &owner), owner_(owner),
-         layout_(0), command_buffer_(0)
+       : QToolBar(qt_(tbinfo.gui_name), &owner), visibility_(0),
+         allowauto_(false), owner_(owner), layout_(0), command_buffer_(0)
 {
        // give visual separation between adjacent toolbars
        addSeparator();
@@ -844,10 +850,22 @@ GuiToolbar::GuiToolbar(ToolbarInfo const & tbinfo, GuiView & owner)
        // TODO: save toolbar position
        setMovable(true);
 
+       //
+       setObjectName(toqstr(tbinfo.name));
+
        ToolbarInfo::item_iterator it = tbinfo.items.begin();
        ToolbarInfo::item_iterator end = tbinfo.items.end();
        for (; it != end; ++it)
                add(*it);
+       
+       restoreSession();
+}
+
+
+void GuiToolbar::setVisibility(int visibility)
+{
+       visibility_ = visibility;
+       allowauto_ = visibility_ >= Toolbars::MATH;
 }
 
 
@@ -878,8 +896,7 @@ public:
                connect(bar_, SIGNAL(iconSizeChanged(QSize)),
                        this, SLOT(setIconSize(QSize)));
                setCheckable(true);
-               ToolbarInfo const * tbinfo = 
-                       toolbarbackend.getDefinedToolbarInfo(tbitem_.name_);
+               ToolbarInfo const * tbinfo = guiApp->toolbars().info(tbitem_.name_);
                if (tbinfo)
                        // use the icon of first action for the toolbar button
                        setIcon(getIcon(tbinfo->items.begin()->func_, true));
@@ -894,8 +911,7 @@ public:
 
                initialized_ = true;
 
-               ToolbarInfo const * tbinfo = 
-                       toolbarbackend.getDefinedToolbarInfo(tbitem_.name_);
+               ToolbarInfo const * tbinfo = guiApp->toolbars().info(tbitem_.name_);
                if (!tbinfo) {
                        lyxerr << "Unknown toolbar " << tbitem_.name_ << endl;
                        return;
@@ -949,8 +965,7 @@ public:
                m->setWindowTitle(label);
                m->setTearOffEnabled(true);
                connect(bar_, SIGNAL(updated()), m, SLOT(updateParent()));
-               ToolbarInfo const * tbinfo = 
-                       toolbarbackend.getDefinedToolbarInfo(tbitem_.name_);
+               ToolbarInfo const * tbinfo = guiApp->toolbars().info(tbitem_.name_);
                if (!tbinfo) {
                        lyxerr << "Unknown toolbar " << tbitem_.name_ << endl;
                        return;
@@ -1019,42 +1034,21 @@ void GuiToolbar::add(ToolbarItem const & item)
 }
 
 
-void GuiToolbar::saveInfo(ToolbarSection::ToolbarInfo & tbinfo)
+void GuiToolbar::update(bool in_math, bool in_table, bool in_review, 
+       bool in_mathmacrotemplate)
 {
-       // if tbinfo.state == auto *do not* set on/off
-       if (tbinfo.state != ToolbarSection::ToolbarInfo::AUTO) {
-               if (GuiToolbar::isVisible())
-                       tbinfo.state = ToolbarSection::ToolbarInfo::ON;
-               else
-                       tbinfo.state = ToolbarSection::ToolbarInfo::OFF;
+       if (visibility_ & Toolbars::AUTO) {
+               bool show_it = in_math && (visibility_ & Toolbars::MATH)
+                       || in_table && (visibility_ & Toolbars::TABLE)
+                       || in_review && (visibility_ & Toolbars::REVIEW)
+                       || in_mathmacrotemplate && (visibility_ & Toolbars::MATHMACROTEMPLATE);
+               setVisible(show_it);
        }
-       //
-       // no need to save it here.
-       Qt::ToolBarArea loc = owner_.toolBarArea(this);
-
-       if (loc == Qt::TopToolBarArea)
-               tbinfo.location = ToolbarSection::ToolbarInfo::TOP;
-       else if (loc == Qt::BottomToolBarArea)
-               tbinfo.location = ToolbarSection::ToolbarInfo::BOTTOM;
-       else if (loc == Qt::RightToolBarArea)
-               tbinfo.location = ToolbarSection::ToolbarInfo::RIGHT;
-       else if (loc == Qt::LeftToolBarArea)
-               tbinfo.location = ToolbarSection::ToolbarInfo::LEFT;
-       else
-               tbinfo.location = ToolbarSection::ToolbarInfo::NOTSET;
-
-       // save toolbar position. They are not used to restore toolbar position
-       // now because move(x,y) does not work for toolbar.
-       tbinfo.posx = pos().x();
-       tbinfo.posy = pos().y();
-}
-
 
-void GuiToolbar::updateContents()
-{
        // update visible toolbars only
        if (!isVisible())
                return;
+
        // This is a speed bottleneck because this is called on every keypress
        // and update calls getStatus, which copies the cursor at least two times
        for (int i = 0; i < actions_.size(); ++i)
@@ -1068,6 +1062,58 @@ void GuiToolbar::updateContents()
 }
 
 
+QString GuiToolbar::sessionKey() const
+{
+       return "view-" + QString::number(owner_.id()) + "/" + objectName();
+}
+
+
+void GuiToolbar::saveSession() const
+{
+       QSettings settings;
+       settings.setValue(sessionKey() + "/visibility", visibility_);
+}
+
+
+void GuiToolbar::restoreSession()
+{
+       QSettings settings;
+       setVisibility(settings.value(sessionKey() + "/visibility").toInt());
+}
+
+
+void GuiToolbar::toggle()
+{
+       docstring state;
+       if (allowauto_) {
+               if (!(visibility_ & Toolbars::AUTO)) {
+                       visibility_ |= Toolbars::AUTO;
+                       hide();
+                       state = _("auto");
+               } else {
+                       visibility_ &= ~Toolbars::AUTO;
+                       if (isVisible()) {
+                               hide();
+                               state = _("off");
+                       } else {
+                               show();
+                               state = _("on");
+                       }
+               }
+       } else {
+               if (isVisible()) {
+                       hide();
+                       state = _("off");
+               } else {
+                       show();
+                       state = _("on");
+               }
+       }
+
+       owner_.message(bformat(_("Toolbar \"%1$s\" state set to %2$s"),
+               qstring_to_ucs4(windowTitle()), state));
+}
+
 } // namespace frontend
 } // namespace lyx