[Feature Request] Custom Panels


#1

Been using RawTherapee full-throttle for several weeks now and absolutely love it. As a geek, to me it beats the pants off Lightroom and others.

I’ve not had any time to look at the code (I’m a developer by trade), so I wouldn’t be able to tackle this in any timely fashion (let alone sure if it’s reasonably do-able), so thought I’d pass a feature request/suggestion along.

In playing with RT, I’ve developed a comprehensive editing pipeline. However, a lot of the edits are dependent on other edits, so a tweak I make to one parameter might require tweaks to others. They are all deterministic interactions between one another, so I thought it might be neat if it was possible to have a single slider that affected both (or more) parameters simultaneously. Mind you, I’m not talking about simply linking sliders, but rather have the value of one slider explicitly affect (in some mathematical way) the value of another slider (or curve, or setting, or whatever).

Although my use-case is far more elaborate, a simple example would be to adjust noise reduction based on both ISO and exposure adjustments: a custom slider value of 0 would yield 0 noise reduction; drag it up to 50 (or 0.5 out of 1 or whatever scale) and the built-in noise reduction sliders (lum/chrom) change half of the maximum defined for that ISO with the current exposure coefficient.

In my opinion, the best way to achieve this would be a simple definition language that defines a new panel, slider, curve, etc, and the value of that component would affect the defined values on the built-in panels. Using the above example, something like so:

[Group]
name=My Custom Controls
id=myCustomControls

[myCustomControls:Slider]
name=ISO+Push Noise Reduction
id=isoPushNR
min=0.0
max=1.0
default=0.0
calc=( ( exif.iso / 400.0 ) * ( min( exposure.compensation, 0 ) * 2.5 ) ) * value
detail.noiseReduction.luminance=calc * max( abs( myCustomControls.balance - 1.0 ), 1.0 ) 
detail.noiseReduction.chrominance.master=calc * max( myCustomControls.balance + 1.0, 1.0 )

[myCustomControls:Slider]
name=Luminance/Chrominance Balance
id=balance
min=-1.0
max=1.0
default=0.0

…such that it creates a master value which is then applied to other built-in controls using further component-specific calculations, even to include other custom controls. Of course, from the perspective of usability, the values can’t necessarily percolate backwards, so any change to one of the affected built-in components should render the custom component invalid and should be marked as such. (Or there could be the option to “lock” the affected built-in component values such that they can’t be changed without explicitly un-binding them from the custom component.)

For my personal use, I’d like to see a more-Turing-Complete one with variables and possibly conditionals, to make the formation of curves easier/possible, or even a scripting engine (does it have one? I’m not familiar with the codebase), though I think a simple definition language would suffice for much third-party contributions and “plug-ins” in a manner of speaking.

I think it would be nice to have such a thing for less-proficient users that don’t want (or can’t) create a whole new build for a tiny feature, not to mention the capacity to enable the sharing of these new “features” would be much easier.

I’ll try to tackle it someday when I have time, but that won’t likely be for a year or two, so if someone wanted to run with this idea, it would be well received by at least this user!

Thanks again for such a great and powerful RAW editor! RawTherapee FTW!!!


(Alberto) #2

Hi @daniel,
what you ask would be cool indeed, but very hard to do at the moment. The codebase is not ready yet to have a scripting engine unfortunately :frowning: But maybe in a couple of years… :wink:
In the meantime, I suggest you take a look at G’MIC, which seems to be much closer to what you are asking (if I understood correctly). AFAIK also darktable can be scripted in Lua, but I don’t know much about what is possible there…