]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
Get rid of GuiApplication::view_ids_
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 8ee2a5907e37d7d962e504f68fb68881db0d89ee..63bd54ec63c476087b971512b96e55f65fe1eb06 100644 (file)
@@ -24,6 +24,7 @@
 #include "GuiToolbar.h"
 #include "GuiToolbars.h"
 #include "Menus.h"
+#include "TocModel.h"
 
 #include "qt_helpers.h"
 
@@ -54,7 +55,7 @@
 #include "ToolbarBackend.h"
 #include "version.h"
 
-#include "support/assert.h"
+#include "support/lassert.h"
 #include "support/debug.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
@@ -270,6 +271,9 @@ public:
        Timeout autosave_timeout_;
        /// flag against a race condition due to multiclicks, see bug #1119
        bool in_show_;
+
+       ///
+       TocModels toc_models_;
 };
 
 
@@ -346,6 +350,12 @@ GuiView::~GuiView()
 }
 
 
+TocModels & GuiView::tocModels()
+{
+       return d.toc_models_;
+}
+
+
 void GuiView::setFocus()
 {
        if (d.current_work_area_)
@@ -393,8 +403,8 @@ void GuiView::closeEvent(QCloseEvent * close_event)
                        continue;
                }
 
-               std::vector<int> const & ids = guiApp->viewIds();
-               for (size_type i = 0; i != ids.size(); ++i) {
+               QVector<int> const ids = guiApp->viewIds();
+               for (int i = 0; i != ids.size(); ++i) {
                        if (id_ == ids[i])
                                continue;
                        if (guiApp->view(ids[i]).workArea(*b)) {
@@ -423,7 +433,7 @@ void GuiView::closeEvent(QCloseEvent * close_event)
        // Save toolbars configuration
        if (isFullScreen()) {
                d.toolbars_->toggleFullScreen(!isFullScreen());
-               updateToolbars();
+               updateDialogs();
        }
 
        // Make sure the timer time out will not trigger a statusbar update.
@@ -538,10 +548,11 @@ void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa)
                this, SLOT(updateWindowTitle(GuiWorkArea *)));
        updateWindowTitle(wa);
 
-       // Navigator needs more than a simple update in this case. It needs to be
-       // rebuilt.
        structureChanged();
 
+       // The document settings needs to be reinitialised.
+       updateDialog("document", "");
+
        // Buffer-dependent dialogs must be updated. This is done here because
        // some dialogs require buffer()->text.
        updateDialogs();
@@ -562,6 +573,8 @@ void GuiView::on_lastWorkAreaRemoved()
        }
 #else
        structureChanged();
+       // The document settings needs to be reinitialised.
+       updateDialog("document", "");
        updateDialogs();
 #endif
 }
@@ -616,6 +629,8 @@ bool GuiView::event(QEvent * e)
                        // The document structure, name and dialogs might have
                        // changed in another view.
                        structureChanged();
+                       // The document settings needs to be reinitialised.
+                       updateDialog("document", "");
                        updateDialogs();
                } else {
                        setWindowTitle(qt_("LyX"));
@@ -626,12 +641,23 @@ bool GuiView::event(QEvent * e)
        }
 
        case QEvent::ShortcutOverride: {
+
+               if (isFullScreen() && menuBar()->isHidden()) {
+                       QKeyEvent * ke = static_cast<QKeyEvent*>(e);
+                       // FIXME: we should also try to detect special LyX shortcut such as
+                       // Alt-P and Alt-M. Right now there is a hack in
+                       // GuiWorkArea::processKeySym() that hides again the menubar for
+                       // those cases.
+                       if (ke->modifiers() & Qt::AltModifier && ke->key() != Qt::Key_Alt)
+                               menuBar()->show();
+                       return QMainWindow::event(e);
+               }
+
                if (d.current_work_area_)
                        // Nothing special to do.
                        return QMainWindow::event(e);
 
                QKeyEvent * ke = static_cast<QKeyEvent*>(e);
-
                // Let Qt handle menu access and the Tab keys to navigate keys to navigate
                // between controls.
                if (ke->modifiers() & Qt::AltModifier || ke->key() == Qt::Key_Tab 
@@ -839,9 +865,6 @@ void GuiView::updateToolbars()
                d.toolbars_->update(math, table, review, mathmacrotemplate);
        } else
                d.toolbars_->update(false, false, false, false);
-
-       // update read-only status of open dialogs.
-       checkStatus();
 }
 
 
@@ -918,6 +941,9 @@ void GuiView::errors(string const & error_type)
 
 void GuiView::structureChanged()
 {
+       d.toc_models_.reset(view());
+       // Navigator needs more than a simple update in this case. It needs to be
+       // rebuilt.
        updateDialog("toc", "");
 }
 
@@ -933,7 +959,7 @@ void GuiView::updateDialog(string const & name, string const & data)
 
        Dialog * const dialog = it->second.get();
        if (dialog->isVisibleView())
-               dialog->updateData(data);
+               dialog->initialiseParams(data);
 }
 
 
@@ -959,9 +985,8 @@ void GuiView::resetAutosaveTimers()
 }
 
 
-FuncStatus GuiView::getStatus(FuncRequest const & cmd)
+bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 {
-       FuncStatus flag;
        bool enable = true;
        Buffer * buf = buffer();
 
@@ -1051,10 +1076,6 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
        }
 
        case LFUN_INSET_APPLY: {
-               if (!buf) {
-                       enable = false;
-                       break;
-               }
                string const name = cmd.getArg(0);
                Inset * inset = getOpenInset(name);
                if (inset) {
@@ -1067,7 +1088,7 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                        flag |= fs;
                } else {
                        FuncRequest fr(LFUN_INSET_INSERT, cmd.argument());
-                       flag |= getStatus(fr);
+                       flag |= lyx::getStatus(fr);
                }
                enable = flag.enabled();
                break;
@@ -1092,16 +1113,13 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                break;
 
        default:
-               if (!view()) {
-                       enable = false;
-                       break;
-               }
+               return false;
        }
 
        if (!enable)
                flag.enabled(false);
 
-       return flag;
+       return true;
 }
 
 
@@ -1655,10 +1673,11 @@ bool GuiView::closeBuffer(Buffer & buf, bool tolastopened)
 
 bool GuiView::dispatch(FuncRequest const & cmd)
 {
-       BufferView * bv = view();       
+       BufferView * bv = view();
        // By default we won't need any update.
        if (bv)
                bv->cursor().updateFlags(Update::None);
+       bool dispatched = true;
 
        switch(cmd.action) {
                case LFUN_BUFFER_IMPORT:
@@ -1829,6 +1848,7 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                }
 
                case LFUN_INSET_APPLY: {
+                       view()->cursor().recordUndoFullDocument();
                        string const name = cmd.getArg(0);
                        Inset * inset = getOpenInset(name);
                        if (inset) {
@@ -1887,10 +1907,18 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        break;
 
                default:
-                       return false;
+                       dispatched = false;
+                       break;
        }
 
-       return true;
+       if (isFullScreen()) {
+               if (menuBar()->isVisible())
+                       menuBar()->hide();
+               if (statusBar()->isVisible())
+                       statusBar()->hide();
+       }
+
+       return dispatched;
 }
 
 
@@ -1982,9 +2010,7 @@ void GuiView::restartCursor()
                d.current_work_area_->startBlinkingCursor();
 
        // Take this occasion to update the other GUI elements.
-       updateLayoutList();
-       updateToolbars();
-       updateStatusBar();
+       updateDialogs();
 }
 
 
@@ -2149,19 +2175,8 @@ void GuiView::updateDialogs()
 
        for(; it != end; ++it) {
                Dialog * dialog = it->second.get();
-               if (!dialog->isVisibleView())
-                       continue;
-               if (dialog->isBufferDependent()) {
-                       if (buffer())
-                               dialog->updateView();
-                       else
-                               dialog->enableView(false);
-               } else {
-                       // A bit clunky, but the dialog will request
-                       // that the kernel provides it with the necessary
-                       // data.
-                       dialog->updateDialog();
-               }
+               if (dialog && dialog->isVisibleView())
+                       dialog->checkStatus();
        }
        updateToolbars();
        updateLayoutList();
@@ -2169,20 +2184,6 @@ void GuiView::updateDialogs()
 }
 
 
-void GuiView::checkStatus()
-{
-       map<string, DialogPtr>::const_iterator it  = d.dialogs_.begin();
-       map<string, DialogPtr>::const_iterator end = d.dialogs_.end();
-
-       for(; it != end; ++it) {
-               Dialog * const dialog = it->second.get();
-               if (dialog && dialog->isVisibleView())
-                       dialog->checkStatus();
-       }
-}
-
-
-
 // will be replaced by a proper factory...
 Dialog * createGuiAbout(GuiView & lv);
 Dialog * createGuiBibitem(GuiView & lv);