]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
Some improvements to the graphics dialog
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index a257bb72686a327a993c0c9b17745d75a7c9b466..56a2e73d53220895d5f3b927d54e769abd24f263 100644 (file)
@@ -508,7 +508,7 @@ QSet<Buffer const *> GuiView::GuiViewPrivate::busyBuffers;
 
 GuiView::GuiView(int id)
        : d(*new GuiViewPrivate(this)), id_(id), closing_(false), busy_(0),
-         command_execute_(false), minibuffer_focus_(false)
+         command_execute_(false), minibuffer_focus_(false), devel_mode_(false)
 {
        connect(this, SIGNAL(bufferViewChanged()),
                this, SLOT(onBufferViewChanged()));
@@ -577,9 +577,25 @@ GuiView::GuiView(int id)
                busylabel, SLOT(hide()));
 
        QFontMetrics const fm(statusBar()->fontMetrics());
-       int const roheight = max(int(d.normalIconSize), fm.height());
-       QSize const rosize(roheight, roheight);
-       QPixmap readonly = QIcon(getPixmap("images/", "emblem-readonly", "svgz,png")).pixmap(rosize);
+       int const iconheight = max(int(d.normalIconSize), fm.height());
+       QSize const iconsize(iconheight, iconheight);
+
+       QPixmap shellescape = QIcon(getPixmap("images/", "emblem-shellescape", "svgz,png")).pixmap(iconsize);
+       shell_escape_ = new QLabel(statusBar());
+       shell_escape_->setPixmap(shellescape);
+       shell_escape_->setScaledContents(true);
+       shell_escape_->setAlignment(Qt::AlignCenter);
+       shell_escape_->setContextMenuPolicy(Qt::CustomContextMenu);
+       shell_escape_->setToolTip(qt_("WARNING: LaTeX is allowed to execute "
+                                     "external commands for this document. "
+                                     "Right click to change."));
+       SEMenu * menu = new SEMenu(this);
+       connect(shell_escape_, SIGNAL(customContextMenuRequested(QPoint)),
+               menu, SLOT(showMenu(QPoint)));
+       shell_escape_->hide();
+       statusBar()->addPermanentWidget(shell_escape_);
+
+       QPixmap readonly = QIcon(getPixmap("images/", "emblem-readonly", "svgz,png")).pixmap(iconsize);
        read_only_ = new QLabel(statusBar());
        read_only_->setPixmap(readonly);
        read_only_->setScaledContents(true);
@@ -638,6 +654,17 @@ GuiView::~GuiView()
 }
 
 
+void GuiView::disableShellEscape()
+{
+       BufferView * bv = documentBufferView();
+       if (!bv)
+               return;
+       theSession().shellescapeFiles().remove(bv->buffer().absFileName());
+       bv->buffer().params().shell_escape = false;
+       bv->processUpdateFlags(Update::Force);
+}
+
+
 QVector<GuiWorkArea*> GuiView::GuiViewPrivate::guiWorkAreas()
 {
        QVector<GuiWorkArea*> areas;
@@ -714,7 +741,8 @@ void GuiView::autoSaveThreadFinished()
 void GuiView::saveLayout() const
 {
        QSettings settings;
-       settings.setValue("zoom", lyxrc.currentZoom);
+       settings.setValue("zoom_ratio", zoom_ratio_);
+       settings.setValue("devel_mode", devel_mode_);
        settings.beginGroup("views");
        settings.beginGroup(QString::number(id_));
 #if defined(Q_WS_X11) || defined(QPA_XCB)
@@ -730,22 +758,29 @@ void GuiView::saveLayout() const
 
 void GuiView::saveUISettings() const
 {
+       QSettings settings;
+
        // Save the toolbar private states
        ToolbarMap::iterator end = d.toolbars_.end();
        for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; ++it)
-               it->second->saveSession();
+               it->second->saveSession(settings);
        // Now take care of all other dialogs
        map<string, DialogPtr>::const_iterator it = d.dialogs_.begin();
        for (; it!= d.dialogs_.end(); ++it)
-               it->second->saveSession();
+               it->second->saveSession(settings);
 }
 
 
 bool GuiView::restoreLayout()
 {
        QSettings settings;
-       lyxrc.currentZoom = settings.value("zoom", lyxrc.zoom).toInt();
-       lyx::dispatch(FuncRequest(LFUN_BUFFER_ZOOM, convert<docstring>(lyxrc.currentZoom)));
+       zoom_ratio_ = settings.value("zoom_ratio", 1.0).toDouble();
+       // Actual zoom value: default zoom + fractional offset
+       int zoom = lyxrc.defaultZoom * zoom_ratio_;
+       if (zoom < static_cast<int>(zoom_min_))
+               zoom = zoom_min_;
+       lyxrc.currentZoom = zoom;
+       devel_mode_ = settings.value("devel_mode", devel_mode_).toBool();
        settings.beginGroup("views");
        settings.beginGroup(QString::number(id_));
        QString const icon_key = "icon_size";
@@ -1158,6 +1193,11 @@ void GuiView::updateWindowTitle(GuiWorkArea * wa)
        // Tell Qt whether the current document is changed
        setWindowModified(!buf.isClean());
 
+       if (buf.params().shell_escape)
+               shell_escape_->show();
+       else
+               shell_escape_->hide();
+
        if (buf.hasReadonlyFlag())
                read_only_->show();
        else
@@ -1254,7 +1294,7 @@ void GuiView::showMessage()
        if (msg.isEmpty()) {
                BufferView const * bv = currentBufferView();
                if (bv)
-                       msg = toqstr(bv->cursor().currentState());
+                       msg = toqstr(bv->cursor().currentState(devel_mode_));
                else
                        msg = qt_("Welcome to LyX!");
        }
@@ -1839,7 +1879,8 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 
        case LFUN_BUFFER_RELOAD:
                enable = doc_buffer && !doc_buffer->isUnnamed()
-                       && doc_buffer->fileName().exists() && !doc_buffer->isClean();
+                       && doc_buffer->fileName().exists()
+                       && (!doc_buffer->isClean() || doc_buffer->notifiesExternalModification());
                break;
 
        case LFUN_BUFFER_CHILD_OPEN:
@@ -1900,6 +1941,10 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                enable = d.tabWorkAreaCount() > 1;
                break;
 
+       case LFUN_DEVEL_MODE_TOGGLE:
+               flag.setOnOff(devel_mode_);
+               break;
+
        case LFUN_TOOLBAR_TOGGLE: {
                string const name = cmd.getArg(0);
                if (GuiToolbar * t = toolbar(name))
@@ -1951,7 +1996,8 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 
        case LFUN_DIALOG_TOGGLE:
                flag.setOnOff(isDialogVisible(cmd.getArg(0)));
-               // fall through to set "enable"
+               // to set "enable"
+               // fall through
        case LFUN_DIALOG_SHOW: {
                string const name = cmd.getArg(0);
                if (!doc_buffer)
@@ -2183,8 +2229,10 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles)
        setBuffer(newBuffer);
        newBuffer->errors("Parse");
 
-       if (tolastfiles)
+       if (tolastfiles) {
                theSession().lastFiles().add(filename);
+               theSession().writeFile();
+  }
 
        return newBuffer;
 }
@@ -2723,6 +2771,7 @@ bool GuiView::saveBuffer(Buffer & b, FileName const & fn)
        bool const success = (fn.empty() ? b.save() : b.saveAs(fn));
        if (success) {
                theSession().lastFiles().add(b.fileName());
+               theSession().writeFile();
                return true;
        }
 
@@ -3130,6 +3179,7 @@ static bool ensureBufferClean(Buffer * buffer)
 
 bool GuiView::reloadBuffer(Buffer & buf)
 {
+       currentBufferView()->cursor().reset();
        Buffer::ReadStatus status = buf.reload();
        return status == Buffer::ReadSuccess;
 }
@@ -3861,6 +3911,14 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        closeBufferAll();
                        break;
 
+               case LFUN_DEVEL_MODE_TOGGLE:
+                       devel_mode_ = !devel_mode_;
+                       if (devel_mode_)
+                               dr.setMessage(_("Developer mode is now enabled."));
+                       else
+                               dr.setMessage(_("Developer mode is now disabled."));
+                       break;
+
                case LFUN_TOOLBAR_TOGGLE: {
                        string const name = cmd.getArg(0);
                        if (GuiToolbar * t = toolbar(name))
@@ -4068,36 +4126,37 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                case LFUN_BUFFER_ZOOM_IN:
                case LFUN_BUFFER_ZOOM_OUT:
                case LFUN_BUFFER_ZOOM: {
-                       // use a signed temp to avoid overflow
-                       int zoom = lyxrc.currentZoom;
                        if (cmd.argument().empty()) {
                                if (cmd.action() == LFUN_BUFFER_ZOOM)
-                                       zoom = lyxrc.zoom;
+                                       zoom_ratio_ = 1.0;
                                else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
-                                       zoom += 20;
+                                       zoom_ratio_ += 0.1;
                                else
-                                       zoom -= 20;
+                                       zoom_ratio_ -= 0.1;
                        } else {
                                if (cmd.action() == LFUN_BUFFER_ZOOM)
-                                       zoom = convert<int>(cmd.argument());
+                                       zoom_ratio_ = convert<int>(cmd.argument()) / double(lyxrc.defaultZoom);
                                else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
-                                       zoom += convert<int>(cmd.argument());
+                                       zoom_ratio_ += convert<int>(cmd.argument()) / 100.0;
                                else
-                                       zoom -= convert<int>(cmd.argument());
+                                       zoom_ratio_ -= convert<int>(cmd.argument()) / 100.0;
                        }
 
+                       // Actual zoom value: default zoom + fractional extra value
+                       int zoom = lyxrc.defaultZoom * zoom_ratio_;
                        if (zoom < static_cast<int>(zoom_min_))
                                zoom = zoom_min_;
 
                        lyxrc.currentZoom = zoom;
 
-                       dr.setMessage(bformat(_("Zoom level is now %1$d%"), lyxrc.currentZoom));
+                       dr.setMessage(bformat(_("Zoom level is now %1$d% (default value: %2$d%)"),
+                                             lyxrc.currentZoom, lyxrc.defaultZoom));
 
                        // The global QPixmapCache is used in GuiPainter to cache text
                        // painting so we must reset it.
                        QPixmapCache::clear();
                        guiApp->fontLoader().update();
-                       lyx::dispatch(FuncRequest(LFUN_SCREEN_FONT_UPDATE));
+                       dr.screenUpdate(Update::Force | Update::FitCursor);
                        break;
                }
 
@@ -4293,19 +4352,19 @@ Buffer const * GuiView::updateInset(Inset const * inset)
                        continue;
                Buffer const * buffer = &(wa->bufferView().buffer());
                if (inset_buffer == buffer)
-                       wa->scheduleRedraw();
+                       wa->scheduleRedraw(true);
        }
        return inset_buffer;
 }
 
 
-void GuiView::restartCursor()
+void GuiView::restartCaret()
 {
        /* When we move around, or type, it's nice to be able to see
-        * the cursor immediately after the keypress.
+        * the caret immediately after the keypress.
         */
        if (d.current_work_area_)
-               d.current_work_area_->startBlinkingCursor();
+               d.current_work_area_->startBlinkingCaret();
 
        // Take this occasion to update the other GUI elements.
        updateDialogs();
@@ -4374,7 +4433,7 @@ void GuiView::resetDialogs()
        // Now update controls with current buffer.
        guiApp->setCurrentView(this);
        restoreLayout();
-       restartCursor();
+       restartCaret();
 }
 
 
@@ -4638,6 +4697,14 @@ Dialog * GuiView::build(string const & name)
 }
 
 
+SEMenu::SEMenu(QWidget * parent)
+{
+       QAction * action = addAction(qt_("Disable Shell Escape"));
+       connect(action, SIGNAL(triggered()),
+               parent, SLOT(disableShellEscape()));
+}
+
+
 } // namespace frontend
 } // namespace lyx