Skip to content

Choose clips by clicking the row, not a checkbox - #23

Merged
willkotheimer merged 2 commits into
mainfrom
clip-highlight
Sep 12, 2026
Merged

willkotheimer merged 2 commits into
mainfrom
clip-highlight

Conversation

@willkotheimer

Copy link
Copy Markdown
Owner

Selection by row

The compact window's clip list chose clips with a checkbox column. The row itself is now the control, with the gestures every desktop list already uses:

  • Click — choose that clip alone; clicking the one chosen clip again clears (back to all)
  • Ctrl-click — add or drop one
  • Shift-click — the run from the last click, in spool order; a second Shift-click moves the far end
  • Esc or the Select all line under the list — back to all

Chosen rows are lit and the rest recede. Nothing is lit when nothing is chosen, because an empty selection means every clip and lighting every row would say a choice had been made.

core/selection.ts gains only and range beside toggle; the session tracks the Shift anchor and drops it wherever it drops the selection. One IPC call (selectClip(id, gesture)) replaces toggleClipSelected. Rows are a listbox and keyboard-selectable.

Store identity

Separate commit: electron-builder.yml gets the Partner Center identity (WillKotheimer.SpoolClipboard, publisher CN, display name "Spool Clipboard"). The placeholders it replaces could not be built — identityName forbids underscores.

Verified in the dev build by hand. 371 tests, lint, typecheck, and the zero-network gate pass.

🤖 Generated with Claude Code

willkotheimer and others added 2 commits September 11, 2026 21:20
The appx block held placeholders, and one of them could not even be built:
identityName forbids underscores, so `npm run package:store` failed at the
last step with the config as checked in. The values now come from the Partner
Center reservation. "Spool" was taken, so the reserved name — which the Store
requires the package's display name to match — is "Spool Clipboard". The app
itself still calls itself Spool; the longer name is a Store handle, not a
rebrand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The checkbox was the wrong control. Every list on the desktop already teaches
how to choose things in it — click for one, Ctrl-click to add or drop one,
Shift-click for a run — and a column of boxes asked the user to learn a second
grammar for the same act, and to aim at a small target to do it. The row is
now the control, and a chosen row is lit rather than ticked.

Nothing is lit when nothing is chosen. The boxes had shown every clip ticked
in that state, because an empty selection means every clip; but a lit row
says a choice has been made, and lighting them all would say so when none
has. So the list is neutral until it is narrowed, and then the clips left out
recede rather than vanish — they are still in the spool, just not in play.

The model underneath is unchanged. `only` and `range` join `toggle` as the
three ways a click can change the set; the session keeps the anchor a
Shift-click runs from, and forgets it wherever it forgets the selection, so
the two cannot disagree. Clicking the one chosen clip again clears, as does
Escape and a line under the list, all meaning the same thing: back to all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@willkotheimer
willkotheimer merged commit c1e6a50 into main Sep 12, 2026
2 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.

1 participant