From 7db47f91473df370fafa4ddf730ba3156227b937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 3 May 2025 15:10:16 +0200 Subject: [PATCH 1/9] Extract mouse handling events to it's own class --- YACReader/YACReader.pro | 2 + YACReader/mouse_handler.cpp | 97 +++++++++++++++++++++++++++++++++++++ YACReader/mouse_handler.h | 23 +++++++++ YACReader/viewer.cpp | 73 +++------------------------- YACReader/viewer.h | 6 +++ 5 files changed, 136 insertions(+), 65 deletions(-) create mode 100644 YACReader/mouse_handler.cpp create mode 100644 YACReader/mouse_handler.h diff --git a/YACReader/YACReader.pro b/YACReader/YACReader.pro index b57683da..d50940f8 100644 --- a/YACReader/YACReader.pro +++ b/YACReader/YACReader.pro @@ -80,6 +80,7 @@ HEADERS += ../common/comic.h \ goto_dialog.h \ magnifying_glass.h \ main_window_viewer.h \ + mouse_handler.h \ viewer.h \ goto_flow.h \ options_dialog.h \ @@ -119,6 +120,7 @@ SOURCES += ../common/comic.cpp \ goto_dialog.cpp \ magnifying_glass.cpp \ main_window_viewer.cpp \ + mouse_handler.cpp \ viewer.cpp \ goto_flow.cpp \ options_dialog.cpp \ diff --git a/YACReader/mouse_handler.cpp b/YACReader/mouse_handler.cpp new file mode 100644 index 00000000..390f0948 --- /dev/null +++ b/YACReader/mouse_handler.cpp @@ -0,0 +1,97 @@ +#include "mouse_handler.h" + +#include + +#include "configuration.h" +#include "magnifying_glass.h" +#include "render.h" +#include "viewer.h" + +#include "goto_flow.h" +#ifndef NO_OPENGL +#include "goto_flow_gl.h" +#else +#include +#endif + +using namespace YACReader; + +YACReader::MouseHandler::MouseHandler(Viewer *viewer) + : viewer(viewer) +{ +} + +void YACReader::MouseHandler::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + viewer->drag = true; + auto position = event->position(); + viewer->yDragOrigin = position.y(); + viewer->xDragOrigin = position.x(); + viewer->setCursor(Qt::ClosedHandCursor); + event->accept(); + return; + } +} + +void YACReader::MouseHandler::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + viewer->drag = false; + viewer->setCursor(Qt::OpenHandCursor); + event->accept(); + return; + } + + if (event->button() == Qt::ForwardButton) { + viewer->right(); + event->accept(); + return; + } + + if (event->button() == Qt::BackButton) { + viewer->left(); + event->accept(); + return; + } +} + +void YACReader::MouseHandler::mouseMoveEvent(QMouseEvent *event) +{ + viewer->showCursor(); + viewer->hideCursorTimer->start(2500); + + auto position = event->position(); + + if (viewer->magnifyingGlassShown) + viewer->mglass->move(static_cast(position.x() - float(viewer->mglass->width()) / 2), static_cast(position.y() - float(viewer->mglass->height()) / 2)); + + if (viewer->render->hasLoadedComic()) { + if (viewer->showGoToFlowAnimation->state() != QPropertyAnimation::Running) { + if (Configuration::getConfiguration().getDisableShowOnMouseOver() == false) { + if (viewer->goToFlow->isVisible()) { + QPoint gtfPos = viewer->goToFlow->mapFrom(this->viewer, event->pos()); + if (gtfPos.y() < 0 || gtfPos.x() < 0 || gtfPos.x() > viewer->goToFlow->width()) // TODO this extra check is for Mavericks (mouseMove over goToFlowGL seems to be broken) + viewer->animateHideGoToFlow(); + // goToFlow->hide(); + } else { + int umbral = (viewer->width() - viewer->goToFlow->width()) / 2; + if ((position.y() > viewer->height() - 15) && (position.x() > umbral) && (position.x() < viewer->width() - umbral)) { + + viewer->animateShowGoToFlow(); + viewer->hideCursorTimer->stop(); + } + } + } + } + + if (viewer->drag) { + int currentPosY = viewer->verticalScrollBar()->sliderPosition(); + int currentPosX = viewer->horizontalScrollBar()->sliderPosition(); + viewer->verticalScrollBar()->setSliderPosition(currentPosY + (viewer->yDragOrigin - position.y())); + viewer->horizontalScrollBar()->setSliderPosition(currentPosX + (viewer->xDragOrigin - position.x())); + viewer->yDragOrigin = position.y(); + viewer->xDragOrigin = position.x(); + } + } +} diff --git a/YACReader/mouse_handler.h b/YACReader/mouse_handler.h new file mode 100644 index 00000000..276e558f --- /dev/null +++ b/YACReader/mouse_handler.h @@ -0,0 +1,23 @@ +#ifndef MOUSE_HANDLER_H +#define MOUSE_HANDLER_H + +#include + +class Viewer; + +namespace YACReader { +class MouseHandler +{ +public: + MouseHandler(Viewer *viewer); + + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + +private: + Viewer *viewer; +}; +} + +#endif // MOUSE_HANDLER_H diff --git a/YACReader/viewer.cpp b/YACReader/viewer.cpp index 7d6fe242..45e7ef13 100644 --- a/YACReader/viewer.cpp +++ b/YACReader/viewer.cpp @@ -1,5 +1,4 @@ #include "viewer.h" -#include "magnifying_glass.h" #include "configuration.h" #include "magnifying_glass.h" #include "goto_flow.h" @@ -38,7 +37,8 @@ Viewer::Viewer(QWidget *parent) shouldOpenNext(false), shouldOpenPrevious(false), magnifyingGlassShown(false), - restoreMagnifyingGlass(false) + restoreMagnifyingGlass(false), + mouseHandler(std::make_unique(this)) { translator = new YACReaderTranslator(this); translator->hide(); @@ -767,44 +767,6 @@ void Viewer::resizeEvent(QResizeEvent *event) QScrollArea::resizeEvent(event); } -void Viewer::mouseMoveEvent(QMouseEvent *event) -{ - showCursor(); - hideCursorTimer->start(2500); - - if (magnifyingGlassShown) - mglass->move(static_cast(event->x() - float(mglass->width()) / 2), static_cast(event->y() - float(mglass->height()) / 2)); - - if (render->hasLoadedComic()) { - if (showGoToFlowAnimation->state() != QPropertyAnimation::Running) { - if (Configuration::getConfiguration().getDisableShowOnMouseOver() == false) { - if (goToFlow->isVisible()) { - QPoint gtfPos = goToFlow->mapFrom(this, event->pos()); - if (gtfPos.y() < 0 || gtfPos.x() < 0 || gtfPos.x() > goToFlow->width()) // TODO this extra check is for Mavericks (mouseMove over goToFlowGL seems to be broken) - animateHideGoToFlow(); - // goToFlow->hide(); - } else { - int umbral = (width() - goToFlow->width()) / 2; - if ((event->y() > height() - 15) && (event->x() > umbral) && (event->x() < width() - umbral)) { - - animateShowGoToFlow(); - hideCursorTimer->stop(); - } - } - } - } - - if (drag) { - int currentPosY = verticalScrollBar()->sliderPosition(); - int currentPosX = horizontalScrollBar()->sliderPosition(); - verticalScrollBar()->setSliderPosition(currentPosY + (yDragOrigin - event->y())); - horizontalScrollBar()->setSliderPosition(currentPosX + (xDragOrigin - event->x())); - yDragOrigin = event->y(); - xDragOrigin = event->x(); - } - } -} - QPixmap Viewer::pixmap() const { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -1093,36 +1055,17 @@ void Viewer::animateHideTranslator() void Viewer::mousePressEvent(QMouseEvent *event) { - if (event->button() == Qt::LeftButton) { - drag = true; - yDragOrigin = event->y(); - xDragOrigin = event->x(); - setCursor(Qt::ClosedHandCursor); - event->accept(); - return; - } + mouseHandler->mousePressEvent(event); } void Viewer::mouseReleaseEvent(QMouseEvent *event) { - if (event->button() == Qt::LeftButton) { - drag = false; - setCursor(Qt::OpenHandCursor); - event->accept(); - return; - } + mouseHandler->mouseReleaseEvent(event); +} - if (event->button() == Qt::ForwardButton) { - right(); - event->accept(); - return; - } - - if (event->button() == Qt::BackButton) { - left(); - event->accept(); - return; - } +void Viewer::mouseMoveEvent(QMouseEvent *event) +{ + mouseHandler->mouseMoveEvent(event); } void Viewer::updateZoomRatio(int ratio) diff --git a/YACReader/viewer.h b/YACReader/viewer.h index 5dd43348..cb955c89 100644 --- a/YACReader/viewer.h +++ b/YACReader/viewer.h @@ -17,6 +17,7 @@ #include #include "scroll_management.h" +#include "mouse_handler.h" class ComicDB; class Comic; @@ -185,6 +186,9 @@ private: int animationDuration() const; void animateScroll(QPropertyAnimation &scroller, const QScrollBar &scrollBar, int delta); + //! Mouse handler + std::unique_ptr mouseHandler; + public: Viewer(QWidget *parent = nullptr); ~Viewer(); @@ -213,6 +217,8 @@ signals: void magnifyingGlassZoomIn(); void magnifyingGlassZoomOut(); void resetMagnifyingGlass(); + + friend class YACReader::MouseHandler; }; #endif From 257436c040446912edee85623e5c28887a0cd759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 3 May 2025 15:44:41 +0200 Subject: [PATCH 2/9] Move FitMode to configuration.h --- YACReader/configuration.h | 14 ++++++++++++++ common/yacreader_global_gui.h | 8 -------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/YACReader/configuration.h b/YACReader/configuration.h index fe29803e..c47ffd49 100644 --- a/YACReader/configuration.h +++ b/YACReader/configuration.h @@ -1,5 +1,6 @@ #ifndef __CONFIGURATION_H #define __CONFIGURATION_H + #include #include #include @@ -15,6 +16,16 @@ using namespace YACReader; +namespace YACReader { + +enum FitMode { + ToWidth = 0x01, + ToHeight = 0x02, + FullRes = 0x03, + FullPage = 0x04 //, + // Text=0x05 +}; + class Configuration : public QObject { Q_OBJECT @@ -85,6 +96,7 @@ public: bool getUseSingleScrollStepToTurnPage() { return settings->value(USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE, false).toBool(); } void setDisableScrollAnimation(bool b) { settings->setValue(DISABLE_SCROLL_ANIMATION, b); } bool getDisableScrollAnimation() + { #ifdef Q_OS_MACOS auto defaultValue = true; @@ -96,4 +108,6 @@ public: } }; +} + #endif diff --git a/common/yacreader_global_gui.h b/common/yacreader_global_gui.h index 9e9b3b66..b793c136 100644 --- a/common/yacreader_global_gui.h +++ b/common/yacreader_global_gui.h @@ -97,14 +97,6 @@ enum ComicsViewStatus { Info }; -enum FitMode { - ToWidth = 0x01, - ToHeight = 0x02, - FullRes = 0x03, - FullPage = 0x04 //, - // Text=0x05 -}; - enum LibraryUITheme { Light, Dark From 25a569cfa6afb5c4e85c0a1d2487cd7e3662f4d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 3 May 2025 16:11:58 +0200 Subject: [PATCH 3/9] Add support for mouse mode in Configuration --- YACReader/configuration.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/YACReader/configuration.h b/YACReader/configuration.h index c47ffd49..f4afdbad 100644 --- a/YACReader/configuration.h +++ b/YACReader/configuration.h @@ -22,8 +22,13 @@ enum FitMode { ToWidth = 0x01, ToHeight = 0x02, FullRes = 0x03, - FullPage = 0x04 //, - // Text=0x05 + FullPage = 0x04 +}; + +enum MouseMode { + Normal, + LeftRightNavigation, + HotAreas }; class Configuration : public QObject @@ -96,7 +101,6 @@ public: bool getUseSingleScrollStepToTurnPage() { return settings->value(USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE, false).toBool(); } void setDisableScrollAnimation(bool b) { settings->setValue(DISABLE_SCROLL_ANIMATION, b); } bool getDisableScrollAnimation() - { #ifdef Q_OS_MACOS auto defaultValue = true; @@ -106,6 +110,9 @@ public: return settings->value(DISABLE_SCROLL_ANIMATION, defaultValue).toBool(); } + + MouseMode getMouseMode() { return static_cast(settings->value(MOUSE_MODE, MouseMode::Normal).toInt()); } + void setMouseMode(MouseMode mouseMode) { settings->setValue(MOUSE_MODE, static_cast(mouseMode)); } }; } From a51252ca0d2c5a8aec17ce6b6c431400abfc8663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 4 May 2025 09:51:17 +0200 Subject: [PATCH 4/9] Add settings to the options dialog to control the mouse behavior --- YACReader/main_window_viewer.cpp | 26 +++++++++++++++++---- YACReader/main_window_viewer.h | 1 + YACReader/options_dialog.cpp | 40 ++++++++++++++++++++++++++++++++ YACReader/options_dialog.h | 5 ++++ common/yacreader_global_gui.h | 1 + 5 files changed, 69 insertions(+), 4 deletions(-) diff --git a/YACReader/main_window_viewer.cpp b/YACReader/main_window_viewer.cpp index fdbd31c5..9d33de47 100644 --- a/YACReader/main_window_viewer.cpp +++ b/YACReader/main_window_viewer.cpp @@ -625,7 +625,7 @@ void MainWindowViewer::createToolBars() viewer->addAction(closeAction); - viewer->setContextMenuPolicy(Qt::ActionsContextMenu); + updateContextMenuPolicy(); // MacOSX app menus #ifdef Q_OS_MACOS @@ -777,9 +777,25 @@ void MainWindowViewer::openComicFromRecentAction(QAction *action) void MainWindowViewer::reloadOptions() { + updateContextMenuPolicy(); viewer->updateConfig(settings); } +void MainWindowViewer::updateContextMenuPolicy() +{ + auto mouseMode = Configuration::getConfiguration().getMouseMode(); + switch (mouseMode) { + + case Normal: + case HotAreas: + viewer->setContextMenuPolicy(Qt::ActionsContextMenu); + break; + case LeftRightNavigation: + viewer->setContextMenuPolicy(Qt::NoContextMenu); + break; + } +} + void MainWindowViewer::open() { QFileDialog openDialog; @@ -970,9 +986,11 @@ void MainWindowViewer::disablePreviousNextComicActions() void MainWindowViewer::mouseDoubleClickEvent(QMouseEvent *event) { - if (event->button() == Qt::LeftButton) { - toggleFullScreen(); - event->accept(); + if (Configuration::getConfiguration().getMouseMode() == MouseMode::Normal) { + if (event->button() == Qt::LeftButton) { + toggleFullScreen(); + event->accept(); + } } } diff --git a/YACReader/main_window_viewer.h b/YACReader/main_window_viewer.h index 17011c36..b2d08663 100644 --- a/YACReader/main_window_viewer.h +++ b/YACReader/main_window_viewer.h @@ -67,6 +67,7 @@ public slots: void increasePageZoomLevel(); void decreasePageZoomLevel(); void reloadOptions(); + void updateContextMenuPolicy(); void fitToWidth(); void fitToHeight(); void toggleWidthHeight(); diff --git a/YACReader/options_dialog.cpp b/YACReader/options_dialog.cpp index 6f443dbb..ec5b2744 100644 --- a/YACReader/options_dialog.cpp +++ b/YACReader/options_dialog.cpp @@ -81,11 +81,25 @@ OptionsDialog::OptionsDialog(QWidget *parent) scrollBox->setLayout(scrollLayout); + auto mouseModeBox = new QGroupBox(tr("Mouse mode")); + auto mouseModeLayout = new QVBoxLayout(); + + normalMouseModeRadioButton = new QRadioButton(tr("Only Back/Forward buttons can turn pages")); + leftRightNavigationMouseModeRadioButton = new QRadioButton(tr("Use the Left/Right buttons to turn pages.")); + hotAreasMouseModeRadioButton = new QRadioButton(tr("Click left or right half of the screen to turn pages.")); + + mouseModeLayout->addWidget(normalMouseModeRadioButton); + mouseModeLayout->addWidget(leftRightNavigationMouseModeRadioButton); + mouseModeLayout->addWidget(hotAreasMouseModeRadioButton); + + mouseModeBox->setLayout(mouseModeLayout); + layoutGeneral->addWidget(pathBox); layoutGeneral->addWidget(slideSizeBox); // layoutGeneral->addWidget(fitBox); layoutGeneral->addWidget(colorBox); layoutGeneral->addWidget(scrollBox); + layoutGeneral->addWidget(mouseModeBox); layoutGeneral->addWidget(shortcutsBox); layoutGeneral->addStretch(); @@ -246,6 +260,18 @@ void OptionsDialog::saveOptions() settings->setValue(USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE, useSingleScrollStepToTurnPage->isChecked()); settings->setValue(DISABLE_SCROLL_ANIMATION, disableScrollAnimations->isChecked()); + // get checked radio button to get the mouse mode + YACReader::MouseMode mouseMode = Normal; + if (normalMouseModeRadioButton->isChecked()) { + mouseMode = Normal; + ; + } else if (leftRightNavigationMouseModeRadioButton->isChecked()) { + mouseMode = LeftRightNavigation; + } else if (hotAreasMouseModeRadioButton->isChecked()) { + mouseMode = HotAreas; + } + Configuration::getConfiguration().setMouseMode(mouseMode); + YACReaderOptionsDialog::saveOptions(); } @@ -293,6 +319,20 @@ void OptionsDialog::restoreOptions(QSettings *settings) auto defaultDisableScrollAnimationsValue = false; #endif disableScrollAnimations->setChecked(settings->value(DISABLE_SCROLL_ANIMATION, defaultDisableScrollAnimationsValue).toBool()); + + auto mouseMode = Configuration::getConfiguration().getMouseMode(); + + switch (mouseMode) { + case Normal: + normalMouseModeRadioButton->setChecked(true); + break; + case LeftRightNavigation: + leftRightNavigationMouseModeRadioButton->setChecked(true); + break; + case HotAreas: + hotAreasMouseModeRadioButton->setChecked(true); + break; + } } void OptionsDialog::updateColor(const QColor &color) diff --git a/YACReader/options_dialog.h b/YACReader/options_dialog.h index db1e858c..a3f04cc1 100644 --- a/YACReader/options_dialog.h +++ b/YACReader/options_dialog.h @@ -51,6 +51,11 @@ private: YACReaderSpinSliderWidget *gammaS; QColor currentColor; + + QRadioButton *normalMouseModeRadioButton; + QRadioButton *leftRightNavigationMouseModeRadioButton; + QRadioButton *hotAreasMouseModeRadioButton; + public slots: void saveOptions() override; void restoreOptions(QSettings *settings) override; diff --git a/common/yacreader_global_gui.h b/common/yacreader_global_gui.h index b793c136..0b61d42f 100644 --- a/common/yacreader_global_gui.h +++ b/common/yacreader_global_gui.h @@ -36,6 +36,7 @@ #define DO_NOT_TURN_PAGE_ON_SCROLL "DO_NOT_TURN_PAGE_ON_SCROLL" #define USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE "USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE" #define DISABLE_SCROLL_ANIMATION "DISABLE_SCROLL_ANIMATION" +#define MOUSE_MODE "MOUSE_MODE" #define FLOW_TYPE_GL "FLOW_TYPE_GL" #define Y_POSITION "Y_POSITION" From 8b41bbf7116cb73b9979bca57f504f1ee3d58ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 4 May 2025 09:52:13 +0200 Subject: [PATCH 5/9] Check the load state before trying to turn pages --- YACReader/viewer.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/YACReader/viewer.cpp b/YACReader/viewer.cpp index 45e7ef13..e3552e8f 100644 --- a/YACReader/viewer.cpp +++ b/YACReader/viewer.cpp @@ -260,6 +260,10 @@ void Viewer::processCRCError(QString message) void Viewer::next() { + if (!render->hasLoadedComic()) { + return; + } + direction = 1; if (doublePage && render->currentPageIsDoublePage()) { render->nextDoublePage(); @@ -272,6 +276,10 @@ void Viewer::next() void Viewer::left() { + if (!render->hasLoadedComic()) { + return; + } + if (doubleMangaPage) { next(); } else { @@ -281,6 +289,10 @@ void Viewer::left() void Viewer::right() { + if (!render->hasLoadedComic()) { + return; + } + if (doubleMangaPage) { prev(); } else { @@ -290,6 +302,10 @@ void Viewer::right() void Viewer::prev() { + if (!render->hasLoadedComic()) { + return; + } + direction = -1; if (doublePage && render->previousPageIsDoublePage()) { render->previousDoublePage(); From d291569e5ffb4ea43eb473b1b12e4727307ec75e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 4 May 2025 09:53:31 +0200 Subject: [PATCH 6/9] Move drag origin coordinates to MouseHandler --- YACReader/mouse_handler.cpp | 11 ++++------- YACReader/mouse_handler.h | 2 ++ YACReader/viewer.h | 3 --- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/YACReader/mouse_handler.cpp b/YACReader/mouse_handler.cpp index 390f0948..e3304d30 100644 --- a/YACReader/mouse_handler.cpp +++ b/YACReader/mouse_handler.cpp @@ -25,9 +25,7 @@ void YACReader::MouseHandler::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { viewer->drag = true; - auto position = event->position(); - viewer->yDragOrigin = position.y(); - viewer->xDragOrigin = position.x(); + dragOrigin = dragLatestPosition = event->position(); viewer->setCursor(Qt::ClosedHandCursor); event->accept(); return; @@ -88,10 +86,9 @@ void YACReader::MouseHandler::mouseMoveEvent(QMouseEvent *event) if (viewer->drag) { int currentPosY = viewer->verticalScrollBar()->sliderPosition(); int currentPosX = viewer->horizontalScrollBar()->sliderPosition(); - viewer->verticalScrollBar()->setSliderPosition(currentPosY + (viewer->yDragOrigin - position.y())); - viewer->horizontalScrollBar()->setSliderPosition(currentPosX + (viewer->xDragOrigin - position.x())); - viewer->yDragOrigin = position.y(); - viewer->xDragOrigin = position.x(); + viewer->verticalScrollBar()->setSliderPosition(currentPosY + (dragLatestPosition.y() - position.y())); + viewer->horizontalScrollBar()->setSliderPosition(currentPosX + (dragLatestPosition.x() - position.x())); + dragLatestPosition = position; } } } diff --git a/YACReader/mouse_handler.h b/YACReader/mouse_handler.h index 276e558f..1c5345b8 100644 --- a/YACReader/mouse_handler.h +++ b/YACReader/mouse_handler.h @@ -17,6 +17,8 @@ public: private: Viewer *viewer; + QPointF dragOrigin; + QPointF dragLatestPosition; }; } diff --git a/YACReader/viewer.h b/YACReader/viewer.h index cb955c89..c2bb183b 100644 --- a/YACReader/viewer.h +++ b/YACReader/viewer.h @@ -148,9 +148,6 @@ private: int translatorXPos; QPropertyAnimation *translatorAnimation; - int yDragOrigin; - int xDragOrigin; - NotificationsLabelWidget *notificationsLabel; bool shouldOpenNext; From 77e3f6ffb1b3a1aac1c5933b7a34e781ba2b815b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 4 May 2025 09:53:53 +0200 Subject: [PATCH 7/9] Implement support all the new mouse modes --- YACReader/mouse_handler.cpp | 56 ++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/YACReader/mouse_handler.cpp b/YACReader/mouse_handler.cpp index e3304d30..8bbcc18e 100644 --- a/YACReader/mouse_handler.cpp +++ b/YACReader/mouse_handler.cpp @@ -34,13 +34,6 @@ void YACReader::MouseHandler::mousePressEvent(QMouseEvent *event) void YACReader::MouseHandler::mouseReleaseEvent(QMouseEvent *event) { - if (event->button() == Qt::LeftButton) { - viewer->drag = false; - viewer->setCursor(Qt::OpenHandCursor); - event->accept(); - return; - } - if (event->button() == Qt::ForwardButton) { viewer->right(); event->accept(); @@ -52,6 +45,55 @@ void YACReader::MouseHandler::mouseReleaseEvent(QMouseEvent *event) event->accept(); return; } + + auto wasDragging = viewer->drag; + + if (event->button() == Qt::LeftButton) { + viewer->drag = false; + viewer->setCursor(Qt::OpenHandCursor); + event->accept(); + } + + auto position = event->position(); + auto dragDistance = QLineF(position, dragOrigin).length(); + + auto mouseMode = Configuration::getConfiguration().getMouseMode(); + switch (mouseMode) { + case Normal: + return; + case LeftRightNavigation: + if (wasDragging && (dragDistance > 25)) { + return; + } + + if (event->button() == Qt::LeftButton) { + viewer->left(); + event->accept(); + return; + } + + if (event->button() == Qt::RightButton) { + viewer->right(); + event->accept(); + return; + } + + break; + case HotAreas: + if (wasDragging && (dragDistance > 25)) { + return; + } + + if (event->button() == Qt::LeftButton) { + if (position.x() < viewer->width() / 2) { + viewer->left(); + } else { + viewer->right(); + } + } + + break; + }; } void YACReader::MouseHandler::mouseMoveEvent(QMouseEvent *event) From 90a370680eec13c80e24fd21c0b747e325983c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 4 May 2025 10:02:13 +0200 Subject: [PATCH 8/9] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 919e2c75..7c99c4d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Version counting is based on semantic versioning (Major.Feature.Patch) ### YACReader * Don't use scroll animations on macos by default, it where hdpi scroll is most likely to be used. * New toolbar on macos. +* New mouse modes to turn pages. You can setup the app to use the left/right buttons to turn pages directly or you can click on the left/right part of the screen to turn pages. ### YACReaderLibrary * Improve flexibility of the open comic in third party app setting so more complex commands can be used. e.g. `open -a "/Applications/My Reader.app" "{comic_file_path}"`. From bba15bef4de2e36505ca04f793f4c464a1ae8586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 4 May 2025 10:30:54 +0200 Subject: [PATCH 9/9] Fix Qt5 compilation --- YACReader/mouse_handler.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/YACReader/mouse_handler.cpp b/YACReader/mouse_handler.cpp index 8bbcc18e..d4b7a6c1 100644 --- a/YACReader/mouse_handler.cpp +++ b/YACReader/mouse_handler.cpp @@ -25,7 +25,12 @@ void YACReader::MouseHandler::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { viewer->drag = true; - dragOrigin = dragLatestPosition = event->position(); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + auto position = event->position(); +#else + auto position = QPointF(event->x(), event->y()); +#endif + dragOrigin = dragLatestPosition = position; viewer->setCursor(Qt::ClosedHandCursor); event->accept(); return; @@ -54,7 +59,11 @@ void YACReader::MouseHandler::mouseReleaseEvent(QMouseEvent *event) event->accept(); } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto position = event->position(); +#else + auto position = QPointF(event->x(), event->y()); +#endif auto dragDistance = QLineF(position, dragOrigin).length(); auto mouseMode = Configuration::getConfiguration().getMouseMode(); @@ -101,7 +110,11 @@ void YACReader::MouseHandler::mouseMoveEvent(QMouseEvent *event) viewer->showCursor(); viewer->hideCursorTimer->start(2500); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto position = event->position(); +#else + auto position = QPointF(event->x(), event->y()); +#endif if (viewer->magnifyingGlassShown) viewer->mglass->move(static_cast(position.x() - float(viewer->mglass->width()) / 2), static_cast(position.y() - float(viewer->mglass->height()) / 2));