Skip to content

10.2 - #584

Merged
luisangelsm merged 77 commits into
masterfrom
develop
Aug 8, 2026
Merged

10.2#584
luisangelsm merged 77 commits into
masterfrom
develop

Conversation

@luisangelsm

Copy link
Copy Markdown
Member

YACReader

  • Change default shortcuts for modifying the magnifying glass size to avoid conflicts with the page zoom shortcuts, [, ].
  • Add an optional circular magnifying glass, with an optional ring drawn around it. The configured size is kept as a rectangle, so switching back and forth doesn't lose it.
  • Add optional edge easing for the magnifying glass. The magnified region is pushed toward the edges of the view, so content near the border can be inspected without pushing the cursor all the way into the corner.
  • Require a full wheel notch before the magnifying glass changes size or zoom, so a light trackpad gesture no longer resizes it.
  • Fix showing the go to flow bar asking for permission to control the computer on macOS. Moving the cursor into the bar now works without granting any accessibility permission, where before it was silently doing nothing.
  • Add a setting to control what the Escape key does. It can keep quitting the reader, as before, or instead cancel the topmost active mode: magnifying glass, dictionary, go to flow and then fullscreen.
  • Fix crash caused by changing reading direction while quickly turning pages.
  • Use pinch and ctrl+wheel mouse to change the zoom level.

YACReaderLibrary

  • Add a library repair function to restore missing covers and rescan files that previously failed to be added.
  • Add actions to create and restore library database backups.
  • Automatically create and retain database backups in .yacreaderlibrary/backups.
  • When database corruption is detected, offer to attempt a repair or restore a backup. Damaged originals are preserved in .yacreaderlibrary/recovery.
  • Fix comics info export/import and covers package import/export error handling.
  • Fix grid comic cells info height so the title doesn't overlap the other fields.
  • Add a function to open the library root location.
  • Add a help dialog for the search engine. Use the drop down menu in the search field.
  • Add quick search presets. Use the drop down menu in the search field.
  • Fix open containing folder asking for permission to control Finder on macOS.
  • Improve the server dialog UI a bit and add the option to open the Web UI from it.

YACReaderLibraryServer

  • Add the repair-library command to restore missing covers and rescan files that previously failed to be added.
  • Add the backup-library, list-backups, and restore-library commands.
  • Automatically create and retain database backups in .yacreaderlibrary/backups.
  • Add the repair-library-db command to attempt to repair a damaged database. Damaged originals are preserved in .yacreaderlibrary/recovery.

WebUI

  • Add a very basic web reader.
  • Add rescan xml functionality to the webui.
  • Add more metadata fields to the detail view.

All GUI apps

  • New settings dialogs.

All apps

  • Unify comics sorting to use the string based universal number everywhere.
  • Experimental support for image based comics in epub format.

luisangelsm and others added 30 commits July 10, 2026 16:38
Missing covers and bad files that have been imported as placeholders.
Add automatic and manual database backups, with restore support in the GUI and CLI.

Detect damaged databases, offer basic repair options, and preserve the original database before attempting recovery.
Update Simplified Chinese language pack
In single-page mode Viewer::grabMagnifiedRegion built the magnified image
with a device pixel ratio of devicePixelRatioF() in the out-of-bounds
branch, while the in-bounds branch returns a DPR-1 image and the source
crop is itself DPR 1. A QPainter draws in logical coordinates, so painting
the DPR-1 crop onto a DPR-2 (Retina) image scaled the content up by the
ratio and clipped it. Because this only happens once the sampled region
touches the page edge, magnification jumped discontinuously near the
left/right edges and edge detail was pushed off the loupe.

Keep the out-of-bounds image at DPR 1 so both branches produce the same
scale.
…tive

With the magnifying glass active, moving the cursor to the bottom of the
page hit the goToFlow page-selection hover zone. The bar did not visibly
appear, but the hover handling took over the mouse events there, so the
magnifying glass stopped following the cursor and could not reach the
bottom of the page. Skip the bottom hover zone while the magnifying glass
is shown.
Only image based epubs, this is experimental.
Update Simplified Chinese language pack
Update Chinese translations in yacreader_zh_CN.ts
Update Chinese translations in yacreaderlibrary_zh_CN.ts
Introduce an optional circular loupe for the magnifying glass, toggled
from the Options window (General tab). The circle's diameter is the wider
of the two configured rectangle dimensions, derived at display time only:
the rectangle size setting (MAG_GLASS_SIZE) is never overwritten, so
switching modes restores the exact saved size.

MagnifyingGlass now separates its logical rectangle (the source of truth
for size gestures and the persisted setting) from its display geometry,
which grows to a max(w, h) square while circular. The shape is realised
with a widget mask for corner transparency plus a custom paintEvent for
antialiased interior scaling.

A secondary bezel-ring option (default on, enabled only when circular is
active) draws an antialiased filled annulus inset just inside the mask so
its outer edge forms a smooth silhouette that blends into the page,
hiding the aliased mask edge.
The loupe's sampled content is pushed outward toward the viewport edges so
edge content is reachable without moving the cursor all the way to the
edge, while tracking the cursor 1:1 in the middle.

- Viewer::easeViewerPos normalizes the cursor about the viewport center
  (the region the page is actually drawn in — the top-level window would
  fold in the toolbar/chrome and ease too hard), runs it through a
  smoothstep ramp, and scales it by the loupe half-extent. The half-size
  cap keeps the cursor's point inside the loupe view and ties the strength
  to loupe size: a minimum loupe is nearly linear, a large one eases hard.
  Rectangular loupes cap per axis; circular loupes cap the displacement
  vector radially.
- Two tuning knobs: edgeReach saturates the ramp before the cursor reaches
  the border, and edgeStrength scales the peak push below the half-extent.
- Per-axis letterbox gate: easing only helps where there is off-page
  content to bring toward the cursor, so it is skipped on an axis once the
  page is letterboxed by more than minLetterboxFraction (10%) of its own
  size there. Overflow, an exact fit, or a thin margin still ease, so the
  effect does not vanish the instant a page is a hair smaller than the
  viewport. In continuous view the horizontal extent is the page under the
  cursor, so the gate can vary per row.
- Only the content is eased; the loupe widget follows the cursor, so the
  zoomed image swims a little toward the edge inside the loupe.
- MouseHandler's mouse-move path routes through updateImage so both update
  paths share the eased positioning.
- New MAG_GLASS_EDGE_EASE config (default on) with an Options toggle,
  applied live via Viewer::updateConfig().
… delta)

Resizing the magnifying glass by scrolling used to step on the mere sign of
each wheel event, so a trackpad's many tiny high-resolution events each fired
a full step and the faintest two-finger brush resized the loupe.

Accumulate the active gesture's signed angleDelta and only take a step once
the running total crosses a 120-unit threshold (looping so a fast multi-notch
event still steps several times). A real mouse wheel delivers 120 per notch in
one event, so it still steps once per notch; the 120 threshold is itself the
trackpad/mouse discriminator, so no device-type branching is needed. The
accumulator resets when the gesture changes (different modifier) or after
~400ms idle so a stale partial gesture can't leak forward. Applies to the
size, height (Ctrl), width (Alt), and zoom (Shift) branches.
The circle's diameter is the wider of the two logical dimensions, so squaring
up a wide, short rectangle could exceed the parent on the other axis even
though the rectangle itself fit: a logical 800x175 became an 800x800 widget,
taller than the viewport it magnifies. The grow steps only ever clamped the
logical rectangle, so nothing caught this.

Clamp the circle's side to the same fraction of the parent that the grow steps
enforce, taken on whichever axis is tighter. The logical size is untouched, so
the saved setting and the rectangular mode are unaffected.
It introduced a regression that causes the magnifying glass to start tiny because the size of the parent is not know when the magnifying glass is setup, and it would require to  update the clamping for every resize of the parent widget. Clamping ads complexity and some UX inconsistencies that are not really necessary IMO.
…-glass

Feature: circular magnifying glass
No body knows how search works, the main reason is that it's only documented in two release notes in the official web. With a menu + a new dialog showing all fields and examples + a quick start guide it should be easier for the users to learn how to use it.
luisangelsm and others added 29 commits August 3, 2026 18:34
Change default backend on linux to libarchive
It will use a side list instead of a tab bar for sections
Escape previously always quit the viewer. Add an option, selectable via a
radio group in Options ▸ General ▸ "Escape key", to instead make Escape
cancel the topmost active mode and do nothing when none is active. Default
stays "quit", so existing behavior is unchanged until opted into.

The Escape key and the File▸Close command are decoupled: closeAction keeps
the configurable CLOSE_ACTION_Y/Esc binding but now dispatches through
onEscapePressed() (quit vs. cancelActiveMode()), while a new exitAction backs
the File▸Close menu item and always quits. This avoids making the menu
command context-sensitive and avoids a second Esc binding (which would
ambiguously collide).

cancelActiveMode() cancels in order: magnifier, dictionary/translator,
go-to-flow bar, fullscreen. The magnifier's checkable toolbar action is
re-synced when hidden this way. Viewer gains translatorIsVisible() and
goToFlowIsVisible() accessors.

The cancel order is documented to users in a tooltip rather than in the radio
button label, keeping the label as short as its neighbours in the General tab.
The tooltip is a single translatable block with a translator comment: building
the list from per-item tr() calls would leave word order, punctuation and
numbering unfixable for translators, and markup inside a translatable string
invites broken tags in the .ts files. Comments on both cancelActiveMode() and
the tooltip flag that the two orders must stay in sync.

closeAction gets an explicit tooltip because the shortcuts editor lists actions
by toolTip(), which otherwise falls back to the action text - showing "Escape"
in a column whose neighbours are all verb phrases, next to a KEYS column that
already names the key.
Add configurable Escape key behavior (quit vs cancel mode)
Enable the macOS and other Qt-supported trackpad pinch gesture to zoom continuously within the existing 30% to 500% bounds. Keep the cursor anchor stationary in single-page mode and preserve the existing viewport anchor in continuous-scroll mode.

Show a compact translucent HUD in the bottom-right corner with the live zoom percentage while the gesture is active. The existing centered notification remains in use for keyboard zoom shortcuts.

Relates to #435
Add trackpad pinch-to-zoom gesture to the comic viewer
@luisangelsm
luisangelsm merged commit d936c6c into master Aug 8, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants