Yash Bavadiya

Week 4: Channel Colors, Reset, Point Values, and Ghost Curves

This is a weekly update from my Google Summer of Code 2026 project with KDE, improving effect widgets in Kdenlive, a free and open source video editor.

This week JB reviewed the per-channel tabs work on MR !887 and asked for four usability improvements. All four are now in the MR.

Per-channel curve colors

With four tabs (All/R/G/B) it wasn't obvious at a glance which channel you were editing. JB suggested passing a color through the XML:

<parameter type="av_curve" name="av.g" default="" color="#44CC44">
    <name>G</name>
</parameter>

The color attribute is now read in AssetParameterModel and passed down to KisCurveWidget, which uses it to draw that channel's curve line instead of the default neutral color. All/R/G/B use #CCCCCC/#FF4444/#44CC44/#4488FF.

Red Channel Green Channel Blue Channel

Reset button for the active channel

A small button next to the point spinboxes resets only the currently active tab's curve back to identity, going through KisCurveWidget::reset(); the same model update path as a normal edit, so it persists correctly on save.

Input/Output value display

JB asked for the selected point's X/Y to be shown numerically, like GIMP's curve editor, for finer adjustments and reproducibility. The underlying DragValue spinboxes for this already existed in the curve widget's .ui file but had never actually rendered, for either frei0r.curves or avfilter.curves; a layout ordering bug going back years. Rather than untangle that legacy code, I added two new QDoubleSpinBox widgets directly, wired to the existing currentPoint signal that fires on point selection/drag.

Input/Output values

Ghost overlay of edited channels

JB also suggested copying GIMP's behavior of showing all non-null curves at once, so you can see how channels relate while editing one. When a channel's curve is active for editing, the other channels are now drawn faintly, in their own colors, if they've been edited away from identity. The active channel stays fully opaque on top.

Ghost Overlays

All four changes are in MR !887. 48 unit test assertions pass; also fixed a test-environment issue where avcurvetest wasn't loading the Kdenlive XML effect definitions, which had been masking proper av_curve parameter typing.

JB's m_widgets null-placeholder feedback from last week is still unresolved, waiting on his direction before touching it.