]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
#1720 disable document buffer related LFUNs in GUI view if the work area has no focus
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 1ca0adddfd1b6d83b25d86be59ad0b0324cc10d6..52fadcf3ef231d7619ae709f5dee7e8474008747 100644 (file)
@@ -157,14 +157,14 @@ public:
                /// The text to be written on top of the pixmap
                QString const text = lyx_version ?
                        qt_("version ") + lyx_version : qt_("unknown version");
-               splash_ = getPixmap("images/", "banner", "png");
+               splash_ = getPixmap("images/", "banner", "svgz,png");
 
                QPainter pain(&splash_);
                pain.setPen(QColor(0, 0, 0));
                double const multiplier = splashPixelRatio() / pixelRatio();
-               int const size = toqstr(lyxrc.font_sizes[FONT_SIZE_LARGE]).toDouble() * multiplier;
-               int const x = 190 * multiplier;
-               int const y = 225 * multiplier;
+               int const size = static_cast<int>(toqstr(lyxrc.font_sizes[FONT_SIZE_LARGE]).toDouble() * multiplier);
+               int const x = static_cast<int>(190 * multiplier);
+               int const y = static_cast<int>(225 * multiplier);
                LYXERR(Debug::GUI,
                        "widget pixel ratio: " << pixelRatio() <<
                        " splash pixel ratio: " << splashPixelRatio() <<
@@ -181,8 +181,8 @@ public:
 
        void paintEvent(QPaintEvent *)
        {
-               int const w = splash_.width() / splashPixelRatio();
-               int const h = splash_.height() / splashPixelRatio();
+               int const w = static_cast<int>(splash_.width() / splashPixelRatio());
+               int const h = static_cast<int>(splash_.height() / splashPixelRatio());
                int const x = (width() - w) / 2;
                int const y = (height() - h) / 2;
                LYXERR(Debug::GUI,
@@ -247,6 +247,8 @@ struct GuiView::GuiViewPrivate
                smallIconSize = 16;  // scaling problems
                normalIconSize = 20; // ok, default if iconsize.png is missing
                bigIconSize = 26;       // better for some math icons
+               hugeIconSize = 32;      // better for hires displays
+               giantIconSize = 48;
 
                // if it exists, use width of iconsize.png as normal size
                QString const dir = toqstr(addPath("images", lyxrc.icon_set));
@@ -255,8 +257,8 @@ struct GuiView::GuiViewPrivate
                        QImage image(toqstr(fn.absFileName()));
                        if (image.width() < int(smallIconSize))
                                normalIconSize = smallIconSize;
-                       else if (image.width() > int(bigIconSize))
-                               normalIconSize = bigIconSize;
+                       else if (image.width() > int(giantIconSize))
+                               normalIconSize = giantIconSize;
                        else
                                normalIconSize = image.width();
                }
@@ -318,6 +320,20 @@ struct GuiView::GuiViewPrivate
                        parent, SLOT(bigSizedIcons()));
                menu->addAction(bigIcons);
 
+               QAction * hugeIcons = new QAction(iconSizeGroup);
+               hugeIcons->setText(qt_("Huge-sized icons"));
+               hugeIcons->setCheckable(true);
+               QObject::connect(hugeIcons, SIGNAL(triggered()),
+                       parent, SLOT(hugeSizedIcons()));
+               menu->addAction(hugeIcons);
+
+               QAction * giantIcons = new QAction(iconSizeGroup);
+               giantIcons->setText(qt_("Giant-sized icons"));
+               giantIcons->setCheckable(true);
+               QObject::connect(giantIcons, SIGNAL(triggered()),
+                       parent, SLOT(giantSizedIcons()));
+               menu->addAction(giantIcons);
+
                unsigned int cur = parent->iconSize().width();
                if ( cur == parent->d.smallIconSize)
                        smallIcons->setChecked(true);
@@ -325,6 +341,10 @@ struct GuiView::GuiViewPrivate
                        normalIcons->setChecked(true);
                else if (cur == parent->d.bigIconSize)
                        bigIcons->setChecked(true);
+               else if (cur == parent->d.hugeIconSize)
+                       hugeIcons->setChecked(true);
+               else if (cur == parent->d.giantIconSize)
+                       giantIcons->setChecked(true);
 
                return menu;
        }
@@ -412,6 +432,8 @@ public:
        unsigned int smallIconSize;
        unsigned int normalIconSize;
        unsigned int bigIconSize;
+       unsigned int hugeIconSize;
+       unsigned int giantIconSize;
        ///
        QTimer statusbar_timer_;
        /// auto-saving of buffers
@@ -487,9 +509,9 @@ GuiView::GuiView(int id)
        // assign an icon to main form. We do not do it under Qt/Win or Qt/Mac,
        // since the icon is provided in the application bundle. We use a themed
        // version when available and use the bundled one as fallback.
-       setWindowIcon(QIcon::fromTheme("lyx", getPixmap("images/", "lyx", "png")));
+       setWindowIcon(QIcon::fromTheme("lyx", getPixmap("images/", "lyx", "svg,png")));
 #else
-       setWindowIcon(getPixmap("images/", "lyx", "png"));
+       setWindowIcon(getPixmap("images/", "lyx", "svg,png"));
 #endif
 
 #endif
@@ -635,7 +657,7 @@ void GuiView::saveLayout() const
        QSettings settings;
        settings.beginGroup("views");
        settings.beginGroup(QString::number(id_));
-#ifdef Q_WS_X11
+#if defined(Q_WS_X11) || defined(QPA_XCB)
        settings.setValue("pos", pos());
        settings.setValue("size", size());
 #else
@@ -673,13 +695,15 @@ bool GuiView::restoreLayout()
        // Check whether session size changed.
        if (icon_size.width() != int(d.smallIconSize) &&
            icon_size.width() != int(d.normalIconSize) &&
-           icon_size.width() != int(d.bigIconSize)) {
+           icon_size.width() != int(d.bigIconSize) &&
+           icon_size.width() != int(d.hugeIconSize) &&
+           icon_size.width() != int(d.giantIconSize)) {
                icon_size.setWidth(d.normalIconSize);
                icon_size.setHeight(d.normalIconSize);
        }
        setIconSize(icon_size);
 
-#ifdef Q_WS_X11
+#if defined(Q_WS_X11) || defined(QPA_XCB)
        QPoint pos = settings.value("pos", QPoint(50, 50)).toPoint();
        QSize size = settings.value("size", QSize(690, 510)).toSize();
        resize(size);
@@ -817,6 +841,16 @@ void GuiView::setFocus()
 }
 
 
+bool GuiView::hasFocus() const
+{
+       if (currentWorkArea())
+               return currentWorkArea()->hasFocus();
+       if (currentMainWorkArea())
+               return currentMainWorkArea()->hasFocus();
+       return d.bg_widget_->hasFocus();
+}
+
+
 void GuiView::focusInEvent(QFocusEvent * e)
 {
        LYXERR(Debug::DEBUG, "GuiView::focusInEvent()" << this);
@@ -860,6 +894,32 @@ bool GuiView::closeScheduled()
 }
 
 
+bool GuiView::prepareAllBuffersForLogout()
+{
+       Buffer * first = theBufferList().first();
+       if (!first)
+               return true;
+
+       // First, iterate over all buffers and ask the users if unsaved
+       // changes should be saved.
+       // We cannot use a for loop as the buffer list cycles.
+       Buffer * b = first;
+       do {
+               if (!saveBufferIfNeeded(const_cast<Buffer &>(*b), false))
+                       return false;
+               b = theBufferList().next(b);
+       } while (b != first);
+
+       // Next, save session state
+       // When a view/window was closed before without quitting LyX, there
+       // are already entries in the lastOpened list.
+       theSession().lastOpened().clear();
+       writeSession();
+
+       return true;
+}
+
+
 /** Destroy only all tabbed WorkAreas. Destruction of other WorkAreas
  ** is responsibility of the container (e.g., dialog)
  **/
@@ -1017,6 +1077,18 @@ void GuiView::bigSizedIcons()
 }
 
 
+void GuiView::hugeSizedIcons()
+{
+       setIconSize(QSize(d.hugeIconSize, d.hugeIconSize));
+}
+
+
+void GuiView::giantSizedIcons()
+{
+       setIconSize(QSize(d.giantIconSize, d.giantIconSize));
+}
+
+
 void GuiView::clearMessage()
 {
        // FIXME: This code was introduced in r19643 to fix bug #4123. However,
@@ -1637,6 +1709,16 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
        Buffer * doc_buffer = documentBufferView()
                ? &(documentBufferView()->buffer()) : 0;
 
+       /* In LyX/Mac, when a dialog is open, the menus of the
+          application can still be accessed without giving focus to
+          the main window. In this case, we want to disable the menu
+          entries that are buffer-related.
+        */
+       if (cmd.origin() == FuncRequest::MENU && !hasFocus()) {
+               buf = 0;
+               doc_buffer = 0;
+       }
+
        // Check whether we need a buffer
        if (!lyxaction.funcHasFlag(cmd.action(), LyXAction::NoBuffer) && !buf) {
                // no, exit directly
@@ -1859,9 +1941,13 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                enable = doc_buffer;
                break;
 
+       case LFUN_BUFFER_MOVE_NEXT:
+       case LFUN_BUFFER_MOVE_PREVIOUS:
+               // we do not cycle when moving
        case LFUN_BUFFER_NEXT:
        case LFUN_BUFFER_PREVIOUS:
-               // FIXME: should we check is there is an previous or next buffer?
+               // because we cycle, it doesn't matter whether on first or last
+               enable = (d.currentTabWorkArea()->count() > 1);
                break;
        case LFUN_BUFFER_SWITCH:
                // toggle on the current buffer, but do not toggle off
@@ -2854,7 +2940,7 @@ bool GuiView::inOtherView(Buffer & buf)
 }
 
 
-void GuiView::gotoNextOrPreviousBuffer(NextOrPrevious np)
+void GuiView::gotoNextOrPreviousBuffer(NextOrPrevious np, bool const move)
 {
        if (!documentBufferView())
                return;
@@ -2869,7 +2955,10 @@ void GuiView::gotoNextOrPreviousBuffer(NextOrPrevious np)
                                        next_index = (i == nwa - 1 ? 0 : i + 1);
                                else
                                        next_index = (i == 0 ? nwa - 1 : i - 1);
-                               setBuffer(&workArea(next_index)->bufferView().buffer());
+                               if (move)
+                                       twa->moveTab(i, next_index);
+                               else
+                                       setBuffer(&workArea(next_index)->bufferView().buffer());
                                break;
                        }
                }
@@ -2990,7 +3079,7 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr)
                        LyXVC::CommandResult ret = buffer->lyxvc().checkIn(log);
                        dr.setMessage(log);
                        // Only skip reloading if the checkin was cancelled or
-                       // an error occured before the real checkin VCS command
+                       // an error occurred before the real checkin VCS command
                        // was executed, since the VCS might have changed the
                        // file even if it could not checkin successfully.
                        if (ret == LyXVC::ErrorCommand || ret == LyXVC::VCSuccess)
@@ -3483,11 +3572,19 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                }
 
                case LFUN_BUFFER_NEXT:
-                       gotoNextOrPreviousBuffer(NEXTBUFFER);
+                       gotoNextOrPreviousBuffer(NEXTBUFFER, false);
+                       break;
+
+               case LFUN_BUFFER_MOVE_NEXT:
+                       gotoNextOrPreviousBuffer(NEXTBUFFER, true);
                        break;
 
                case LFUN_BUFFER_PREVIOUS:
-                       gotoNextOrPreviousBuffer(PREVBUFFER);
+                       gotoNextOrPreviousBuffer(PREVBUFFER, false);
+                       break;
+
+               case LFUN_BUFFER_MOVE_PREVIOUS:
+                       gotoNextOrPreviousBuffer(PREVBUFFER, true);
                        break;
 
                case LFUN_COMMAND_EXECUTE: {