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 09fe2ce01..d1ed7c1b5 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: @@ -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/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/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(); 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/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 a7f0627f7..a147b3645 100644 --- a/YACReaderLibrary/comic_flow.h +++ b/YACReaderLibrary/comic_flow.h @@ -7,7 +7,6 @@ #include #include #include -#include #include @@ -18,7 +17,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 +40,6 @@ private slots: int workerIndex; QTimer updateTimer; std::unique_ptr> worker; - virtual void wheelEvent(QWheelEvent *event); }; #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/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; 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/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..0d249af66 100644 --- a/common/scroll_management.cpp +++ b/common/scroll_management.cpp @@ -1,35 +1,48 @@ #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 = new QTime(); - wheelTimer->start(); + 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();*/ - 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(); //avoid any events overflood - if ((wheelTimer->elapsed() < tooFast)) { + if (elapsedMs < tooFast) { event->setAccepted(true); 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 ((wheelTimer->elapsed() < timeThrottle)) { + if (elapsedMs < timeThrottle) { event->setAccepted(true); return None; } @@ -49,7 +62,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..91e6f40f8 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 @@ -14,11 +14,12 @@ class ScrollManagement }; ScrollManagement(); - ScrollManagement::Movement getMovement(QWheelEvent *event); + ScrollManagement::Movement getMovement(QWheelEvent *event, + Qt::Orientations orientations = Qt::Horizontal | Qt::Vertical); ~ScrollManagement(); private: - QTime *wheelTimer; + QElapsedTimer wheelTimer; int wheelAccumulator; }; 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 d08ae3a88..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; @@ -9,13 +10,19 @@ 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); + +protected: + void wheelEvent(QWheelEvent *event) override; + +private: + ScrollManagement scrollManagement; }; -#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();