From 856adef0df50f35ec969b953d34376b4b745f857 Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Tue, 9 Feb 2021 17:17:59 +0200 Subject: [PATCH 1/7] ImportWidget: don't leak a QElapsedTimer Add a local elapsedMs variable to improve readability and performance. Remove some of the redundant parentheses in a long `if` statement to improve readability. --- YACReaderLibrary/import_widget.cpp | 10 ++++------ YACReaderLibrary/import_widget.h | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/YACReaderLibrary/import_widget.cpp b/YACReaderLibrary/import_widget.cpp index ea2ec62b9..128aa3202 100644 --- a/YACReaderLibrary/import_widget.cpp +++ b/YACReaderLibrary/import_widget.cpp @@ -12,8 +12,6 @@ #include //TODO: is QGLWidget needed here??? //#include -#include -#include #include #include @@ -208,8 +206,7 @@ ImportWidget::ImportWidget(QWidget *parent) previousWidth = 0; updatingCovers = false; - elapsedTimer = new QElapsedTimer(); - elapsedTimer->start(); + elapsedTimer.start(); } void ImportWidget::newComic(const QString &path, const QString &coverPath) @@ -219,10 +216,11 @@ void ImportWidget::newComic(const QString &path, const QString &coverPath) currentComicLabel->setText("" + path + ""); - if (((elapsedTimer->elapsed() >= 1100) || ((previousWidth < coversView->width()) && (elapsedTimer->elapsed() >= 500))) && scrollAnimation->state() != QAbstractAnimation::Running) //todo elapsed time + const auto elapsedMs = elapsedTimer.elapsed(); + if ((elapsedMs >= 1100 || (previousWidth < coversView->width() && elapsedMs >= 500)) && scrollAnimation->state() != QAbstractAnimation::Running) //todo elapsed time { updatingCovers = true; - elapsedTimer->start(); + elapsedTimer.start(); QPixmap p(coverPath); p = p.scaledToHeight(300, Qt::SmoothTransformation); diff --git a/YACReaderLibrary/import_widget.h b/YACReaderLibrary/import_widget.h index 78b7daf94..b8d73bca4 100644 --- a/YACReaderLibrary/import_widget.h +++ b/YACReaderLibrary/import_widget.h @@ -1,6 +1,7 @@ #ifndef IMPORT_WIDGET_H #define IMPORT_WIDGET_H +#include #include class ImportWidget : public QWidget @@ -36,7 +37,7 @@ public slots: int previousWidth; bool updatingCovers; - QElapsedTimer *elapsedTimer; + QElapsedTimer elapsedTimer; quint64 i; QToolButton *hideButton; From 9e965469db101c9379b9c606a62a9695d2793656 Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Tue, 9 Feb 2021 17:29:43 +0200 Subject: [PATCH 2/7] Use QElapsedTimer instead of QTime for timing QTime's start(), restart() and elapsed() member functions have been deprecated since Qt 5.14 and were removed in Qt 6. Don't leak the timer object in ScrollManagement. Add a local elapsedMs variable to improve readability and performance. Remove some of the redundant parentheses to improve readability. --- common/pictureflow.cpp | 6 ++++-- common/scroll_management.cpp | 11 ++++++----- common/scroll_management.h | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/common/pictureflow.cpp b/common/pictureflow.cpp index 234da9b2a..c83e7688a 100644 --- a/common/pictureflow.cpp +++ b/common/pictureflow.cpp @@ -96,6 +96,8 @@ #define flush flushX #endif +#include + // for fixed-point arithmetic, we need minimum 32-bit long // long long (64-bit) might be useful for multiplication and division typedef long PFreal; @@ -1278,10 +1280,10 @@ void PictureFlow::resizeEvent(QResizeEvent *event) d->animator->start(centerIndex()); QWidget::resizeEvent(event); } -#include + void PictureFlow::updateAnimation() //bucle principal { - QTime now; + QElapsedTimer now; now.start(); bool frameSkiped = false; diff --git a/common/scroll_management.cpp b/common/scroll_management.cpp index b57165b13..56a721cb6 100644 --- a/common/scroll_management.cpp +++ b/common/scroll_management.cpp @@ -2,8 +2,7 @@ ScrollManagement::ScrollManagement() { - wheelTimer = new QTime(); - wheelTimer->start(); + wheelTimer.start(); wheelAccumulator = 0; } @@ -16,8 +15,10 @@ ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event) int timeThrottle = 16; int minimumMove = 70; + const auto elapsedMs = wheelTimer.elapsed(); + //avoid any events overflood - if ((wheelTimer->elapsed() < tooFast)) { + if (elapsedMs < tooFast) { event->setAccepted(true); return None; } @@ -29,7 +30,7 @@ ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event) wheelAccumulator += event->delta(); //Do not process events too fast - if ((wheelTimer->elapsed() < timeThrottle)) { + if (elapsedMs < timeThrottle) { event->setAccepted(true); return None; } @@ -49,7 +50,7 @@ ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event) event->accept(); //Clean up wheelAccumulator = 0; - wheelTimer->restart(); + wheelTimer.start(); return m; } diff --git a/common/scroll_management.h b/common/scroll_management.h index 3ed9185da..1b76d3ec5 100644 --- a/common/scroll_management.h +++ b/common/scroll_management.h @@ -1,7 +1,7 @@ #ifndef SCROLLMANAGAMENT_H #define SCROLLMANAGAMENT_H -#include +#include #include class ScrollManagement @@ -18,7 +18,7 @@ class ScrollManagement ~ScrollManagement(); private: - QTime *wheelTimer; + QElapsedTimer wheelTimer; int wheelAccumulator; }; From f5edea6e0303303df6479217e87e55b9c3f93e15 Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Tue, 9 Feb 2021 17:41:47 +0200 Subject: [PATCH 3/7] ScrollManagement: declare constants as constexpr --- common/scroll_management.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/scroll_management.cpp b/common/scroll_management.cpp index 56a721cb6..0875baee7 100644 --- a/common/scroll_management.cpp +++ b/common/scroll_management.cpp @@ -11,9 +11,9 @@ ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event) /*QLOG_DEBUG() << "WheelEvent angle delta : " << event->angleDelta(); QLOG_DEBUG() << "WheelEvent pixel delta : " << event->pixelDelta();*/ - int tooFast = 1; - int timeThrottle = 16; - int minimumMove = 70; + constexpr int tooFast = 1; + constexpr int timeThrottle = 16; + constexpr int minimumMove = 70; const auto elapsedMs = wheelTimer.elapsed(); From 11bdc3025f62c537943be77cde8c08ebeb3f1004 Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Tue, 9 Feb 2021 19:16:00 +0200 Subject: [PATCH 4/7] *Flow* classes: use explicit, nullptr, override --- YACReader/goto_flow.h | 2 +- YACReader/goto_flow_gl.h | 4 +-- YACReader/goto_flow_toolbar.h | 2 +- YACReader/goto_flow_widget.h | 2 +- YACReaderLibrary/comic_flow.h | 4 +-- YACReaderLibrary/comic_flow_widget.h | 12 +++---- common/gl/yacreader_flow_gl.h | 34 +++++++++---------- common/onstart_flow_selection_dialog.h | 4 +-- custom_widgets/yacreader_flow.h | 8 ++--- custom_widgets/yacreader_flow_config_widget.h | 4 +-- .../yacreader_gl_flow_config_widget.h | 4 +-- custom_widgets/yacreader_options_dialog.h | 2 +- 12 files changed, 41 insertions(+), 41 deletions(-) diff --git a/YACReader/goto_flow.h b/YACReader/goto_flow.h index 09fe2ce01..b35dfff3f 100644 --- a/YACReader/goto_flow.h +++ b/YACReader/goto_flow.h @@ -31,7 +31,7 @@ class GoToFlow : public GoToFlowWidget { Q_OBJECT public: - GoToFlow(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); + explicit GoToFlow(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); ~GoToFlow() override; bool ready; //comic is ready for read. private: diff --git a/YACReader/goto_flow_gl.h b/YACReader/goto_flow_gl.h index 0e827164f..e2fe8cc7b 100644 --- a/YACReader/goto_flow_gl.h +++ b/YACReader/goto_flow_gl.h @@ -16,7 +16,7 @@ class GoToFlowGL : public GoToFlowWidget { Q_OBJECT public: - GoToFlowGL(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); + explicit GoToFlowGL(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); ~GoToFlowGL() override; void reset() override; void centerSlide(int slide) override; @@ -24,7 +24,7 @@ class GoToFlowGL : public GoToFlowWidget void setNumSlides(unsigned int slides) override; void setImageReady(int index, const QByteArray &image) override; - void updateConfig(QSettings *settings); + void updateConfig(QSettings *settings) override; void setFlowRightToLeft(bool b) override; signals: diff --git a/YACReader/goto_flow_toolbar.h b/YACReader/goto_flow_toolbar.h index 0fae68847..e9a97884d 100644 --- a/YACReader/goto_flow_toolbar.h +++ b/YACReader/goto_flow_toolbar.h @@ -24,7 +24,7 @@ class GoToFlowToolBar : public QStackedWidget void paintEvent(QPaintEvent *) override; public: - GoToFlowToolBar(QWidget *parent = nullptr); + explicit GoToFlowToolBar(QWidget *parent = nullptr); public slots: void setPage(int pageNumber); diff --git a/YACReader/goto_flow_widget.h b/YACReader/goto_flow_widget.h index 95a76578f..04f2b1792 100644 --- a/YACReader/goto_flow_widget.h +++ b/YACReader/goto_flow_widget.h @@ -19,7 +19,7 @@ class GoToFlowWidget : public QWidget GoToFlowToolBar *toolBar; public: - GoToFlowWidget(QWidget *paret = nullptr); + explicit GoToFlowWidget(QWidget *paret = nullptr); ~GoToFlowWidget() override = 0; public slots: virtual void reset() = 0; diff --git a/YACReaderLibrary/comic_flow.h b/YACReaderLibrary/comic_flow.h index a7f0627f7..cca2c22dd 100644 --- a/YACReaderLibrary/comic_flow.h +++ b/YACReaderLibrary/comic_flow.h @@ -18,7 +18,7 @@ class ComicFlow : public YACReaderFlow { Q_OBJECT public: - ComicFlow(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); + explicit ComicFlow(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); ~ComicFlow() override; void setImagePaths(const QStringList &paths); @@ -41,7 +41,7 @@ private slots: int workerIndex; QTimer updateTimer; std::unique_ptr> worker; - virtual void wheelEvent(QWheelEvent *event); + void wheelEvent(QWheelEvent *event) override; }; #endif diff --git a/YACReaderLibrary/comic_flow_widget.h b/YACReaderLibrary/comic_flow_widget.h index 69cdf2917..a02d8c006 100644 --- a/YACReaderLibrary/comic_flow_widget.h +++ b/YACReaderLibrary/comic_flow_widget.h @@ -12,7 +12,7 @@ class ComicFlowWidget : public QWidget { Q_OBJECT public: - ComicFlowWidget(QWidget *paret = nullptr); + explicit ComicFlowWidget(QWidget *paret = nullptr); public slots: virtual void setShowMarks(bool value) = 0; @@ -44,7 +44,7 @@ class ComicFlowWidgetSW : public ComicFlowWidget ComicFlow *flow; public: - ComicFlowWidgetSW(QWidget *parent = nullptr); + explicit ComicFlowWidgetSW(QWidget *parent = nullptr); void setShowMarks(bool value) override; void setMarks(QVector marks) override; @@ -56,7 +56,7 @@ class ComicFlowWidgetSW : public ComicFlowWidget void setImagePaths(QStringList paths) override; void setCenterIndex(int index) override; void showSlide(int index) override; - int centerIndex(); + int centerIndex() override; void updateMarks() override; void setFlowType(FlowType flowType) override; void render() override; @@ -70,7 +70,7 @@ class ComicFlowWidgetSW : public ComicFlowWidget void mousePressEvent(QMouseEvent *event) override; void resizeEvent(QResizeEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; - QSize minimumSizeHint() const; + QSize minimumSizeHint() const override; QSize sizeHint() const override; QSize slideSizeW; QSize slideSizeF; @@ -84,7 +84,7 @@ class ComicFlowWidgetGL : public ComicFlowWidget YACReaderComicFlowGL *flow; public: - ComicFlowWidgetGL(QWidget *parent = nullptr); + explicit ComicFlowWidgetGL(QWidget *parent = nullptr); void setShowMarks(bool value) override; void setMarks(QVector marks) override; @@ -96,7 +96,7 @@ class ComicFlowWidgetGL : public ComicFlowWidget void setImagePaths(QStringList paths) override; void setCenterIndex(int index) override; void showSlide(int index) override; - int centerIndex(); + int centerIndex() override; void updateMarks() override; void setFlowType(FlowType flowType) override; void render() override; diff --git a/common/gl/yacreader_flow_gl.h b/common/gl/yacreader_flow_gl.h index c47345d86..99f2ad989 100644 --- a/common/gl/yacreader_flow_gl.h +++ b/common/gl/yacreader_flow_gl.h @@ -122,9 +122,9 @@ class YACReaderFlowGL : public QOpenGLWidget, public ScrollManagement QOpenGLTexture *defaultTexture = nullptr; QOpenGLTexture *markTexture = nullptr; QOpenGLTexture *readingTexture = nullptr; - void initializeGL(); - void paintGL(); - void timerEvent(QTimerEvent *); + void initializeGL() override; + void paintGL() override; + void timerEvent(QTimerEvent *) override; //number of Covers int numObjects; @@ -172,11 +172,11 @@ class YACReaderFlowGL : public QOpenGLWidget, public ScrollManagement public: /*Constructor*/ - YACReaderFlowGL(QWidget *parent = 0, struct Preset p = pressetYACReaderFlowDownConfig); - virtual ~YACReaderFlowGL(); + explicit YACReaderFlowGL(QWidget *parent = nullptr, struct Preset p = pressetYACReaderFlowDownConfig); + ~YACReaderFlowGL() override; //size; - QSize minimumSizeHint() const; + QSize minimumSizeHint() const override; //QSize sizeHint() const; /*functions*/ @@ -267,11 +267,11 @@ public slots: //void paintEvent(QPaintEvent *event); QVector3D getPlaneIntersection(int x, int y, YACReader3DImage plane); - void mouseDoubleClickEvent(QMouseEvent *event); - void mousePressEvent(QMouseEvent *event); - void wheelEvent(QWheelEvent *event); - void keyPressEvent(QKeyEvent *event); - void resizeGL(int width, int height); + void mouseDoubleClickEvent(QMouseEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + void resizeGL(int width, int height) override; friend class ImageLoaderGL; friend class ImageLoaderByteArrayGL; @@ -283,10 +283,10 @@ public slots: class YACReaderComicFlowGL : public YACReaderFlowGL { public: - YACReaderComicFlowGL(QWidget *parent = 0, struct Preset p = defaultYACReaderFlowConfig); + explicit YACReaderComicFlowGL(QWidget *parent = nullptr, struct Preset p = defaultYACReaderFlowConfig); void setImagePaths(QStringList paths); - void updateImageData(); - void remove(int item); + void updateImageData() override; + void remove(int item) override; void resortCovers(QList newOrder); friend class ImageLoaderGL; @@ -300,9 +300,9 @@ class YACReaderComicFlowGL : public YACReaderFlowGL class YACReaderPageFlowGL : public YACReaderFlowGL { public: - YACReaderPageFlowGL(QWidget *parent = 0, struct Preset p = defaultYACReaderFlowConfig); - ~YACReaderPageFlowGL(); - void updateImageData(); + explicit YACReaderPageFlowGL(QWidget *parent = nullptr, struct Preset p = defaultYACReaderFlowConfig); + ~YACReaderPageFlowGL() override; + void updateImageData() override; void populate(int n); QVector imagesReady; QVector rawImages; diff --git a/common/onstart_flow_selection_dialog.h b/common/onstart_flow_selection_dialog.h index 8d70a45b1..60a7a8e6b 100644 --- a/common/onstart_flow_selection_dialog.h +++ b/common/onstart_flow_selection_dialog.h @@ -7,7 +7,7 @@ class OnStartFlowSelectionDialog : public QDialog { Q_OBJECT public: - OnStartFlowSelectionDialog(QWidget *parent = 0); + explicit OnStartFlowSelectionDialog(QWidget *parent = nullptr); }; -#endif \ No newline at end of file +#endif diff --git a/custom_widgets/yacreader_flow.h b/custom_widgets/yacreader_flow.h index d08ae3a88..9b932d4d5 100644 --- a/custom_widgets/yacreader_flow.h +++ b/custom_widgets/yacreader_flow.h @@ -9,13 +9,13 @@ class YACReaderFlow : public PictureFlow { Q_OBJECT public: - YACReaderFlow(QWidget *parent, FlowType flowType = CoverFlowLike); + explicit YACReaderFlow(QWidget *parent, FlowType flowType = CoverFlowLike); - void mousePressEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; signals: void selected(unsigned int centerIndex); }; -#endif // YACREADER_FLOW_H \ No newline at end of file +#endif // YACREADER_FLOW_H diff --git a/custom_widgets/yacreader_flow_config_widget.h b/custom_widgets/yacreader_flow_config_widget.h index 2d23d4620..f84376922 100644 --- a/custom_widgets/yacreader_flow_config_widget.h +++ b/custom_widgets/yacreader_flow_config_widget.h @@ -13,7 +13,7 @@ class YACReaderFlowConfigWidget : public QWidget QRadioButton *radio2; QRadioButton *radio3; - YACReaderFlowConfigWidget(QWidget *parent = 0); + explicit YACReaderFlowConfigWidget(QWidget *parent = nullptr); }; -#endif // YACREADER_FLOW_CONFIG_WIDGET_H \ No newline at end of file +#endif // YACREADER_FLOW_CONFIG_WIDGET_H diff --git a/custom_widgets/yacreader_gl_flow_config_widget.h b/custom_widgets/yacreader_gl_flow_config_widget.h index 8a3e0be97..d6d12efc8 100644 --- a/custom_widgets/yacreader_gl_flow_config_widget.h +++ b/custom_widgets/yacreader_gl_flow_config_widget.h @@ -15,7 +15,7 @@ class YACReaderGLFlowConfigWidget : public QWidget { Q_OBJECT public: - YACReaderGLFlowConfigWidget(QWidget *parent = 0); + explicit YACReaderGLFlowConfigWidget(QWidget *parent = nullptr); //GL......................... QRadioButton *radioClassic; @@ -47,4 +47,4 @@ public slots: void avancedOptionToogled(bool show); }; -#endif // YACREADER_GL_FLOW_CONFIG_WIDGET_H \ No newline at end of file +#endif // YACREADER_GL_FLOW_CONFIG_WIDGET_H diff --git a/custom_widgets/yacreader_options_dialog.h b/custom_widgets/yacreader_options_dialog.h index 4669e0d6a..4635175d9 100644 --- a/custom_widgets/yacreader_options_dialog.h +++ b/custom_widgets/yacreader_options_dialog.h @@ -31,7 +31,7 @@ class YACReaderOptionsDialog : public QDialog QSettings *previousSettings; public: - YACReaderOptionsDialog(QWidget *parent); + explicit YACReaderOptionsDialog(QWidget *parent); public slots: virtual void restoreOptions(QSettings *settings); virtual void restoreOptions(); From 13665e8761d5d8b1797b26ae2566d441da33ad32 Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Tue, 9 Feb 2021 20:09:54 +0200 Subject: [PATCH 5/7] YACReaderFlow: use ScrollManagement to handle wheelEvent() GoToFlow and ComicFlow are the only two classes that use YACReaderFlow. They both handled wheelEvent() manually in practically the same way as YACReaderFlow does now, except for time and minimum move checks in ScrollManagement::getMovement(). This new implementation is equivalent to and consistent with the OpenGL version in YACReaderFlowGL::wheelEvent(). --- YACReader/goto_flow.cpp | 9 --------- YACReader/goto_flow.h | 1 - YACReaderLibrary/comic_flow.cpp | 9 --------- YACReaderLibrary/comic_flow.h | 2 -- custom_widgets/yacreader_flow.cpp | 15 +++++++++++++++ custom_widgets/yacreader_flow.h | 7 +++++++ 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/YACReader/goto_flow.cpp b/YACReader/goto_flow.cpp index 01a63aa88..ea1d0dfab 100644 --- a/YACReader/goto_flow.cpp +++ b/YACReader/goto_flow.cpp @@ -193,15 +193,6 @@ void GoToFlow::updateImageData() updateTimer->stop(); } -void GoToFlow::wheelEvent(QWheelEvent *event) -{ - if (event->delta() < 0) - flow->showNext(); - else - flow->showPrevious(); - event->accept(); -} - void GoToFlow::setFlowType(FlowType flowType) { flow->setFlowType(flowType); diff --git a/YACReader/goto_flow.h b/YACReader/goto_flow.h index b35dfff3f..d1ed7c1b5 100644 --- a/YACReader/goto_flow.h +++ b/YACReader/goto_flow.h @@ -47,7 +47,6 @@ class GoToFlow : public GoToFlowWidget QVector rawImages; QTimer *updateTimer; PageLoader *worker; - void wheelEvent(QWheelEvent *event) override; QMutex mutexGoToFlow; private slots: diff --git a/YACReaderLibrary/comic_flow.cpp b/YACReaderLibrary/comic_flow.cpp index f6bf38aeb..6c244a24d 100644 --- a/YACReaderLibrary/comic_flow.cpp +++ b/YACReaderLibrary/comic_flow.cpp @@ -103,15 +103,6 @@ void ComicFlow::keyPressEvent(QKeyEvent *event) PictureFlow::keyPressEvent(event); } -void ComicFlow::wheelEvent(QWheelEvent *event) -{ - if (event->delta() < 0) - showNext(); - else - showPrevious(); - event->accept(); -} - void ComicFlow::removeSlide(int cover) { imageFiles.removeAt(cover); diff --git a/YACReaderLibrary/comic_flow.h b/YACReaderLibrary/comic_flow.h index cca2c22dd..a147b3645 100644 --- a/YACReaderLibrary/comic_flow.h +++ b/YACReaderLibrary/comic_flow.h @@ -7,7 +7,6 @@ #include #include #include -#include #include @@ -41,7 +40,6 @@ private slots: int workerIndex; QTimer updateTimer; std::unique_ptr> worker; - void wheelEvent(QWheelEvent *event) override; }; #endif diff --git a/custom_widgets/yacreader_flow.cpp b/custom_widgets/yacreader_flow.cpp index f930136eb..6c882b8a4 100644 --- a/custom_widgets/yacreader_flow.cpp +++ b/custom_widgets/yacreader_flow.cpp @@ -1,6 +1,7 @@ #include "yacreader_flow.h" #include +#include YACReaderFlow::YACReaderFlow(QWidget *parent, FlowType flowType) : PictureFlow(parent, flowType) { } @@ -15,3 +16,17 @@ void YACReaderFlow::mouseDoubleClickEvent(QMouseEvent *event) if ((event->x() > (width() - slideSize().width()) / 2) && (event->x() < (width() + slideSize().width()) / 2)) emit selected(centerIndex()); } + +void YACReaderFlow::wheelEvent(QWheelEvent *event) +{ + switch (scrollManagement.getMovement(event)) { + case ScrollManagement::None: + break; + case ScrollManagement::Forward: + showNext(); + break; + case ScrollManagement::Backward: + showPrevious(); + break; + } +} diff --git a/custom_widgets/yacreader_flow.h b/custom_widgets/yacreader_flow.h index 9b932d4d5..9ed63f960 100644 --- a/custom_widgets/yacreader_flow.h +++ b/custom_widgets/yacreader_flow.h @@ -1,6 +1,7 @@ #ifndef YACREADER_FLOW_H #define YACREADER_FLOW_H +#include "scroll_management.h" #include "pictureflow.h" class QMouseEvent; @@ -16,6 +17,12 @@ class YACReaderFlow : public PictureFlow signals: void selected(unsigned int centerIndex); + +protected: + void wheelEvent(QWheelEvent *event) override; + +private: + ScrollManagement scrollManagement; }; #endif // YACREADER_FLOW_H From 1fb50f9fdc5c5bc48a195a1266699ac216478b13 Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Tue, 9 Feb 2021 20:17:39 +0200 Subject: [PATCH 6/7] Port ScrollManagement and Viewer away from deprecated QWheelEvent API QWheelEvent::orientation() and QWheelEvent::delta() are deprecated. The documentation for both suggests using QWheelEvent::angleDelta() instead. Keep treating the horizontal mouse wheel the same as vertical in Comic and Page Flow: comics and pages move horizontally, so horizontal scrolling is even more natural than vertical in these cases. Viewer handles horizontal scrolling separately - to scroll the comic page to the right or to the left. So ScrollManagement must ignore horizontal delta in this case. For this purpose the new parameter in ScrollManagement::getMovement() determines which orientations are taken into account: horizontal, vertical or both. Remove redundant parentheses in long `if` statements to improve readability. --- YACReader/viewer.cpp | 20 ++++++++++++-------- common/scroll_management.cpp | 20 ++++++++++++++++---- common/scroll_management.h | 3 ++- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/YACReader/viewer.cpp b/YACReader/viewer.cpp index 9d96e5b66..ec63dc7f2 100644 --- a/YACReader/viewer.cpp +++ b/YACReader/viewer.cpp @@ -691,14 +691,18 @@ static void animateScroll(QPropertyAnimation &scroller, const QScrollBar &scroll void Viewer::wheelEvent(QWheelEvent *event) { if (render->hasLoadedComic()) { - if (event->orientation() == Qt::Horizontal) { - animateScroll(*horizontalScroller, *horizontalScrollBar(), event->delta()); - return; + const auto delta = event->angleDelta(); + const auto verticalDelta = delta.y(); + + if (delta.x() != 0) { + animateScroll(*horizontalScroller, *horizontalScrollBar(), delta.x()); + if (verticalDelta == 0) + return; // Pure horizontal scrolling => don't try to handle vertical delta. } - if ((event->delta() < 0) && (verticalScrollBar()->sliderPosition() == verticalScrollBar()->maximum())) { + if (verticalDelta < 0 && verticalScrollBar()->sliderPosition() == verticalScrollBar()->maximum()) { if (wheelStop) { - if (getMovement(event) == Forward) { + if (getMovement(event, Qt::Vertical) == Forward) { next(); verticalScroller->stop(); event->accept(); @@ -708,9 +712,9 @@ void Viewer::wheelEvent(QWheelEvent *event) } else wheelStop = true; } else { - if ((event->delta() > 0) && (verticalScrollBar()->sliderPosition() == verticalScrollBar()->minimum())) { + if (verticalDelta > 0 && verticalScrollBar()->sliderPosition() == verticalScrollBar()->minimum()) { if (wheelStop) { - if (getMovement(event) == Backward) { + if (getMovement(event, Qt::Vertical) == Backward) { prev(); verticalScroller->stop(); event->accept(); @@ -722,7 +726,7 @@ void Viewer::wheelEvent(QWheelEvent *event) } } - animateScroll(*verticalScroller, *verticalScrollBar(), event->delta()); + animateScroll(*verticalScroller, *verticalScrollBar(), verticalDelta); } } diff --git a/common/scroll_management.cpp b/common/scroll_management.cpp index 0875baee7..0d249af66 100644 --- a/common/scroll_management.cpp +++ b/common/scroll_management.cpp @@ -1,12 +1,24 @@ #include "scroll_management.h" +namespace { +int orientedDelta(const QPoint &delta, Qt::Orientations orientations) +{ + int result = 0; + if (orientations & Qt::Horizontal) + result += delta.x(); + if (orientations & Qt::Vertical) + result += delta.y(); + return result; +} +} + ScrollManagement::ScrollManagement() { wheelTimer.start(); wheelAccumulator = 0; } -ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event) +ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event, Qt::Orientations orientations) { /*QLOG_DEBUG() << "WheelEvent angle delta : " << event->angleDelta(); QLOG_DEBUG() << "WheelEvent pixel delta : " << event->pixelDelta();*/ @@ -23,11 +35,11 @@ ScrollManagement::Movement ScrollManagement::getMovement(QWheelEvent *event) return None; } + const auto delta = orientedDelta(event->angleDelta(), orientations); // Accumulate the delta - if ((event->delta() < 0) != (wheelAccumulator < 0)) //different sign means change in direction + if ((delta < 0) != (wheelAccumulator < 0)) //different sign means change in direction wheelAccumulator = 0; - - wheelAccumulator += event->delta(); + wheelAccumulator += delta; //Do not process events too fast if (elapsedMs < timeThrottle) { diff --git a/common/scroll_management.h b/common/scroll_management.h index 1b76d3ec5..91e6f40f8 100644 --- a/common/scroll_management.h +++ b/common/scroll_management.h @@ -14,7 +14,8 @@ class ScrollManagement }; ScrollManagement(); - ScrollManagement::Movement getMovement(QWheelEvent *event); + ScrollManagement::Movement getMovement(QWheelEvent *event, + Qt::Orientations orientations = Qt::Horizontal | Qt::Vertical); ~ScrollManagement(); private: From c8f0be934611c584f13e6063b76bb564baa2363b Mon Sep 17 00:00:00 2001 From: Igor Kushnir Date: Wed, 10 Feb 2021 16:44:06 +0200 Subject: [PATCH 7/7] Port MagnifyingGlass away from deprecated QWheelEvent::delta() Keep treating horizontal and vertical scrolling equivalently. --- YACReader/magnifying_glass.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/YACReader/magnifying_glass.cpp b/YACReader/magnifying_glass.cpp index a7c9492b1..692a81fb4 100644 --- a/YACReader/magnifying_glass.cpp +++ b/YACReader/magnifying_glass.cpp @@ -141,31 +141,34 @@ void MagnifyingGlass::updateImage() } void MagnifyingGlass::wheelEvent(QWheelEvent *event) { + // TODO: consider handling horizontal scrolling differently. + const auto delta = event->angleDelta().x() + event->angleDelta().y(); + const bool grow = delta < 0; switch (event->modifiers()) { //size case Qt::NoModifier: - if (event->delta() < 0) + if (grow) sizeUp(); else sizeDown(); break; //size height case Qt::ControlModifier: - if (event->delta() < 0) + if (grow) heightUp(); else heightDown(); break; //size width case Qt::AltModifier: - if (event->delta() < 0) + if (grow) widthUp(); else widthDown(); break; //zoom level case Qt::ShiftModifier: - if (event->delta() < 0) + if (grow) zoomIn(); else zoomOut();