diff --git a/rtgui/pcvignette.cc b/rtgui/pcvignette.cc new file mode 100644 index 000000000..2869a0c64 --- /dev/null +++ b/rtgui/pcvignette.cc @@ -0,0 +1,143 @@ +/* + * This file is part of RawTherapee. + */ +#include "pcvignette.h" +#include + +using namespace rtengine; +using namespace rtengine::procparams; + +PCVignette::PCVignette () : Gtk::VBox(), FoldableToolPanel(this) +{ + set_border_width(4); + + enabled = Gtk::manage (new Gtk::CheckButton (M("GENERAL_ENABLED"))); + enabled->set_active (false); + enaConn = enabled->signal_toggled().connect( sigc::mem_fun(*this, &PCVignette::enabledChanged) ); + + strength = Gtk::manage (new Adjuster (M("TP_PCVIGNETTE_STRENGTH"), -6, 6, 0.01, 0)); + strength->set_tooltip_text (M("TP_PCVIGNETTE_STRENGTH_TOOLTIP")); + strength->setAdjusterListener (this); + + feather = Gtk::manage (new Adjuster (M("TP_PCVIGNETTE_FEATHER"), 0, 100, 1, 50)); + feather->set_tooltip_text (M("TP_PCVIGNETTE_FEATHER_TOOLTIP")); + feather->setAdjusterListener (this); + + roundness = Gtk::manage (new Adjuster (M("TP_PCVIGNETTE_ROUNDNESS"), 0, 100, 1, 50)); + roundness->set_tooltip_text (M("TP_PCVIGNETTE_ROUNDNESS_TOOLTIP")); + roundness->setAdjusterListener (this); + + pack_start(*enabled); + pack_start(*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_EXPAND_WIDGET, 4); + pack_start (*strength); + pack_start (*feather); + pack_start (*roundness); + + show_all(); +} + +void PCVignette::read (const ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener (); + + if (pedited) { + strength->setEditedState (pedited->pcvignette.strength ? Edited : UnEdited); + feather->setEditedState (pedited->pcvignette.feather ? Edited : UnEdited); + roundness->setEditedState (pedited->pcvignette.roundness ? Edited : UnEdited); + enabled->set_inconsistent (!pedited->pcvignette.enabled); + } + + enaConn.block (true); + enabled->set_active (pp->pcvignette.enabled); + enaConn.block (false); + strength->setValue (pp->pcvignette.strength); + feather->setValue (pp->pcvignette.feather); + roundness->setValue (pp->pcvignette.roundness); + + lastEnabled = pp->pcvignette.enabled; + + enableListener (); +} + +void PCVignette::write (ProcParams* pp, ParamsEdited* pedited) +{ + pp->pcvignette.strength = strength->getValue (); + pp->pcvignette.feather = (int)feather->getValue (); + pp->pcvignette.roundness = (int)roundness->getValue (); + pp->pcvignette.enabled = enabled->get_active(); + + if (pedited) { + pedited->pcvignette.strength = strength->getEditedState (); + pedited->pcvignette.feather = feather->getEditedState (); + pedited->pcvignette.roundness = roundness->getEditedState (); + pedited->pcvignette.enabled = !enabled->get_inconsistent(); + } +} + +void PCVignette::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +{ + strength->setDefault (defParams->pcvignette.strength); + feather->setDefault (defParams->pcvignette.feather); + roundness->setDefault (defParams->pcvignette.roundness); + + if (pedited) { + strength->setDefaultEditedState (pedited->pcvignette.strength ? Edited : UnEdited); + feather->setDefaultEditedState (pedited->pcvignette.feather ? Edited : UnEdited); + roundness->setDefaultEditedState (pedited->pcvignette.roundness ? Edited : UnEdited); + } else { + strength->setDefaultEditedState (Irrelevant); + feather->setDefaultEditedState (Irrelevant); + roundness->setDefaultEditedState (Irrelevant); + } +} + +void PCVignette::adjusterChanged (Adjuster* a, double newval) { + + if (listener && enabled->get_active()) { + listener->panelChanged (EvPCVignette, Glib::ustring::compose ("%1=%4\n%2=%5\n%3=%6", M("TP_PCVIGNETTE_STRENGTH"), M("TP_PCVIGNETTE_FEATHER"), M("TP_PCVIGNETTE_ROUNDNESS"), strength->getValue(), (int)feather->getValue(), (int)roundness->getValue())); + } +} + +void PCVignette::enabledChanged () { + + if (batchMode) { + if (enabled->get_inconsistent()) { + enabled->set_inconsistent (false); + enaConn.block (true); + enabled->set_active (false); + enaConn.block (false); + } + else if (lastEnabled) + enabled->set_inconsistent (true); + + lastEnabled = enabled->get_active (); + } + if (listener) { + if (enabled->get_active()) + listener->panelChanged (EvPCVignetteEnabled, M("GENERAL_ENABLED")); + else + listener->panelChanged (EvPCVignetteEnabled, M("GENERAL_DISABLED")); + } +} + +void PCVignette::setAdjusterBehavior (bool strengthadd, bool featheradd, bool roundnessadd) +{ + strength->setAddMode(strengthadd); + feather->setAddMode(featheradd); + roundness->setAddMode(roundnessadd); +} + +void PCVignette::trimValues (rtengine::procparams::ProcParams* pp) +{ + strength->trimValue(pp->pcvignette.strength); + feather->trimValue(pp->pcvignette.feather); + roundness->trimValue(pp->pcvignette.roundness); +} + +void PCVignette::setBatchMode (bool batchMode) +{ + ToolPanel::setBatchMode (batchMode); + strength->showEditedCB (); + feather->showEditedCB (); + roundness->showEditedCB (); +} diff --git a/rtgui/pcvignette.h b/rtgui/pcvignette.h new file mode 100644 index 000000000..cab1c568c --- /dev/null +++ b/rtgui/pcvignette.h @@ -0,0 +1,36 @@ +/* + * This file is part of RawTherapee. + */ +#ifndef _PCVIGNETTE_H_ +#define _PCVIGNETTE_H_ + +#include +#include "adjuster.h" +#include "toolpanel.h" + +class PCVignette : public Gtk::VBox, public AdjusterListener, public FoldableToolPanel { + + protected: + Gtk::CheckButton* enabled; + Adjuster* strength; + Adjuster* feather; + Adjuster* roundness; + bool lastEnabled; + sigc::connection enaConn; + + public: + + PCVignette (); + + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited=NULL); + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited=NULL); + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL); + void setBatchMode (bool batchMode); + + void adjusterChanged (Adjuster* a, double newval); + void enabledChanged (); + void setAdjusterBehavior (bool strengthadd, bool featheradd, bool roundnessadd); + void trimValues (rtengine::procparams::ProcParams* pp); +}; + +#endif