]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiApplication.cpp
Cleanup LyXFunc::dispatch() following JMarc advice.
[lyx.git] / src / frontends / qt4 / GuiApplication.cpp
index 0161891f74a2997e329d7966346515f6c5ec6b3f..148166312ac719b205bfc225c73a2a6c8ba06217 100644 (file)
 #include "frontends/FontLoader.h"
 #include "frontends/FontMetrics.h"
 
-#include "graphics/LoaderQueue.h"
-
 #include "support/ExceptionMessage.h"
 #include "support/FileName.h"
 #include "support/lstrings.h"
 #include "support/os.h"
 #include "support/Package.h"
 
+#include "Buffer.h"
 #include "BufferList.h"
 #include "BufferView.h"
 #include "debug.h"
 #include "Font.h"
 #include "FuncRequest.h"
+#include "FuncStatus.h"
 #include "gettext.h"
 #include "LyX.h"
 #include "LyXFunc.h"
 #include "LyXRC.h"
+#include "Session.h"
 #include "version.h"
 
 #include <QApplication>
@@ -187,8 +188,6 @@ GuiApplication::GuiApplication(int & argc, char ** argv)
        QWidget w;
        lyxrc.dpi = (w.logicalDpiX() + w.logicalDpiY()) / 2;
 
-       LoaderQueue::setPriority(10,100);
-
        guiApp = this;
 
        // Set the cache to 5120 kilobytes which corresponds to screen size of
@@ -213,6 +212,94 @@ GuiApplication::~GuiApplication()
 }
 
 
+FuncStatus GuiApplication::getStatus(FuncRequest const & cmd)
+{
+       FuncStatus flag;
+       bool enable = true;
+
+       switch(cmd.action) {
+
+       case LFUN_WINDOW_CLOSE:
+               enable = view_ids_.size() > 0;
+               break;
+
+       default:
+               if (!current_view_) {
+                       enable = false;
+                       break;
+               }
+       }
+
+       if (!enable)
+               flag.enabled(false);
+
+       return flag;
+}
+
+       
+bool GuiApplication::dispatch(FuncRequest const & cmd)
+{
+       switch(cmd.action) {
+
+       case LFUN_WINDOW_NEW:
+               createView(toqstr(cmd.argument()));
+               break;
+
+       case LFUN_WINDOW_CLOSE:
+               // update bookmark pit of the current buffer before window close
+               for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i)
+                       theLyXFunc().gotoBookmark(i+1, false, false);
+               // ask the user for saving changes or cancel quit
+               if (!theBufferList().quitWriteAll())
+                       break;
+               current_view_->close();
+               break;
+
+       case LFUN_LYX_QUIT:
+               // quitting is triggered by the gui code
+               // (leaving the event loop).
+               current_view_->message(from_utf8(N_("Exiting.")));
+               if (theBufferList().quitWriteAll())
+                       closeAllViews();
+               break;
+
+       case LFUN_SCREEN_FONT_UPDATE: {
+               // handle the screen font changes.
+               font_loader_.update();
+               // Backup current_view_
+               GuiView * view = current_view_;
+               // Set current_view_ to zero to forbid GuiWorkArea::redraw()
+               // to skip the refresh.
+               current_view_ = 0;
+               BufferList::iterator it = theBufferList().begin();
+               BufferList::iterator const end = theBufferList().end();
+               for (; it != end; ++it)
+                       (*it)->changed();
+               // Restore current_view_
+               current_view_ = view;
+               break;
+       }
+
+       default:
+               // Notify the caller that the action has not been dispatched.
+               return false;
+       }
+
+       // The action has been dispatched.
+       return true;
+}
+
+
+void GuiApplication::resetGui()
+{
+       map<int, GuiView *>::iterator it;
+       for (it = views_.begin(); it != views_.end(); ++it)
+               it->second->resetDialogs();
+
+       dispatch(FuncRequest(LFUN_SCREEN_FONT_UPDATE));
+}
+
+
 static void updateIds(map<int, GuiView *> const & stdmap, vector<int> & ids)
 {
        ids.clear();
@@ -222,7 +309,7 @@ static void updateIds(map<int, GuiView *> const & stdmap, vector<int> & ids)
 }
 
 
-LyXView & GuiApplication::createView(string const & geometry_arg)
+void GuiApplication::createView(QString const & geometry_arg)
 {
        updateIds(views_, view_ids_);
        int id = 0;
@@ -235,12 +322,12 @@ LyXView & GuiApplication::createView(string const & geometry_arg)
        theLyXFunc().setLyXView(view);
 
        view->show();
-       if (!geometry_arg.empty()) {
+       if (!geometry_arg.isEmpty()) {
 #ifdef Q_WS_WIN
                int x, y;
                int w, h;
                QRegExp re( "[=]*(?:([0-9]+)[xX]([0-9]+)){0,1}[ ]*(?:([+-][0-9]*)([+-][0-9]*)){0,1}" );
-               re.indexIn(toqstr(geometry_arg.c_str()));
+               re.indexIn(geometry_arg);
                w = re.cap(1).toInt();
                h = re.cap(2).toInt();
                x = re.cap(3).toInt();
@@ -251,8 +338,6 @@ LyXView & GuiApplication::createView(string const & geometry_arg)
        view->setFocus();
 
        setCurrentView(*view);
-
-       return *view;
 }