#include <QPoint>
#include <QSettings>
#include <QShowEvent>
+#include <QSlider>
#include <QSplitter>
#include <QStackedWidget>
#include <QStatusBar>
// (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);
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<int>(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);
initToolbars();
// clear session data if any.
- QSettings settings;
settings.remove("views");
}
}
+void GuiView::zoomSliderMoved(int value)
+{
+ DispatchResult dr;
+ dispatch(FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(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<GuiWorkArea*> GuiView::GuiViewPrivate::guiWorkAreas()
{
QVector<GuiWorkArea*> areas;
}
+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;
int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_);
if (zoom < static_cast<int>(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_));
// 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());
}
return QMainWindow::event(e);
}
+ case QEvent::ApplicationPaletteChange: {
+ // runtime switch from/to dark mode
+ refillToolbars();
+ return QMainWindow::event(e);
+ }
+
default:
return QMainWindow::event(e);
}
}
+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);
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");
if (zoom < static_cast<int>(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));
// activateWindow is needed for floating dockviews
dialog->asQWidget()->raise();
dialog->asQWidget()->activateWindow();
- dialog->asQWidget()->setFocus();
+ if (dialog->wantInitialFocus())
+ dialog->asQWidget()->setFocus();
}
}
}