feat(ui): show the VapourSynth calls each pass makes - #78
Merged
Conversation
Experts coming from Hybrid, StaxRip or AviSynth recognise
FixChromaBleedingMod or MSRCP instantly, and could not tell what a VapourBox
pass was doing from its labels. Each pass now prints its calls.
Advanced mode only, and only there: a plugin name is not actionable for
someone who has not asked for that level of detail, and advanced mode is the
app-wide lever for exactly that judgement.
Most of this was a display gap rather than a data one. Every method already
declared its own `function` and the Dart model already parsed it — it had never
been rendered anywhere. For those passes the readout simply names the selected
method.
Composite passes are the real work. Colour Correction was the reported case and
is the sharpest one: it has no method dropdown at all, so nothing in the UI
named any of the six things it can run. Such a pass now declares an
`implementation` list of its whole repertoire, each entry optionally gated by an
`activeWhen`, and the readout emphasises what is running while still showing
what is available. Seeing the inactive calls is the point — it says what the
pass could do, not only what it is doing now.
activeWhen reuses the visibleWhen matcher rather than adding a second one, so
the two cannot drift. It takes more than one key, and that is load-bearing:
applyLevels chooses *between* std.Levels and haf.SmoothLevels, so each is gated
on the pair {applyLevels, smoothLevels} and precisely one is ever emphasised.
Gating both on applyLevels alone would claim the pass runs two levels
operations. Chroma Fixes has the same shape, where automatic and manual chroma
alignment are both core.resize.Spline36 and automatic supersedes manual.
Four placeholder function names are fixed rather than displayed: spotless ->
spotless.SpotLess, qtgmc_internal -> haf.QTGMC (NoiseProcess), whisper ->
whisper-cli, and havsfunc.ChangeFPS -> haf.ChangeFPS, a prefix used nowhere
else. "custom" stays as bookkeeping on the three composite passes but is never
shown, asserted.
Crop & Resize's scaling entry reads core.resize.* rather than a concrete
kernel: the kernel is a seven-way enum already visible as its own dropdown
directly above, so listing all seven greyed out would be noise. It is the one
entry that is not a literal callable name.
Four schema lints per filter, all of which fail silently otherwise: a blank
function, a "custom" method with no implementation list, an activeWhen naming
a parameter that does not exist (the call would read as permanently inactive,
the same failure as a visibleWhen naming a missing parameter), and a list where
nothing can ever be active.
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.
Experts coming from Hybrid, StaxRip or AviSynth recognise
FixChromaBleedingModorMSRCPinstantly, and couldn't tell what a VapourBox pass was doing from its labels. Each pass now prints its calls.Advanced mode only — a plugin name isn't actionable for someone who hasn't asked for that level of detail, and advanced mode is the app-wide lever for exactly that judgement.
Two shapes, because filters come in two shapes
One call per method — the readout names the selected method's own
function:This data already existed on all 49 methods and was already parsed by the Dart model. It had simply never been rendered anywhere, so for these passes this was a display gap, not a data one.
Composite passes — Colour Correction, Chroma Fixes and Crop & Resize aren't one call. They now declare an
implementationlist of the whole repertoire, and the readout emphasises what's running:Showing the inactive calls is the point: it says what the pass could do, not only what it's doing now.
Colour Correction was the reported case and is the sharpest one — it has no method dropdown at all (the inert one went in the panel audit), so nothing anywhere in the UI named any of those six.
activeWhentakes more than one key, and that's load-bearingapplyLevelschooses betweenstd.Levelsandhaf.SmoothLevels, so each is gated on the pair{applyLevels, smoothLevels}and precisely one is ever emphasised. Gating both onapplyLevelsalone would claim the pass runs two levels operations. Chroma Fixes has the same shape: automatic and manual alignment are bothcore.resize.Spline36, told apart only by their role text, and automatic supersedes manual exactly as the generator does.It reuses
_checkVisibleWhenrather than adding a second matcher, so the two can't drift.Placeholders fixed rather than displayed
spotless→spotless.SpotLess,qtgmc_internal→haf.QTGMC (NoiseProcess),whisper→whisper-cli, andhavsfunc.ChangeFPS→haf.ChangeFPS(a prefix used nowhere else).customstays as bookkeeping on the three composite passes but is never shown — asserted.One judgement call to flag
Crop & Resize's scaling entry reads
core.resize.*rather than a concrete kernel, because the kernel is a seven-way enum already visible as its own dropdown directly above; listing all seven greyed out seemed like noise. It's the one entry that isn't a literal callable name. Straightforward to expand into sevenactiveWhen-gated entries if exactness is preferred.Testing
820 Flutter tests pass. New:
applyLevelscase in both directions, the automatic/manual Spline36 pair, and placeholder suppression.function,customwithout animplementationlist,activeWhennaming a non-existent parameter (the call would read as permanently inactive — same failure mode as avisibleWhennaming a missing parameter), and a list where nothing can ever be active.Documented in
docs/FILTER_SCHEMA.mdandCLAUDE.md.