[LyX/master] Zoom slider

Juergen Spitzmueller spitz at lyx.org
Sun Mar 7 12:24:29 UTC 2021


commit bdb006543b43f71a06fc5b9915d0df19aae0ef68
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sun Mar 7 13:29:23 2021 +0100

    Zoom slider
---
 src/LyXRC.h                  |    1 +
 src/frontends/qt/GuiView.cpp |   34 ++++++++++++++++++++++++++++++++--
 src/frontends/qt/GuiView.h   |    6 ++++++
 3 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/src/LyXRC.h b/src/LyXRC.h
index cf6a012..bf65728 100644
--- a/src/LyXRC.h
+++ b/src/LyXRC.h
@@ -318,6 +318,7 @@ public:
 	int defaultZoom = 150;
 	/// Actual zoom factor for screen fonts
 	/// (default zoom plus buffer zoom factor)
+	/// Do not set directly. Use GuiView::setCurrentZoom()
 	int currentZoom = 150;
 	/// Screen font sizes in points for each font size
 	std::string font_sizes[10] = { "5.0", "7.0", "8.0", "9.0", "10.0",
diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp
index c226968..536a0ca 100644
--- a/src/frontends/qt/GuiView.cpp
+++ b/src/frontends/qt/GuiView.cpp
@@ -102,6 +102,7 @@
 #include <QPoint>
 #include <QSettings>
 #include <QShowEvent>
+#include <QSlider>
 #include <QSplitter>
 #include <QStackedWidget>
 #include <QStatusBar>
@@ -627,6 +628,18 @@ GuiView::GuiView(int id)
 	connect(busylabel, SIGNAL(clicked()), this, SLOT(checkCancelBackground()));
 
 	QFontMetrics const fm(statusBar()->fontMetrics());
+
+	QSlider * zoomslider = new QSlider(Qt::Horizontal, statusBar());
+	zoomslider->setFixedWidth(fm.horizontalAdvance('x') * 15);
+	// Make the defaultZoom center
+	zoomslider->setRange(10, (lyxrc.defaultZoom * 2) - 10);
+	zoomslider->setValue(lyxrc.currentZoom);
+	zoomslider->setToolTip(qt_("Workarea zoom level. Drag, use Ctrl-+/- or Shift-Mousewheel to adjust."));
+	statusBar()->addPermanentWidget(zoomslider);
+
+	connect(zoomslider, SIGNAL(sliderMoved(int)), this, SLOT(zoomSliderMoved(int)));
+	connect(this, SIGNAL(currentZoomChanged(int)), zoomslider, SLOT(setValue(int)));
+
 	int const iconheight = max(int(d.normalIconSize), fm.height());
 	QSize const iconsize(iconheight, iconheight);
 
@@ -727,6 +740,16 @@ void GuiView::checkCancelBackground()
 }
 
 
+void GuiView::zoomSliderMoved(int value)
+{
+	DispatchResult dr;
+	dispatch(FuncRequest(LFUN_BUFFER_ZOOM, convert<string>(value)), dr);
+	currentWorkArea()->scheduleRedraw(true);
+	message(bformat(_("Zoom level is now %1$d% (default value: %2$d%)"),
+			value, lyxrc.defaultZoom));
+}
+
+
 QVector<GuiWorkArea*> GuiView::GuiViewPrivate::guiWorkAreas()
 {
 	QVector<GuiWorkArea*> areas;
@@ -845,6 +868,13 @@ void GuiView::saveUISettings() const
 }
 
 
+void GuiView::setCurrentZoom(const int v)
+{
+	lyxrc.currentZoom = v;
+	Q_EMIT currentZoomChanged(v);
+}
+
+
 bool GuiView::restoreLayout()
 {
 	QSettings settings;
@@ -853,7 +883,7 @@ bool GuiView::restoreLayout()
 	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_));
@@ -4565,7 +4595,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
 			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));
diff --git a/src/frontends/qt/GuiView.h b/src/frontends/qt/GuiView.h
index b570b19..4f92e31 100644
--- a/src/frontends/qt/GuiView.h
+++ b/src/frontends/qt/GuiView.h
@@ -220,6 +220,8 @@ Q_SIGNALS:
 	void triggerShowDialog(QString const & qname, QString const & qdata, Inset * inset);
 	// emitted when the work area or its buffer view changed
 	void bufferViewChanged();
+	/// emitted when zoom is modified
+	void currentZoomChanged(int);
 
 public Q_SLOTS:
 	///
@@ -241,6 +243,8 @@ private Q_SLOTS:
 	///
 	void checkCancelBackground();
 	///
+	void zoomSliderMoved(int);
+	///
 	void on_currentWorkAreaChanged(GuiWorkArea *);
 	///
 	void onBufferViewChanged();
@@ -354,6 +358,8 @@ public:
 	void disconnectDialog(std::string const & name);
 	///
 	bool develMode() const { return devel_mode_; }
+	///
+	void setCurrentZoom(int const v);
 
 private:
 	/// Saves the layout and geometry of the window


More information about the lyx-cvs mailing list