Here's an example that goes a bit everywhere. It's meant to give ideas, and i'm not really going to pursue it further.
It uses the paster object.
A continuous brush is done by keeping track of the previous mouse position, then instead of drawing the brush at only the mouse position it lerps from the old mouse position to the new and draws the brush at every spot.
The opacity is done by drawing to another object first at 100%. Then that is drawn with the opacity to the main canvas.
Brush size is pretty easy. Coloring the brush done by applying a blend mode to the brush with a color.
A color picker could be done with a canvas object with an image and using rgb at expressions to get color of a spot.
Brush shape can be customized easily but soft brushes always come out as hard brushes. This probably can be fixed by using a shader to change how the brush strokes are blended together, but the paster plugin is breaking with shaders, so that's a no go.
The capx also generates the brush shape but that was frivolous experiment. As opposed to many other capx this one isn't cleaned up at all.