X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt%2FGuiView.cpp;h=3fafd20e87980eb2242ffc8f5e2023f2b3e7feea;hb=f2e33b8c3e63fba3188c913ccf915011d1f205d2;hp=1643493c08473c8040d03280d66f7596a111318c;hpb=f66146973407ecb44ca93bae074ee916d5ed2f04;p=features.git diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp index 1643493c08..3fafd20e87 100644 --- a/src/frontends/qt/GuiView.cpp +++ b/src/frontends/qt/GuiView.cpp @@ -102,6 +102,7 @@ #include #include #include +#include #include #include #include @@ -491,7 +492,7 @@ public: Buffer::ExportStatus (*asyncFunc)(Buffer const *, Buffer *, string const &), Buffer::ExportStatus (Buffer::*syncFunc)(string const &, bool) const, Buffer::ExportStatus (Buffer::*previewFunc)(string const &) const, - bool allow_async); + bool allow_async, bool use_tmpdir = false); QVector guiWorkAreas(); @@ -602,6 +603,11 @@ GuiView::GuiView(int id) // (such as "source" and "messages") setDockOptions(QMainWindow::ForceTabbedDocks); +#ifdef Q_OS_MAC + // use document mode tabs on docks + setDocumentMode(true); +#endif + // For Drag&Drop. setAcceptDrops(true); @@ -622,6 +628,62 @@ GuiView::GuiView(int id) connect(busylabel, SIGNAL(clicked()), this, SLOT(checkCancelBackground())); QFontMetrics const fm(statusBar()->fontMetrics()); + + zoom_slider_ = new QSlider(Qt::Horizontal, statusBar()); + // Small size slider for macOS to prevent the status bar from enlarging + zoom_slider_->setAttribute(Qt::WA_MacSmallSize); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) + zoom_slider_->setFixedWidth(fm.horizontalAdvance('x') * 15); +#else + zoom_slider_->setFixedWidth(fm.width('x') * 15); +#endif + // Make the defaultZoom center + zoom_slider_->setRange(10, (lyxrc.defaultZoom * 2) - 10); + // Initialize proper zoom value + QSettings settings; + zoom_ratio_ = settings.value("zoom_ratio", 1.0).toDouble(); + // Actual zoom value: default zoom + fractional offset + int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_); + if (zoom < static_cast(zoom_min_)) + zoom = zoom_min_; + zoom_slider_->setValue(zoom); + zoom_slider_->setToolTip(qt_("Workarea zoom level. Drag, use Ctrl-+/- or Shift-Mousewheel to adjust.")); + zoom_slider_->setTickPosition(QSlider::TicksBelow); + zoom_slider_->setTickInterval(lyxrc.defaultZoom - 10); + + // Buttons to change zoom stepwise + zoom_in_ = new QPushButton(statusBar()); + zoom_in_->setText("+"); + zoom_in_->setFlat(true); + zoom_in_->setFixedSize(QSize(fm.height(), fm.height())); + zoom_out_ = new QPushButton(statusBar()); + zoom_out_->setText(QString(0x2212)); + zoom_out_->setFixedSize(QSize(fm.height(), fm.height())); + zoom_out_->setFlat(true); + + statusBar()->addPermanentWidget(zoom_out_); + zoom_out_->setEnabled(currentBufferView()); + statusBar()->addPermanentWidget(zoom_slider_); + zoom_slider_->setEnabled(currentBufferView()); + zoom_out_->setEnabled(currentBufferView()); + statusBar()->addPermanentWidget(zoom_in_); + + connect(zoom_slider_, SIGNAL(sliderMoved(int)), this, SLOT(zoomSliderMoved(int))); + connect(zoom_slider_, SIGNAL(valueChanged(int)), this, SLOT(zoomValueChanged(int))); + connect(this, SIGNAL(currentZoomChanged(int)), zoom_slider_, SLOT(setValue(int))); + connect(zoom_in_, SIGNAL(clicked()), this, SLOT(zoomInPressed())); + connect(zoom_out_, SIGNAL(clicked()), this, SLOT(zoomOutPressed())); + + zoom_value_ = new QLabel(statusBar()); + zoom_value_->setText(toqstr(bformat(_("[[ZOOM]]%1$d%"), zoom))); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) + zoom_value_->setMinimumWidth(fm.horizontalAdvance("000%")); +#else + zoom_value_->setMinimumWidth(fm.width("000%")); +#endif + statusBar()->addPermanentWidget(zoom_value_); + zoom_value_->setEnabled(currentBufferView()); + int const iconheight = max(int(d.normalIconSize), fm.height()); QSize const iconsize(iconheight, iconheight); @@ -688,7 +750,6 @@ GuiView::GuiView(int id) initToolbars(); // clear session data if any. - QSettings settings; settings.remove("views"); } @@ -722,6 +783,38 @@ void GuiView::checkCancelBackground() } +void GuiView::zoomSliderMoved(int value) +{ + DispatchResult dr; + dispatch(FuncRequest(LFUN_BUFFER_ZOOM, convert(value)), dr); + currentWorkArea()->scheduleRedraw(true); + zoom_value_->setText(toqstr(bformat(_("[[ZOOM]]%1$d%"), value))); +} + + +void GuiView::zoomValueChanged(int value) +{ + if (value != lyxrc.currentZoom) + zoomSliderMoved(value); +} + + +void GuiView::zoomInPressed() +{ + DispatchResult dr; + dispatch(FuncRequest(LFUN_BUFFER_ZOOM_IN), dr); + currentWorkArea()->scheduleRedraw(true); +} + + +void GuiView::zoomOutPressed() +{ + DispatchResult dr; + dispatch(FuncRequest(LFUN_BUFFER_ZOOM_OUT), dr); + currentWorkArea()->scheduleRedraw(true); +} + + QVector GuiView::GuiViewPrivate::guiWorkAreas() { QVector areas; @@ -840,6 +933,14 @@ void GuiView::saveUISettings() const } +void GuiView::setCurrentZoom(const int v) +{ + lyxrc.currentZoom = v; + zoom_value_->setText(toqstr(bformat(_("[[ZOOM]]%1$d%"), v))); + Q_EMIT currentZoomChanged(v); +} + + bool GuiView::restoreLayout() { QSettings settings; @@ -848,7 +949,7 @@ bool GuiView::restoreLayout() int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_); if (zoom < static_cast(zoom_min_)) zoom = zoom_min_; - lyxrc.currentZoom = zoom; + setCurrentZoom(zoom); devel_mode_ = settings.value("devel_mode", devel_mode_).toBool(); settings.beginGroup("views"); settings.beginGroup(QString::number(id_)); @@ -1299,6 +1400,10 @@ void GuiView::onBufferViewChanged() // Buffer-dependent dialogs must be updated. This is done here because // some dialogs require buffer()->text. updateDialogs(); + zoom_slider_->setEnabled(currentBufferView()); + zoom_value_->setEnabled(currentBufferView()); + zoom_in_->setEnabled(currentBufferView()); + zoom_out_->setEnabled(currentBufferView()); } @@ -1465,6 +1570,12 @@ bool GuiView::event(QEvent * e) return QMainWindow::event(e); } + case QEvent::ApplicationPaletteChange: { + // runtime switch from/to dark mode + refillToolbars(); + return QMainWindow::event(e); + } + default: return QMainWindow::event(e); } @@ -1734,6 +1845,13 @@ void GuiView::updateToolbars() } +void GuiView::refillToolbars() +{ + for (auto const & tb_p : d.toolbars_) + tb_p.second->refill(); +} + + void GuiView::setBuffer(Buffer * newBuffer, bool switch_to) { LYXERR(Debug::DEBUG, "Setting buffer: " << newBuffer << endl); @@ -2716,11 +2834,11 @@ void GuiView::newDocument(string const & filename, string templatefile, } -void GuiView::insertLyXFile(docstring const & fname, bool ignorelang) +bool GuiView::insertLyXFile(docstring const & fname, bool ignorelang) { BufferView * bv = documentBufferView(); if (!bv) - return; + return false; // FIXME UNICODE FileName filename(to_utf8(fname)); @@ -2742,7 +2860,7 @@ void GuiView::insertLyXFile(docstring const & fname, bool ignorelang) QStringList(qt_("LyX Documents (*.lyx)"))); if (result.first == FileDialog::Later) - return; + return false; // FIXME UNICODE filename.set(fromqstr(result.second)); @@ -2751,12 +2869,13 @@ void GuiView::insertLyXFile(docstring const & fname, bool ignorelang) if (filename.empty()) { // emit message signal. message(_("Canceled.")); - return; + return false; } } bv->insertLyXFile(filename, ignorelang); bv->buffer().errors("Parse"); + return true; } @@ -3297,9 +3416,10 @@ bool GuiView::closeBuffer(Buffer & buf) if (success) { // goto bookmark to update bookmark pit. // FIXME: we should update only the bookmarks related to this buffer! + // FIXME: this is done also in LFUN_WINDOW_CLOSE! LYXERR(Debug::DEBUG, "GuiView::closeBuffer()"); - for (unsigned int i = 0; i < theSession().bookmarks().size(); ++i) - guiApp->gotoBookmark(i + 1, false, false); + for (unsigned int i = 1; i < theSession().bookmarks().size(); ++i) + guiApp->gotoBookmark(i, false, false); if (saveBufferIfNeeded(buf, false)) { buf.removeAutosaveFile(); @@ -3845,14 +3965,13 @@ Buffer::ExportStatus GuiView::GuiViewPrivate::previewAndDestroy( } -bool GuiView::GuiViewPrivate::asyncBufferProcessing( - string const & argument, +bool GuiView::GuiViewPrivate::asyncBufferProcessing(string const & argument, Buffer const * used_buffer, docstring const & msg, Buffer::ExportStatus (*asyncFunc)(Buffer const *, Buffer *, string const &), Buffer::ExportStatus (Buffer::*syncFunc)(string const &, bool) const, Buffer::ExportStatus (Buffer::*previewFunc)(string const &) const, - bool allow_async) + bool allow_async, bool use_tmpdir) { if (!used_buffer) return false; @@ -3888,7 +4007,7 @@ bool GuiView::GuiViewPrivate::asyncBufferProcessing( } else { Buffer::ExportStatus status; if (syncFunc) { - status = (used_buffer->*syncFunc)(format, false); + status = (used_buffer->*syncFunc)(format, use_tmpdir); } else if (previewFunc) { status = (used_buffer->*previewFunc)(format); } else @@ -4045,7 +4164,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) _("Exporting ..."), &GuiViewPrivate::compileAndDestroy, &Buffer::doExport, - nullptr, cmd.allowAsync()); + nullptr, cmd.allowAsync(), true); break; } case LFUN_BUFFER_VIEW: { @@ -4063,7 +4182,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) docstring(), &GuiViewPrivate::compileAndDestroy, &Buffer::doExport, - nullptr, cmd.allowAsync()); + nullptr, cmd.allowAsync(), true); break; } case LFUN_MASTER_BUFFER_VIEW: { @@ -4158,10 +4277,11 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; case LFUN_FILE_INSERT: { - if (cmd.getArg(1) == "ignorelang") - insertLyXFile(from_utf8(cmd.getArg(0)), true); - else - insertLyXFile(cmd.argument()); + bool const ignore_lang = cmd.getArg(1) == "ignorelang"; + if (insertLyXFile(from_utf8(cmd.getArg(0)), ignore_lang)) { + dr.forceBufferUpdate(); + dr.screenUpdate(Update::Force); + } break; } @@ -4424,6 +4544,9 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) sdata = bv->cursor().getEncoding()->name(); if (!sdata.empty()) showDialog("symbols", sdata); + } else if (name == "findreplace") { + sdata = to_utf8(bv->cursor().selectionAsString(false)); + showDialog(name, sdata); // bug 5274 } else if (name == "prefs" && isFullScreen()) { lfunUiToggle("fullscreen"); @@ -4542,13 +4665,13 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) if (zoom < static_cast(zoom_min_)) zoom = zoom_min_; - lyxrc.currentZoom = zoom; + setCurrentZoom(zoom); dr.setMessage(bformat(_("Zoom level is now %1$d% (default value: %2$d%)"), lyxrc.currentZoom, lyxrc.defaultZoom)); guiApp->fontLoader().update(); - dr.screenUpdate(Update::Force | Update::FitCursor); + dr.screenUpdate(Update::ForceAll | Update::FitCursor); break; } @@ -4657,12 +4780,6 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; } - // Part of automatic menu appearance feature. - if (isFullScreen()) { - if (menuBar()->isVisible() && lyxrc.full_screen_menubar) - menuBar()->hide(); - } - // Need to update bv because many LFUNs here might have destroyed it bv = currentBufferView(); @@ -4894,7 +5011,8 @@ void GuiView::doShowDialog(QString const & qname, QString const & qdata, // activateWindow is needed for floating dockviews dialog->asQWidget()->raise(); dialog->asQWidget()->activateWindow(); - dialog->asQWidget()->setFocus(); + if (dialog->wantInitialFocus()) + dialog->asQWidget()->setFocus(); } } }