Repository navigation
feat: pinned threads and manual arrangement - #663
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #528
Evidence
After (desktop, light): pinned rows lead, each with its pin glyph
After (phone, light): Arrange threads
Checks (after rebasing on 4ed9683):
cargo fmt --all --check: cleancargo clippy --workspace --all-targets --locked -- -D warnings: cleancargo nextest run --workspace --locked:1048 tests run: 1048 passed, 13 skippedcargo machete: no unused dependenciesTests:
runtime::app::tests::pinning_promotes_and_exempts_until_a_settle_unpins: drives the pipe. A pin promotes a settled thread without stampingunsettled_at. An aged pinned thread survives the inactivity sweep while an unpinned one settles and loses its active order. Unpin keeps Active. Settle unpins. Covers both reorder refusals. Fails without the pinned blocker (checked).core::thread_sort::tests::{keys_fit_between_any_neighbours_and_refuse_corrupt_bounds, spread_keys_stay_ordered_and_insertable, a_move_writes_one_key_unless_a_neighbour_has_none}ui::sidebar::tests::pinned_rows_lead_and_a_drag_or_undo_writes_their_keys: checks the rendered order on desktop Flat and the phone list. A real mouse drag of an active row between two pins sends onePinSessionwith a key between theirs. Escape cancels a drag. Settle and undo sendUnsettleSession+PinSession{"t"}.core::settlementtests:pinnedjoins the blocker table, and a pinned thread with a merged PR does not settle.Live checks:
TCODE_DATA_DIRprofile: a real mouse drag pinned an active row between two pins. The phone shot shows the result ("Dark mode contrast pass" in Pinned).--local, same profile) for the Arrange page. The page was reached through a temporary local edit that rendered it in place of the thread list (not committed). The truncated title comes from the desktop phone example's traffic-light inset.Platform gaps:
Merge Danger
Door: two-way
Blast Radius: sidebar
New optional metadata fields and four new commands; old indexes decode unchanged. Row ordering, the hover verbs and the settle undo change for every sidebar layout.