Skip to content

feat(app): move tasks into a canvas dock and make FFT a real step - #24

Merged
nmrtist merged 1 commit into
mainfrom
feat/workspace-surfaces
Jul 28, 2026
Merged

nmrtist merged 1 commit into
mainfrom
feat/workspace-surfaces

Conversation

@nmrtist

@nmrtist nmrtist commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Why

Processing was pinned to the Secondary Side Bar beside the Object inspector, and
each canvas task drew its own floating card. Opening a second task discarded the
first one's configuration, and a tall inspector could push the Processing group
past the clip rect — the most basic manual processing became unreachable exactly
when the selection was richest.

FFT was an anchor rather than a step: it could not be removed or moved past, the
row menu offered moves the commit path silently declined (indistinguishable from
a broken menu), and a raw acquisition had no way to show its FID.

What changed

Task dock. Processing opens as a card at the upper right of the canvas, the
corner it now shares with Regions, Curve Fit, and Statistics. Once two are open,
tabs appear — Process, Regions, Fit, Stats — and one page shows
at a time. Switching tabs keeps every page's settings; only closing a page with
its ✕ discards them, and choosing a tab makes that page's dataset active. The
card header names the dataset, its source (Raw FID, 2D acquisition,
Imported spectrum), whether the recipe is still the default, and whether the
pipeline ends in time- or frequency-domain output.

Secondary Side Bar. The inspector and selection analysis now draw inside a
single scroll viewport, so no section can be made unreachable by the length of
another. Processing is no longer duplicated here. The inspector gains a row of
section buttons that scroll without reordering, and its heading reports object
and dataset counts for a multi-selection while rows that disagree read mixed
rather than presenting one object's value as the answer.

FFT as an ordinary step. FFT becomes a Time to Frequency step that can be
added, deleted, disabled, or moved like any other; a pipeline holds at most one,
so Duplicate is unavailable on it. Remove or disable it on a raw acquisition
and the canvas switches to the FID plotted against acquisition time. The
frequency-domain steps stay in the recipe marked Disabled: requires Frequency
input
, so adding FFT back restores their settings rather than making the user
re-enter them. Imported frequency-domain data is never given a fictitious FID.

Ordered time-domain execution. Time-domain steps run in the order shown, on
either side of that choice: two zero fills compose, and an apodization moved
below zero filling sees the padded length.

Boundary refusals are stated, not silent. move_block states the rule once.
The menu disables the entry and attaches the reason to the entry the user reached
for, and the commit path refuses the same move and reports it — so a keyboard or
future drag gesture cannot bypass the boundary. The inert grip icon is gone until
a gesture exists behind it.

Domain-aware downstream surfaces. Task, analysis, and export paths read the
pipeline's output domain instead of assuming frequency. Peak detection and the
peak list, line fitting, integrals, and multiplets are disabled with a reason
while the output is an FID; existing peaks and integrals are kept, not
discarded, and return with the FFT step.

Docs

guides/processing (new Where processing lives and The FFT step sections),
reference/ui-overview, reference/command-palette, getting-started/*, and
guides/templates|automation updated, with the Simplified Chinese pages kept
aligned.

Verification

  • cargo pr-check — passes (fmt, file size, dependency policy, default-frontend
    check, Clippy, tests in both backend configurations).
  • npm run build in docs/ — passes.

Processing was pinned to the Secondary Side Bar beside the Object
inspector, and each canvas task drew its own floating card, so opening a
second task threw away the first one's configuration and a tall inspector
could push the Processing group outside the clip rect entirely. FFT was a
fixed anchor in the recipe rather than a step: it could not be removed or
moved past, the menu offered moves it silently declined, and a raw
acquisition had no way to show its FID.

Processing now lives in a task dock at the upper right of the canvas.
Processing, Regions, Curve Fit, and Statistics share that corner and grow
tabs once two are open, keeping every page's settings while showing one page
at a time; closing a page is what discards it, and choosing a tab makes that
page's dataset active. The Secondary Side Bar holds the inspector and
selection analysis in a single scroll viewport, so no section can be made
unreachable by the length of another, and Processing is no longer duplicated
there. The inspector gains section links, and a multi-selection reports its
object and dataset counts while preserving mixed values.

FFT becomes a typed Time -> Frequency step that can be added, deleted,
enabled, disabled, or reordered. Removing it puts the canvas back on the FID
with an acquisition-time axis; frequency steps left without frequency input
stay in the recipe, disabled with a reason, so restoring FFT restores their
settings instead of recreating them. Time-domain steps execute in displayed
order on both sides of that choice, so multiple zero fills compose and an
apodization moved after zero filling sees the padded length. Moves that
would cross a domain boundary are refused in the commit path and explained
on the menu entry the user reached for, so no other entry point can bypass
the rule. Imported frequency-domain data is never given a fictitious FID or
FFT.

Task, analysis, and export surfaces read the pipeline's output domain rather
than assuming frequency, so peaks, line fitting, integrals, and multiplets
are unavailable while the output is an FID and become usable again when FFT
returns.
@nmrtist
nmrtist merged commit a03b6e2 into main Jul 28, 2026
11 checks passed
@nmrtist
nmrtist deleted the feat/workspace-surfaces branch July 28, 2026 11:15
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 28, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant