11#include " document.hpp"
2+ #include " document_access.hpp"
23#include < QApplication>
34#include < QDesktopServices>
45#include < QPair>
56#include < QRandomGenerator>
67#include < QSGImageNode>
78#include < QSGSimpleRectNode>
8- #include " document_access.hpp "
9+ #include < cmath >
910
1011namespace cpp_elements
1112{
@@ -143,7 +144,7 @@ void Document::wheelEvent(QWheelEvent* event)
143144 int deltaY = event->angleDelta ().y ();
144145 int deltaX = event->angleDelta ().x ();
145146 if (event->modifiers () & Qt::ControlModifier)
146- applyZoom (calculateNewZoom (deltaY), ZoomMode::Mouse);
147+ applyZoom (calculateNewZoom (deltaY, m_zoomFactor ), ZoomMode::Mouse);
147148 else
148149 handleScroll (deltaY, deltaX);
149150
@@ -165,7 +166,7 @@ void Document::keyPressEvent(QKeyEvent* event)
165166 {
166167 if (event->modifiers () & Qt::ControlModifier)
167168 {
168- applyZoom (calculateNewZoom (-15 ), ZoomMode::Keyboard);
169+ applyZoom (calculateNewZoom (-15 , m_zoomFactor ), ZoomMode::Keyboard);
169170 }
170171 }
171172 else if (key == getShortcut (" PageDown" ))
@@ -175,12 +176,31 @@ void Document::keyPressEvent(QKeyEvent* event)
175176 // Need to handle CTRL + differently bc. it Key_Plus isn't recognized
176177 else if (event->key () == Qt::Key_Plus || event->nativeVirtualKey () == 187 )
177178 {
178- applyZoom (calculateNewZoom (15 ), ZoomMode::Keyboard);
179+ applyZoom (calculateNewZoom (15 , m_zoomFactor ), ZoomMode::Keyboard);
179180 }
180181
181182 event->accept ();
182183}
183184
185+ bool Document::event (QEvent *event)
186+ {
187+ if (event->type () == QEvent::NativeGesture) {
188+ auto *gestureEvent = static_cast <QNativeGestureEvent *>(event);
189+
190+ if (gestureEvent->gestureType () == Qt::ZoomNativeGesture) {
191+ qreal zoomDelta = gestureEvent->value ();
192+
193+ qreal newZoom = calculateNewZoom (zoomDelta, std::abs (zoomDelta));
194+ applyZoom (newZoom, ZoomMode::Mouse);
195+
196+ gestureEvent->accept ();
197+ return true ;
198+ }
199+ }
200+
201+ return QQuickItem::event (event);
202+ }
203+
184204void Document::redrawPages ()
185205{
186206 if (m_openedBookController == nullptr )
@@ -314,13 +334,19 @@ void Document::moveY(int amount)
314334 ensureInBounds ();
315335}
316336
317- double Document::calculateNewZoom (int deltaY)
337+ double Document::calculateNewZoom (double deltaY, double zoomFactor )
318338{
319- return m_currentZoom * (deltaY > 0 ? 1 + m_zoomFactor : 1 - m_zoomFactor );
339+ return m_currentZoom * (deltaY > 0 ? 1 + zoomFactor : 1 - zoomFactor );
320340}
321341
322342void Document::applyZoom (double newZoom, ZoomMode zoomMode)
323343{
344+ // Avoid excessive zooms that could cause performance issues
345+ if (newZoom > 10 )
346+ newZoom = 10 ;
347+ else if (newZoom < 0.2 )
348+ newZoom = 0.2 ;
349+
324350 double scale = newZoom / m_currentZoom;
325351 m_currentZoom = newZoom;
326352 emit currentZoomChanged ();
@@ -330,8 +356,7 @@ void Document::applyZoom(double newZoom, ZoomMode zoomMode)
330356 else if (zoomMode == ZoomMode::Mouse)
331357 m_contentY = contentYForMouseZoom (scale);
332358
333- if (m_contentY < 0 )
334- m_contentY = 0 ;
359+ m_contentY = m_contentY < 0 ? 0 : m_contentY; // Ensure not out of bounds
335360
336361 m_contentItem->setHeight ((m_pageHeight + m_spacing) *
337362 m_openedBookController->getPageCount () *
0 commit comments