Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
1cd8635
Use QProcess as intented by parsing the input command arguments
luisangelsm Jan 6, 2025
31971c2
Don't use scroll animations on macos by default, it where hdpi scroll…
luisangelsm Jan 6, 2025
89d16b6
Use the right data index for getting the rating
luisangelsm Jan 26, 2025
bfc0e1b
Update aqtinstall syntax to the latest version
luisangelsm Jan 26, 2025
af1af39
Remove extra parameter from aqt
luisangelsm Jan 26, 2025
c148a96
Add static methods to get the data paths in a library
luisangelsm Mar 27, 2025
4e675d4
Use YACReaderLibrary to create paths in ConsoleUILibraryCreator
luisangelsm Mar 27, 2025
5aa637f
Use YACReaderLibrary::libraryDataPath in YACReaderLibraries::getDBPath
luisangelsm Mar 27, 2025
d4b7c6d
Extract library paths methods to it's own struct in yacreader_global.…
luisangelsm Mar 29, 2025
b0d2d05
Change the type of path passed to DataBaseManagement::updateToCurrent…
luisangelsm Mar 29, 2025
c142c2e
Force Python 3.13
luisangelsm Mar 29, 2025
a0407c9
Update pip before installing aqt
luisangelsm Mar 29, 2025
7f08ad0
Try Python 3.10
luisangelsm Mar 30, 2025
181884a
More migrations to LibraryPaths
luisangelsm Mar 30, 2025
52f1a57
Fix compilation
luisangelsm Mar 30, 2025
b73e8e6
Merge pull request #467 from YACReader/library-path-cleaning
luisangelsm Mar 30, 2025
c5890ca
Include windows.h before shellapi.h
luisangelsm Mar 30, 2025
8f84fc7
Log libraries validation when YACReaderLibrary and YACReaderLibrarySe…
luisangelsm Mar 30, 2025
53b63de
Update CHANGELOG
luisangelsm Mar 30, 2025
254652f
Add missing include
BSDKaffee Apr 19, 2025
6e0e6f3
Fix build with Qt 6.9.0 (fixes #469)
BSDKaffee Apr 19, 2025
d9b9fda
Merge pull request #471 from BSDKaffee/qt-6.9-fixes
luisangelsm Apr 19, 2025
3632eba
Implement native toolbars on macos on Qt6 to have a modern looking un…
luisangelsm Apr 20, 2025
ed7e9f9
Format
luisangelsm Apr 20, 2025
cb24540
Update CHAGELOG
luisangelsm Apr 20, 2025
a425aef
Fix macos compilation with Qt5
luisangelsm Apr 20, 2025
9e37947
Fix layout warning
luisangelsm Apr 21, 2025
7db47f9
Extract mouse handling events to it's own class
luisangelsm May 3, 2025
257436c
Move FitMode to configuration.h
luisangelsm May 3, 2025
25a569c
Add support for mouse mode in Configuration
luisangelsm May 3, 2025
a51252c
Add settings to the options dialog to control the mouse behavior
luisangelsm May 4, 2025
8b41bbf
Check the load state before trying to turn pages
luisangelsm May 4, 2025
d291569
Move drag origin coordinates to MouseHandler
luisangelsm May 4, 2025
77e3f6f
Implement support all the new mouse modes
luisangelsm May 4, 2025
90a3706
Update CHANGELOG
luisangelsm May 4, 2025
bba15be
Fix Qt5 compilation
luisangelsm May 4, 2025
b81b790
Merge pull request #472 from YACReader/add_mouse_nativation_modes
luisangelsm May 4, 2025
89d7d76
Typo
luisangelsm May 4, 2025
9d7a554
Convert ScraperMode and ScraperStatus into enum class
luisangelsm May 4, 2025
1b4116d
Remove default cases from switches using enum class
luisangelsm May 4, 2025
fca1e20
Add new ScraperStatus for exact volume searches
luisangelsm May 4, 2025
51590aa
Rename method
luisangelsm May 4, 2025
e765235
Fix status check
luisangelsm May 4, 2025
e5f02be
Try to always get some description for single volume issues
luisangelsm May 4, 2025
868de85
Add support for exact match searches
luisangelsm May 5, 2025
73bde73
Add some minimum width to the scraper table view columns
luisangelsm May 5, 2025
dfb1cb9
Include missing image in qrc
luisangelsm May 5, 2025
6b1987a
Use a better default search string from comic files
luisangelsm May 5, 2025
879d316
Update CHANGELOG
luisangelsm May 5, 2025
f0b9d45
Merge pull request #473 from YACReader/comic_vine_integration_improve…
luisangelsm May 6, 2025
b976b7f
Add support for setting custom covers on folders
luisangelsm May 8, 2025
156de8d
Fix YACReaderLibraryServer build
luisangelsm May 8, 2025
0ac22cd
Merge pull request #474 from YACReader/custom_folder_covers
luisangelsm May 9, 2025
b064095
Make the cover selection button circular
luisangelsm May 9, 2025
97685dc
Remove unneeded property
luisangelsm May 9, 2025
0457c08
Add button for reseting the cover of a comic to the default one
luisangelsm May 9, 2025
508ff6d
Add support for loading custom comic images
luisangelsm May 9, 2025
2895218
Remove commented code
luisangelsm May 9, 2025
8b159c9
Support drag&drop for setting a custom cover in the properties dialog
luisangelsm May 9, 2025
5950c52
Support editing the cover image of various comics at once
luisangelsm May 9, 2025
bed3503
Update CHANGELOG
luisangelsm May 9, 2025
4adad5f
Format
luisangelsm May 9, 2025
a4ab11d
Merge pull request #475 from YACReader/custom_comic_covers
luisangelsm May 10, 2025
b7fb45a
Add support for storing and serving the new comic filters format
luisangelsm Jun 14, 2025
109b9e9
Fix format
luisangelsm Jun 14, 2025
8d2026f
Merge pull request #476 from YACReader/new_image_filters_format
luisangelsm Jun 14, 2025
7740aac
Bump Ubuntu version
luisangelsm Jun 14, 2025
c621c27
Bump the windows version used in the Initialization job
luisangelsm Jun 15, 2025
6a4f973
Make sure DB upgrades happen atomically
luisangelsm Jun 15, 2025
41b7873
Setting to control whether the time is shown in the 'current page/tot…
luisangelsm Jul 18, 2025
2cd511f
Test GitHub Actions with SignPath test certificate
luisangelsm Oct 7, 2025
fb722e5
Publish only the signed installers
luisangelsm Oct 7, 2025
f2e1763
Add some debugging to know why signed installer don't end in the release
luisangelsm Oct 7, 2025
c5df8a1
Update .gitignore
luisangelsm Oct 14, 2025
9df25b4
Switch to the release-signing slug for SignPath
luisangelsm Oct 14, 2025
aa5371c
Update README.md to reflect that code signing on Windows is provided …
luisangelsm Oct 14, 2025
c2aa5f6
Sign executables before creating the installer
luisangelsm Oct 16, 2025
1abd4ca
Try to compile the arm64 Docker image natively
luisangelsm Oct 16, 2025
7ee7684
Remove Azure Pipelines integration
luisangelsm Oct 17, 2025
14ad6f3
Do not create a new QCollator every time we compare a string
luisangelsm Nov 19, 2025
b94dc7f
Support image filters on syncback from ios and android clients
luisangelsm Nov 19, 2025
ed41cf9
Try to use node18 to install appdmg
luisangelsm Nov 19, 2025
55c99ca
WIP on qt6.9-migration
luisangelsm Oct 16, 2025
e2a1f71
Try to fix windows arm64 build
luisangelsm Oct 16, 2025
83039bc
Make icons darker
luisangelsm Nov 25, 2025
e7b6bd8
Remove hardcoded styles
luisangelsm Nov 25, 2025
fcc9b4d
Use a custom background for checked actions in tool bars
luisangelsm Nov 25, 2025
c3620ec
Try to use macos 14 for building the Qt5 macos build
luisangelsm Nov 25, 2025
b6d05de
Use node18 on the macos qt5 job
luisangelsm Nov 25, 2025
7777762
Use macos-15 and macos-15-intel for macos builds
luisangelsm Nov 25, 2025
ff65d9c
Merge pull request #484 from YACReader/qt6.9-migration
luisangelsm Nov 25, 2025
e61bd31
Uninstall the previous version of YACReader before installing the new…
luisangelsm Nov 27, 2025
d80e82f
Don't display the uninstall progress at all
luisangelsm Nov 27, 2025
c7ff185
Update pdfium binaries for Windows builds
luisangelsm Dec 2, 2025
1454d14
Update What's new dialog
luisangelsm Dec 7, 2025
30fbb3e
Update language files
luisangelsm Dec 7, 2025
f136ab9
Update Spanish translations
luisangelsm Dec 7, 2025
f983f6b
Close CHANGELOG for 9.16.0
luisangelsm Dec 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,131 changes: 1,131 additions & 0 deletions .github/workflows/build.yml

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ libp7zip
YACReader/build
YACReaderLibrary/build
YACReaderLibraryServer/build
build/

# C++ objects and libs
*.slo
Expand All @@ -21,6 +22,7 @@ YACReaderLibraryServer/build
*.dll
*.dylib
*.pch
*.obj

# Qt-es
object_script.*.Release
Expand Down
29 changes: 29 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,35 @@

Version counting is based on semantic versioning (Major.Feature.Patch)

## 9.16.0

### 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.
* New setting to control whether the time is shown in the 'current page/total' label.

### 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}"`.
* Fix setting the comic rating in the table view.
* Log libraries validation when the app starts.
* New toolbar on macos.
* New setting in Comic Vine scraper to force exact volume matches.
* Better default search query in the Comic Vine scraper.
* Improved navigation in Comic Vine scraper, including keeping the current query around to make edits and refined searches easier.
* Add support for custom covers for any folder using the context menu.
* The edit cover buttons now support looping through pages, going forward from the last returns to the first, and going backward from the first jumps to the last.
* Add support for custom covers for comics using the edit metadata dialog, you can use a pick file button or drag&drop an image into the cover view in the dialog.
* Covers can be set in bulk for various comics at once.
* New button to reset to the default cover of a comic.
* Support for storing the new image filters from iOS and Android apps.

### YACReaderLibraryServer
* Log libraries validation when the app starts.

### All apps
* PDF libraries have been updated for all Windows builds.

## 9.15.0

### YACReader
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,6 @@ YACReader is free but it needs money to keep being alive, so please, if you like

## Hacktoberfest
If you are interested in YACReader, please contact me so we can discuss your next steps.

## Sponsors
Free code signing on Windows provided by [SignPath.io](https://signpath.io/), certificate by [SignPath Foundation](https://signpath.org/)
2 changes: 2 additions & 0 deletions YACReader/YACReader.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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 \
Expand Down
34 changes: 33 additions & 1 deletion YACReader/configuration.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#ifndef __CONFIGURATION_H
#define __CONFIGURATION_H

#include <QByteArray>
#include <QString>
#include <QSize>
Expand All @@ -15,6 +16,21 @@

using namespace YACReader;

namespace YACReader {

enum FitMode {
ToWidth = 0x01,
ToHeight = 0x02,
FullRes = 0x03,
FullPage = 0x04
};

enum MouseMode {
Normal,
LeftRightNavigation,
HotAreas
};

class Configuration : public QObject
{
Q_OBJECT
Expand Down Expand Up @@ -75,6 +91,8 @@ class Configuration : public QObject
void setShowToolbars(bool b) { settings->setValue(SHOW_TOOLBARS, b); }
bool getShowInformation() { return settings->value(SHOW_INFO, false).toBool(); }
void setShowInformation(bool b) { settings->setValue(SHOW_INFO, b); }
bool getShowTimeInInformation() { return settings->value(SHOW_TIME_IN_INFO, true).toBool(); }
void setShowTimeInInformation(bool b) { settings->setValue(SHOW_TIME_IN_INFO, b); }
QDate getLastVersionCheck() { return settings->value(LAST_VERSION_CHECK).toDate(); }
void setLastVersionCheck(const QDate &date) { settings->setValue(LAST_VERSION_CHECK, date); }
int getNumDaysBetweenVersionChecks() { return settings->value(NUM_DAYS_BETWEEN_VERSION_CHECKS, 1).toInt(); }
Expand All @@ -84,7 +102,21 @@ class Configuration : public QObject
bool getDoNotTurnPageOnScroll() { return settings->value(DO_NOT_TURN_PAGE_ON_SCROLL, false).toBool(); }
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() { return settings->value(DISABLE_SCROLL_ANIMATION, false).toBool(); }
bool getDisableScrollAnimation()
{
#ifdef Q_OS_MACOS
auto defaultValue = true;
#else
auto defaultValue = false;
#endif

return settings->value(DISABLE_SCROLL_ANIMATION, defaultValue).toBool();
}

MouseMode getMouseMode() { return static_cast<MouseMode>(settings->value(MOUSE_MODE, MouseMode::Normal).toInt()); }
void setMouseMode(MouseMode mouseMode) { settings->setValue(MOUSE_MODE, static_cast<int>(mouseMode)); }
};

}

#endif
35 changes: 30 additions & 5 deletions YACReader/main_window_viewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,10 @@ void MainWindowViewer::createToolBars()
#endif

#ifndef Y_MAC_UI
comicToolBar->setStyleSheet("QToolBar{border:none;}");
comicToolBar->setStyleSheet(R"(
QToolBar { border: none; }
QToolButton:checked { background-color: #cccccc; }
)");
comicToolBar->setIconSize(QSize(18, 18));
#endif

Expand Down Expand Up @@ -625,7 +628,7 @@ void MainWindowViewer::createToolBars()

viewer->addAction(closeAction);

viewer->setContextMenuPolicy(Qt::ActionsContextMenu);
updateContextMenuPolicy();

// MacOSX app menus
#ifdef Q_OS_MACOS
Expand Down Expand Up @@ -777,9 +780,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;
Expand Down Expand Up @@ -970,9 +989,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();
}
}
}

Expand Down Expand Up @@ -1319,7 +1340,11 @@ void MainWindowViewer::toggleFitToWidthSlider()
if (zoomSliderAction->isVisible()) {
zoomSliderAction->hide();
} else {
#if defined(Y_MAC_UI) && (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
zoomSliderAction->move((this->width() - zoomSliderAction->width()) / 2, y);
#else
zoomSliderAction->move(250, y);
#endif
zoomSliderAction->show();
}
}
Expand Down
1 change: 1 addition & 0 deletions YACReader/main_window_viewer.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public slots:
void increasePageZoomLevel();
void decreasePageZoomLevel();
void reloadOptions();
void updateContextMenuPolicy();
void fitToWidth();
void fitToHeight();
void toggleWidthHeight();
Expand Down
149 changes: 149 additions & 0 deletions YACReader/mouse_handler.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
#include "mouse_handler.h"

#include <QtWidgets>

#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 <QtWidgets>
#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;
#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;
}
}

void YACReader::MouseHandler::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::ForwardButton) {
viewer->right();
event->accept();
return;
}

if (event->button() == Qt::BackButton) {
viewer->left();
event->accept();
return;
}

auto wasDragging = viewer->drag;

if (event->button() == Qt::LeftButton) {
viewer->drag = false;
viewer->setCursor(Qt::OpenHandCursor);
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();
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)
{
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<int>(position.x() - float(viewer->mglass->width()) / 2), static_cast<int>(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 + (dragLatestPosition.y() - position.y()));
viewer->horizontalScrollBar()->setSliderPosition(currentPosX + (dragLatestPosition.x() - position.x()));
dragLatestPosition = position;
}
}
}
25 changes: 25 additions & 0 deletions YACReader/mouse_handler.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#ifndef MOUSE_HANDLER_H
#define MOUSE_HANDLER_H

#include <QMouseEvent>

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;
QPointF dragOrigin;
QPointF dragLatestPosition;
};
}

#endif // MOUSE_HANDLER_H
Loading
Loading