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.
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.
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.
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.




