Skip to content

Improve annotation controls and selection editing - #397

Merged
devmobasa merged 13 commits into
mainfrom
feat/ux-review-followups
Sep 27, 2026
Merged

devmobasa merged 13 commits into
mainfrom
feat/ux-review-followups

Conversation

@devmobasa

@devmobasa devmobasa commented Sep 27, 2026 •

Copy link
Copy Markdown
Owner

Make everyday annotation controls easier to use and make shape editing easier to discover.

  • Fix fractional width stepping and GTK slider shortcut/focus handling. Add curved thickness sliders, reference ticks, and wheel adjustment.
  • Give zoom actions explicit centres, add Ctrl+wheel zoom, and stabilize the Reset/Lock chip layout.
  • Make Replay Tour reuse the first-run cards while preserving usage history, including when automatic hints are disabled.
  • Add status-bar tooltips, show tool-relevant sizes, reduce the default font size, clarify board capacity, and add Board Picker access to the canvas context menu's Boards submenu.
  • Open Properties by double-clicking shapes, retain text/note editing, and simplify shape context menus with an Arrange submenu and Delete near the bottom.

Stepping rounded first and then added the delta, so a 30.8 px stroke went
to 32 on + and a 3.2 px one to 2 on -, skipping a value. One shared
helper next to the stroke limits now lands on the nearest whole pixel in
the step's direction, and both the selection steppers and the tool
nudges (wheel, keyboard, radial) use it.
Only the zoom chip centred its zoom, through a pointer-in-chip check in
the backend; the command palette zoomed on the pointer wherever it was,
the toolbar on its own button, and the context menu on the menu row.
Zoom requests now carry a ZoomAnchor: shortcuts keep the pointer, the
chip, toolbar, and palette centre the screen, and the context menu
centres where it was opened (the screen centre when opened from the
keyboard into a corner). The backend resolves the anchor instead of
testing the chip rectangle.
A focused slider kept its navigation keys even with Ctrl, Alt, or Super
held, so Ctrl+PgUp/PgDn and other chords never reached the overlay, and
the relay kept keypad arrows the slider then ignored. The relay and the
slider now share one navigation-key map, and chords always go to the
overlay.

After Escape released a slider's keyboard focus, Hyprland moved focus
only on the next pointer motion, so shortcuts typed meanwhile were lost.
The relay now reports that the toolbar gave up the keyboard, and the
overlay reclaims it the way startup does, asking for Exclusive until the
keyboard enters and giving up after 750 ms so the GTK bars never stay
click-through.
The chip's "Fit" button reset to 100% and fit nothing; it now reads
"Reset". At 100% the zoom-out and Reset buttons have nothing to do, so
they are dimmed, get no hover or pointer cursor, and consume clicks
without acting or nudging the shortcut coach. They keep their place, and
the pill reserves the Lock label's line metrics so no button shifts when
Lock appears.

Ctrl+wheel now zooms at the pointer, the gesture most canvas apps use;
Ctrl+Alt+wheel keeps working and Ctrl+Shift+wheel stays font size. A
stroke in progress consumes the zoom wheel instead of zooming mid-drag.
The help overlay's Zoom section, README, and --help text say so, and the
--help text now gives the right wheel direction for thickness.
The thickness track was linear from 1 to 50 px, so the widths people use
most shared a sliver of it. A per-spec curve now gives half the track to
1-10 px (value = 1 + 49 * t^log2(49/9)), with faint ticks at 5, 10, and
20 px drawn by one helper in both frontends; other sliders stay linear
and unticked.

The wheel over a style-pill slider, or over the thickness or text-size
number beside it, now steps it: one spec step per notch in GTK, and in
the built-in toolbar through the meters' notch accumulator, now generic
over what it steps. Thickness and text size step relatively, so eraser
size and whole pixels follow the input side. The numerals' tooltips say
they take a typed value and the wheel.
Replay Tour opened an older nine-step modal tour, keyboard-only and
styled apart from the six first-run cards new users see, and the cards
themselves could not be replayed. Replay Tour now restarts the cards
from the first step through a backend action, with an empty checklist.

The quick-access and find-anything cards wait on lifetime usage flags
that also keep later tips quiet, so a replay saves and clears them and
gives them back, merged with anything used meanwhile, when it completes
or is skipped; the saved set persists across restarts. A profile that
already answered the background-mode prompt ends the replay one card
early. A replay runs even with onboarding hints off, as documented.

The old tour had no other entry point, so it is removed with its modal
registry slot, key and pointer guards, and the toolbar helpers only it
used.
The status bar's segments open the board picker, the color picker, the
radial menu, and help, but read as plain text. Resting the pointer on a
segment for 450 ms now shows a tooltip saying what a click does, above a
bottom bar and below a top one. It is laid out once per frame with the
bar, damaged only where it appears or goes, and drawn through a tooltip
helper shared with the color picker instead of a third copy.

The size segment follows the tool: Select and the click-highlight tool
show no pen width, typing shows the text size once rather than again as
a separate indicator, and the highlight tool is named once. The default
status font drops from 21 px to 15 px (padding 15 -> 11 px), so the bar
stops being the heaviest text on screen; the zoom chip follows. The board
picker's count reads "Boards (5 of 9 max)", no longer a "5/9" that looked
like the bar's "1/5".
The GTK slider's wheel and arrow keys added a step and rounded, so a
fractional 30.8 px went to 32 scrolling up and 3.2 to 2 scrolling down,
while the numeral and the canvas wheel stepped to the neighbour. A
direction-aware step on the shared slider spec lands on the adjacent
grid value, and the GTK wheel and keys and the built-in slider wheel all
use it.
The key relay reported a keyboard release for every Escape on a focused
slider, including during a drag, where the slider keeps focus, so the
overlay asked for Exclusive focus in the middle of the gesture. The relay
now only arms the Escape guard; the slider reports the release itself,
through a new KeyboardReleased feedback, when it actually gives up the
toolbar's keyboard (not mid-drag, not in a popover).
Replay Tour reset and saved progress even in presenter mode or while
zoomed, where every card is hidden, so the replay ran with no visible
card or Skip control. It now leaves zoom first, and in presenter mode it
keeps the mode and says to leave it, without touching progress.
…range

Properties sat below eight other rows, so the shape menu now opens with
the editing entries: Edit Text or Edit Note, then Properties. The four
stacking moves collapse into an Arrange submenu that dims what cannot
move, Delete moves to the bottom behind a separator, and Select This
Shape shows only when it would narrow the selection.
With the Select tool, or Alt+click with any tool, a double-click opens
the shape in the properties panel; text and sticky notes enter editing
instead. A plain double-click narrows the selection to that shape, and
Alt+Shift keeps the rest of the selection.

The panel opens on the second release, since a release outside the
panel dismisses it. MovingSelection now carries the grab, which tells a
click from a drag by pointer travel rather than by whether the shape
moved: the selection holds still until the pointer leaves the 4 px
click radius, so a click never nudges it, and travel against a canvas
edge still counts as a drag. Locked shapes take clicks too, because
Properties is where they unlock.

The click tracker is cleared when the board or page changes: shape ids
are page-local, so a click on one page could pair with a click on
another, which the existing text double-click was open to as well.
@devmobasa
devmobasa merged commit 1129142 into main Sep 27, 2026
3 checks passed
@devmobasa
devmobasa deleted the feat/ux-review-followups branch September 27, 2026 15:23
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.

1 participant