diff --git a/rtdata/languages/default b/rtdata/languages/default index e4f6a5912..0e532f149 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -723,6 +723,7 @@ HISTORY_MSG_488;HDR Tone Mapping HISTORY_MSG_489;HDR TM - Threshold HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance +HISTORY_MSG_492;RGB Curves HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index ad7e4260d..7552cf523 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3146,7 +3146,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer {wprof[2][0], wprof[2][1], wprof[2][2]} }; - bool mixchannels = (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || + bool mixchannels = params->chmixer.enabled && + (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || params->chmixer.green[0] != 0 || params->chmixer.green[1] != 100 || params->chmixer.green[2] != 0 || params->chmixer.blue[0] != 0 || params->chmixer.blue[1] != 0 || params->chmixer.blue[2] != 100); @@ -3159,9 +3160,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer FlatCurveType sCurveType = (FlatCurveType)params->hsvequalizer.scurve.at (0); FlatCurveType vCurveType = (FlatCurveType)params->hsvequalizer.vcurve.at (0); FlatCurveType bwlCurveType = (FlatCurveType)params->blackwhite.luminanceCurve.at (0); - bool hCurveEnabled = hCurveType > FCT_Linear; - bool sCurveEnabled = sCurveType > FCT_Linear; - bool vCurveEnabled = vCurveType > FCT_Linear; + bool hCurveEnabled = params->hsvequalizer.enabled && hCurveType > FCT_Linear; + bool sCurveEnabled = params->hsvequalizer.enabled && sCurveType > FCT_Linear; + bool vCurveEnabled = params->hsvequalizer.enabled && vCurveType > FCT_Linear; bool bwlCurveEnabled = bwlCurveType > FCT_Linear; // TODO: We should create a 'skip' value like for CurveFactory::complexsgnCurve (rtengine/curves.cc) @@ -3760,7 +3761,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - if (rCurve || gCurve || bCurve) { // if any of the RGB curves is engaged + if (params->rgbCurves.enabled && (rCurve || gCurve || bCurve)) { // if any of the RGB curves is engaged if (!params->rgbCurves.lumamode) { // normal RGB mode for (int i = istart, ti = 0; i < tH; i++, ti++) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 169b22584..bde32f92f 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -518,6 +518,7 @@ enum ProcEvent { EvTMFattalThreshold = 488, EvTMFattalAmount = 489, EvWBEnabled = 490, + EvRGBEnabled = 491, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ff5f0b386..82e47769f 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -559,6 +559,7 @@ bool LCurveParams::operator !=(const LCurveParams& other) const } RGBCurvesParams::RGBCurvesParams() : + enabled(false), lumamode(false), rcurve{ DCT_Linear @@ -575,7 +576,8 @@ RGBCurvesParams::RGBCurvesParams() : bool RGBCurvesParams::operator ==(const RGBCurvesParams& other) const { return - lumamode == other.lumamode + enabled == other.enabled + && lumamode == other.lumamode && rcurve == other.rcurve && gcurve == other.gcurve && bcurve == other.bcurve; @@ -1753,6 +1755,7 @@ bool VignettingParams::operator !=(const VignettingParams& other) const } ChannelMixerParams::ChannelMixerParams() : + enabled(false), red{ 100, 0, @@ -1773,6 +1776,9 @@ ChannelMixerParams::ChannelMixerParams() : bool ChannelMixerParams::operator ==(const ChannelMixerParams& other) const { + if (enabled != other.enabled) { + return false; + } for (unsigned int i = 0; i < 3; ++i) { if ( red[i] != other.red[i] @@ -2261,6 +2267,7 @@ bool DirPyrEqualizerParams::operator !=(const DirPyrEqualizerParams& other) cons } HSVEqualizerParams::HSVEqualizerParams() : + enabled(false), hcurve{ FCT_Linear }, @@ -2276,7 +2283,8 @@ HSVEqualizerParams::HSVEqualizerParams() : bool HSVEqualizerParams::operator ==(const HSVEqualizerParams& other) const { return - hcurve == other.hcurve + enabled == other.enabled + && hcurve == other.hcurve && scurve == other.scurve && vcurve == other.vcurve; } @@ -2746,6 +2754,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->retinex.gaintransmissionCurve, "Retinex", "GainTransmissionCurve", retinex.gaintransmissionCurve, keyFile); // Channel mixer + saveToKeyfile(!pedited || pedited->chmixer.enabled, "Channel Mixer", "Enabled", chmixer.enabled, keyFile); if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE); keyFile.set_integer_list ("Channel Mixer", "Red", rmix); @@ -3226,6 +3235,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->dirpyrequalizer.hueskin, "Directional Pyramid Equalizer", "Hueskin", dirpyrequalizer.hueskin.toVector(), keyFile); // HSV Equalizer + saveToKeyfile(!pedited || pedited->hsvequalizer.enabled, "HSV Equalizer", "Enabled", hsvequalizer.enabled, keyFile); saveToKeyfile(!pedited || pedited->hsvequalizer.hcurve, "HSV Equalizer", "HCurve", hsvequalizer.hcurve, keyFile); saveToKeyfile(!pedited || pedited->hsvequalizer.scurve, "HSV Equalizer", "SCurve", hsvequalizer.scurve, keyFile); saveToKeyfile(!pedited || pedited->hsvequalizer.vcurve, "HSV Equalizer", "VCurve", hsvequalizer.vcurve, keyFile); @@ -3235,6 +3245,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->filmSimulation.clutFilename, "Film Simulation", "ClutFilename", filmSimulation.clutFilename, keyFile); saveToKeyfile(!pedited || pedited->filmSimulation.strength, "Film Simulation", "Strength", filmSimulation.strength, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.enabled, "RGB Curves", "Enabled", rgbCurves.enabled, keyFile); saveToKeyfile(!pedited || pedited->rgbCurves.lumamode, "RGB Curves", "LumaMode", rgbCurves.lumamode, keyFile); saveToKeyfile(!pedited || pedited->rgbCurves.rcurve, "RGB Curves", "rCurve", rgbCurves.rcurve, keyFile); saveToKeyfile(!pedited || pedited->rgbCurves.gcurve, "RGB Curves", "gCurve", rgbCurves.gcurve, keyFile); @@ -3454,6 +3465,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("Channel Mixer")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "Channel Mixer", "Enabled", pedited, chmixer.enabled, pedited->chmixer.enabled); + } else { + chmixer.enabled = true; + if (pedited) { + pedited->chmixer.enabled = true; + } + } if (keyFile.has_key ("Channel Mixer", "Red") && keyFile.has_key ("Channel Mixer", "Green") && keyFile.has_key ("Channel Mixer", "Blue")) { const std::vector rmix = keyFile.get_integer_list ("Channel Mixer", "Red"); const std::vector gmix = keyFile.get_integer_list ("Channel Mixer", "Green"); @@ -4392,6 +4411,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("HSV Equalizer")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "HSV Equalizer", "Enabled", pedited, hsvequalizer.enabled, pedited->hsvequalizer.enabled); + } else { + hsvequalizer.enabled = true; + if (pedited) { + pedited->hsvequalizer.enabled = true; + } + } if (ppVersion >= 300) { assignFromKeyfile(keyFile, "HSV Equalizer", "HCurve", pedited, hsvequalizer.hcurve, pedited->hsvequalizer.hcurve); assignFromKeyfile(keyFile, "HSV Equalizer", "SCurve", pedited, hsvequalizer.scurve, pedited->hsvequalizer.scurve); @@ -4400,6 +4427,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("RGB Curves")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "RGB Curves", "Enabled", pedited, rgbCurves.enabled, pedited->rgbCurves.enabled); + } else { + rgbCurves.enabled = true; + if (pedited) { + pedited->rgbCurves.enabled = true; + } + } assignFromKeyfile(keyFile, "RGB Curves", "LumaMode", pedited, rgbCurves.lumamode, pedited->rgbCurves.lumamode); assignFromKeyfile(keyFile, "RGB Curves", "rCurve", pedited, rgbCurves.rcurve, pedited->rgbCurves.rcurve); assignFromKeyfile(keyFile, "RGB Curves", "gCurve", pedited, rgbCurves.gcurve, pedited->rgbCurves.gcurve); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 35f7b79f9..f7e23771a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -367,6 +367,7 @@ struct LCurveParams * Parameters of the RGB curves */ struct RGBCurvesParams { + bool enabled; bool lumamode; std::vector rcurve; std::vector gcurve; @@ -896,6 +897,7 @@ struct VignettingParams { * Parameters of the color mixer */ struct ChannelMixerParams { + bool enabled; int red[3]; int green[3]; int blue[3]; @@ -1138,6 +1140,7 @@ struct DirPyrEqualizerParams { * HSV equalizer params */ struct HSVEqualizerParams { + bool enabled; std::vector hcurve; std::vector scurve; std::vector vcurve; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 676c1efbf..86b602562 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -517,6 +517,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { ALLNORAW, // EvTMFattalEnabled HDR, // EvTMFattalThreshold HDR, // EvTMFattalAmount - ALLNORAW // EvWBEnabled + ALLNORAW, // EvWBEnabled + RGBCURVE // EvRGBEnabled }; diff --git a/rtgui/chmixer.cc b/rtgui/chmixer.cc index 7d71da9a9..c6c098883 100644 --- a/rtgui/chmixer.cc +++ b/rtgui/chmixer.cc @@ -22,7 +22,7 @@ using namespace rtengine; using namespace rtengine::procparams; -ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL")) +ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), false, true) { imgIcon[0] = Gtk::manage (new RTImage ("Chanmixer-RR.png")); @@ -99,12 +99,16 @@ void ChMixer::read (const ProcParams* pp, const ParamsEdited* pedited) disableListener (); - if (pedited) + setEnabled(pp->chmixer.enabled); + + if (pedited) { for (int i = 0; i < 3; i++) { red[i]->setEditedState (pedited->chmixer.red[i] ? Edited : UnEdited); green[i]->setEditedState (pedited->chmixer.green[i] ? Edited : UnEdited); blue[i]->setEditedState (pedited->chmixer.blue[i] ? Edited : UnEdited); } + set_inconsistent(multiImage && !pedited->chmixer.enabled); + } for (int i = 0; i < 3; i++) { red[i]->setValue (pp->chmixer.red[i]); @@ -123,13 +127,16 @@ void ChMixer::write (ProcParams* pp, ParamsEdited* pedited) pp->chmixer.green[i] = (int) green[i]->getValue (); pp->chmixer.blue[i] = (int) blue[i]->getValue (); } + pp->chmixer.enabled = getEnabled(); - if (pedited) + if (pedited) { for (int i = 0; i < 3; i++) { pedited->chmixer.red[i] = red[i]->getEditedState (); pedited->chmixer.green[i] = green[i]->getEditedState (); pedited->chmixer.blue[i] = blue[i]->getEditedState (); } + pedited->chmixer.enabled = !get_inconsistent(); + } } void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) @@ -158,7 +165,7 @@ void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi void ChMixer::adjusterChanged (Adjuster* a, double newval) { - if (listener) { + if (listener && getEnabled()) { Glib::ustring descr = Glib::ustring::compose ("R=%1,%2,%3\nG=%4,%5,%6\nB=%7,%8,%9", (int)red[0]->getValue(), (int)red[1]->getValue(), (int)red[2]->getValue(), (int)green[0]->getValue(), (int)green[1]->getValue(), (int)green[2]->getValue(), @@ -167,6 +174,21 @@ void ChMixer::adjusterChanged (Adjuster* a, double newval) } } + +void ChMixer::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvChMixer, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvChMixer, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvChMixer, M("GENERAL_DISABLED")); + } + } +} + + void ChMixer::setBatchMode (bool batchMode) { diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h index bd85517de..410ac0d16 100644 --- a/rtgui/chmixer.h +++ b/rtgui/chmixer.h @@ -44,6 +44,7 @@ public: void adjusterChanged (Adjuster* a, double newval); void setAdjusterBehavior (bool rgbadd); void trimValues (rtengine::procparams::ProcParams* pp); + void enabledChanged(); }; #endif diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index e74848cf3..1dfb017a7 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -25,7 +25,7 @@ using namespace rtengine::procparams; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL")) +HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL"), false, true) { std::vector bottomMilestones; @@ -84,11 +84,13 @@ void HSVEqualizer::read (const ProcParams* pp, const ParamsEdited* pedited) hshape->setUnChanged (!pedited->hsvequalizer.hcurve); sshape->setUnChanged (!pedited->hsvequalizer.scurve); vshape->setUnChanged (!pedited->hsvequalizer.vcurve); + set_inconsistent(multiImage && !pedited->hsvequalizer.enabled); } hshape->setCurve (pp->hsvequalizer.hcurve); sshape->setCurve (pp->hsvequalizer.scurve); vshape->setCurve (pp->hsvequalizer.vcurve); + setEnabled(pp->hsvequalizer.enabled); enableListener (); } @@ -116,7 +118,7 @@ void HSVEqualizer::autoOpenCurve () void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->hsvequalizer.enabled = getEnabled(); pp->hsvequalizer.hcurve = hshape->getCurve (); pp->hsvequalizer.scurve = sshape->getCurve (); pp->hsvequalizer.vcurve = vshape->getCurve (); @@ -126,6 +128,7 @@ void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited) pedited->hsvequalizer.hcurve = !hshape->isUnChanged (); pedited->hsvequalizer.scurve = !sshape->isUnChanged (); pedited->hsvequalizer.vcurve = !vshape->isUnChanged (); + pedited->hsvequalizer.enabled = !get_inconsistent(); } } @@ -138,7 +141,7 @@ void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited) void HSVEqualizer::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == hshape) { listener->panelChanged (EvHSVEqualizerH, M("HISTORY_CUSTOMCURVE")); } @@ -199,3 +202,17 @@ void HSVEqualizer::setBatchMode (bool batchMode) curveEditorG->setBatchMode (batchMode); } + + +void HSVEqualizer::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_DISABLED")); + } + } +} diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index d02cc378c..fc3d22984 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -54,6 +54,7 @@ public: virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); //void adjusterChanged (Adjuster* a, double newval); + void enabledChanged(); }; #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index b649272db..57fd7646f 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -97,6 +97,7 @@ void ParamsEdited::set (bool v) labCurve.avoidcolorshift = v; labCurve.rstprotection = v; labCurve.lcredsk = v; + rgbCurves.enabled = v; rgbCurves.lumamode = v; rgbCurves.rcurve = v; rgbCurves.gcurve = v; @@ -320,6 +321,7 @@ void ParamsEdited::set (bool v) vignetting.strength = v; vignetting.centerX = v; vignetting.centerY = v; + chmixer.enabled = v; chmixer.red[0] = v; chmixer.red[1] = v; chmixer.red[2] = v; @@ -548,6 +550,7 @@ void ParamsEdited::set (bool v) dirpyrequalizer.skinprotect = v; dirpyrequalizer.hueskin = v; //dirpyrequalizer.algo = v; + hsvequalizer.enabled = v; hsvequalizer.hcurve = v; hsvequalizer.scurve = v; hsvequalizer.vcurve = v; @@ -638,6 +641,7 @@ void ParamsEdited::initFrom (const std::vector labCurve.avoidcolorshift = labCurve.avoidcolorshift && p.labCurve.avoidcolorshift == other.labCurve.avoidcolorshift; labCurve.rstprotection = labCurve.rstprotection && p.labCurve.rstprotection == other.labCurve.rstprotection; labCurve.lcredsk = labCurve.lcredsk && p.labCurve.lcredsk == other.labCurve.lcredsk; + rgbCurves.enabled = rgbCurves.enabled && p.rgbCurves.enabled == other.rgbCurves.enabled; rgbCurves.lumamode = rgbCurves.lumamode && p.rgbCurves.lumamode == other.rgbCurves.lumamode; rgbCurves.rcurve = rgbCurves.rcurve && p.rgbCurves.rcurve == other.rgbCurves.rcurve; rgbCurves.gcurve = rgbCurves.gcurve && p.rgbCurves.gcurve == other.rgbCurves.gcurve; @@ -865,6 +869,7 @@ void ParamsEdited::initFrom (const std::vector vignetting.strength = vignetting.strength && p.vignetting.strength == other.vignetting.strength; vignetting.centerX = vignetting.centerX && p.vignetting.centerX == other.vignetting.centerX; vignetting.centerY = vignetting.centerY && p.vignetting.centerY == other.vignetting.centerY; + chmixer.enabled = chmixer.enabled && p.chmixer.enabled == other.chmixer.enabled; chmixer.red[0] = chmixer.red[0] && p.chmixer.red[0] == other.chmixer.red[0]; chmixer.red[1] = chmixer.red[1] && p.chmixer.red[1] == other.chmixer.red[1]; chmixer.red[2] = chmixer.red[2] && p.chmixer.red[2] == other.chmixer.red[2]; @@ -1086,6 +1091,7 @@ void ParamsEdited::initFrom (const std::vector dirpyrequalizer.skinprotect = dirpyrequalizer.skinprotect && p.dirpyrequalizer.skinprotect == other.dirpyrequalizer.skinprotect; // dirpyrequalizer.algo = dirpyrequalizer.algo && p.dirpyrequalizer.algo == other.dirpyrequalizer.algo; dirpyrequalizer.hueskin = dirpyrequalizer.hueskin && p.dirpyrequalizer.hueskin == other.dirpyrequalizer.hueskin; + hsvequalizer.enabled = hsvequalizer.enabled && p.hsvequalizer.enabled == other.hsvequalizer.enabled; hsvequalizer.hcurve = hsvequalizer.hcurve && p.hsvequalizer.hcurve == other.hsvequalizer.hcurve; hsvequalizer.scurve = hsvequalizer.scurve && p.hsvequalizer.scurve == other.hsvequalizer.scurve; hsvequalizer.vcurve = hsvequalizer.vcurve && p.hsvequalizer.vcurve == other.hsvequalizer.vcurve; @@ -1358,6 +1364,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.labCurve.lcredsk = mods.labCurve.lcredsk; } + if (rgbCurves.enabled) { + toEdit.rgbCurves.enabled = mods.rgbCurves.enabled; + } + if (rgbCurves.lumamode) { toEdit.rgbCurves.lumamode = mods.rgbCurves.lumamode; } @@ -2195,6 +2205,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.vignetting.centerY = dontforceSet && options.baBehav[ADDSET_VIGN_CENTER] ? toEdit.vignetting.centerY + mods.vignetting.centerY : mods.vignetting.centerY; } + if (chmixer.enabled) { + toEdit.chmixer.enabled = mods.chmixer.enabled; + } + for (int i = 0; i < 3; i++) { if (chmixer.red[i]) { toEdit.chmixer.red[i] = dontforceSet && options.baBehav[ADDSET_CHMIXER] ? toEdit.chmixer.red[i] + mods.chmixer.red[i] : mods.chmixer.red[i]; @@ -3014,6 +3028,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten } // if (dirpyrequalizer.algo) toEdit.dirpyrequalizer.algo = mods.dirpyrequalizer.algo; + if (hsvequalizer.enabled) { + toEdit.hsvequalizer.enabled = mods.hsvequalizer.enabled; + } + if (hsvequalizer.hcurve) { toEdit.hsvequalizer.hcurve = mods.hsvequalizer.hcurve; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f8f76f036..62fd8c9f4 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -123,6 +123,7 @@ class RGBCurvesParamsEdited { public: + bool enabled; bool lumamode; bool rcurve; bool gcurve; @@ -488,6 +489,7 @@ class ChannelMixerParamsEdited { public: + bool enabled; bool red[3]; bool green[3]; bool blue[3]; @@ -678,6 +680,7 @@ class HSVEqualizerParamsEdited { public: + bool enabled; bool hcurve; bool scurve; bool vcurve; diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index d799be406..c6f2598b0 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,11 +1,13 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 328 +#define PPVERSION 329 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 329 2017-12-09 + Added 'Enabled' flag for Channel Mixer, RGB Curves and HSV Equalizer 328 2017-11-22 Fix wrong type of ff_clipControl 327 2017-09-15 diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc index d9c970f7a..d32633bf4 100644 --- a/rtgui/rgbcurves.cc +++ b/rtgui/rgbcurves.cc @@ -21,7 +21,7 @@ using namespace rtengine; using namespace rtengine::procparams; -RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL")) +RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL"), false, true) { lumamode = Gtk::manage (new Gtk::CheckButton (M("TP_RGBCURVES_LUMAMODE"))); @@ -84,6 +84,7 @@ void RGBCurves::read (const ProcParams* pp, const ParamsEdited* pedited) Gshape->setUnChanged (!pedited->rgbCurves.gcurve); Bshape->setUnChanged (!pedited->rgbCurves.bcurve); lumamode->set_inconsistent (!pedited->rgbCurves.lumamode); + set_inconsistent(multiImage && !pedited->rgbCurves.enabled); } lumamodeConn.block (true); @@ -96,6 +97,8 @@ void RGBCurves::read (const ProcParams* pp, const ParamsEdited* pedited) Gshape->setCurve (pp->rgbCurves.gcurve); Bshape->setCurve (pp->rgbCurves.bcurve); + setEnabled(pp->rgbCurves.enabled); + enableListener (); } @@ -122,13 +125,14 @@ void RGBCurves::autoOpenCurve () void RGBCurves::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->rgbCurves.enabled = getEnabled(); pp->rgbCurves.rcurve = Rshape->getCurve (); pp->rgbCurves.gcurve = Gshape->getCurve (); pp->rgbCurves.bcurve = Bshape->getCurve (); pp->rgbCurves.lumamode = lumamode->get_active(); if (pedited) { + pedited->rgbCurves.enabled = !get_inconsistent(); pedited->rgbCurves.rcurve = !Rshape->isUnChanged (); pedited->rgbCurves.gcurve = !Gshape->isUnChanged (); pedited->rgbCurves.bcurve = !Bshape->isUnChanged (); @@ -146,7 +150,7 @@ void RGBCurves::write (ProcParams* pp, ParamsEdited* pedited) void RGBCurves::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == Rshape) { listener->panelChanged (EvRGBrCurve, M("HISTORY_CUSTOMCURVE")); } @@ -177,7 +181,7 @@ void RGBCurves::lumamodeChanged () lastLumamode = lumamode->get_active (); } - if (listener) { + if (listener && getEnabled()) { if (lumamode->get_active ()) { listener->panelChanged (EvRGBrCurveLumamode, M("GENERAL_ENABLED")); } else { @@ -202,3 +206,16 @@ void RGBCurves::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & his // Bshape->updateBackgroundHistogram (histBlue); } + +void RGBCurves::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvRGBEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvRGBEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvRGBEnabled, M("GENERAL_DISABLED")); + } + } +} diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index efca76422..dfcba71f9 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -53,6 +53,7 @@ public: void curveChanged (CurveEditor* ce); void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI); void lumamodeChanged (); + void enabledChanged(); }; #endif