Saving of Locallab tool parameters in .pp3 file

- Control spot panel parameters are now saved in .pp3 file
- Control spot curved are now visible when Locallab tool panel is
active, not visible otherwise

Limitations:
- Other Locallab tool parameters aren't saved in .pp3 file yet
- Locallab tools are temporary deactivated (time to end procparam
update)
This commit is contained in:
Pandagrapher
2018-07-26 19:20:33 +02:00
parent 74dd3a6a10
commit a31393adb1
21 changed files with 2913 additions and 2817 deletions

View File

@@ -28,7 +28,7 @@
using namespace rtengine::procparams;
ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChanged(false), editDataProvider(nullptr)
ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChanged(false), editDataProvider(nullptr), photoLoadedOnce(false)
{
exposurePanel = Gtk::manage(new ToolVBox());
@@ -36,7 +36,7 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
colorPanel = Gtk::manage(new ToolVBox());
transformPanel = Gtk::manage(new ToolVBox());
rawPanel = Gtk::manage(new ToolVBox());
advancedPanel = Gtk::manage (new ToolVBox ());
advancedPanel = Gtk::manage(new ToolVBox());
locallabPanel = Gtk::manage(new ToolVBox());
coarse = Gtk::manage(new CoarsePanel());
@@ -107,7 +107,7 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
addPanel(colorPanel, blackwhite);
addPanel(exposurePanel, shadowshighlights);
addPanel(detailsPanel, sharpening);
addPanel (detailsPanel, localContrast);
addPanel(detailsPanel, localContrast);
addPanel(detailsPanel, sharpenEdge);
addPanel(detailsPanel, sharpenMicro);
addPanel(colorPanel, hsvequalizer);
@@ -116,16 +116,16 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
addPanel(colorPanel, colortoning);
addPanel(exposurePanel, epd);
addPanel(exposurePanel, fattal);
addPanel (advancedPanel, retinex);
addPanel(advancedPanel, retinex);
addPanel(exposurePanel, pcvignette);
addPanel(exposurePanel, gradient);
addPanel(exposurePanel, lcurve);
addPanel (advancedPanel, colorappearance);
addPanel(advancedPanel, colorappearance);
addPanel(detailsPanel, impulsedenoise);
addPanel(detailsPanel, dirpyrdenoise);
addPanel(detailsPanel, defringe);
addPanel(detailsPanel, dirpyrequalizer);
addPanel (advancedPanel, wavelet);
addPanel(advancedPanel, wavelet);
addPanel(locallabPanel, locallab);
addPanel(transformPanel, crop);
addPanel(transformPanel, resize);
@@ -166,7 +166,7 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
colorPanelSW = Gtk::manage(new MyScrolledWindow());
transformPanelSW = Gtk::manage(new MyScrolledWindow());
rawPanelSW = Gtk::manage(new MyScrolledWindow());
advancedPanelSW = Gtk::manage (new MyScrolledWindow ());
advancedPanelSW = Gtk::manage(new MyScrolledWindow());
locallabPanelSW = Gtk::manage(new MyScrolledWindow());
updateVScrollbars(options.hideTPVScrollbar);
@@ -191,9 +191,9 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
colorPanel->pack_start(*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0);
colorPanel->pack_start(*vbPanelEnd[2], Gtk::PACK_SHRINK, 4);
advancedPanelSW->add (*advancedPanel);
advancedPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0);
advancedPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0);
advancedPanelSW->add(*advancedPanel);
advancedPanel->pack_start(*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0);
advancedPanel->pack_start(*vbPanelEnd[5], Gtk::PACK_SHRINK, 0);
locallabPanelSW->add(*locallabPanel);
locallabPanel->pack_start(*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0);
@@ -213,7 +213,7 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
toiE = Gtk::manage(new TextOrIcon("exposure.png", M("MAIN_TAB_EXPOSURE"), M("MAIN_TAB_EXPOSURE_TOOLTIP"), type));
toiD = Gtk::manage(new TextOrIcon("detail.png", M("MAIN_TAB_DETAIL"), M("MAIN_TAB_DETAIL_TOOLTIP"), type));
toiC = Gtk::manage(new TextOrIcon("colour.png", M("MAIN_TAB_COLOR"), M("MAIN_TAB_COLOR_TOOLTIP"), type));
toiW = Gtk::manage (new TextOrIcon ("atom.png", M ("MAIN_TAB_ADVANCED"), M ("MAIN_TAB_ADVANCED_TOOLTIP"), type));
toiW = Gtk::manage(new TextOrIcon("atom.png", M("MAIN_TAB_ADVANCED"), M("MAIN_TAB_ADVANCED_TOOLTIP"), type));
toiL = Gtk::manage(new TextOrIcon("openhand.png", M("MAIN_TAB_LOCALLAB"), M("MAIN_TAB_LOCALLAB_TOOLTIP"), type));
toiT = Gtk::manage(new TextOrIcon("transform.png", M("MAIN_TAB_TRANSFORM"), M("MAIN_TAB_TRANSFORM_TOOLTIP"), type));
@@ -223,7 +223,7 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
toolPanelNotebook->append_page(*exposurePanelSW, *toiE);
toolPanelNotebook->append_page(*detailsPanelSW, *toiD);
toolPanelNotebook->append_page(*colorPanelSW, *toiC);
toolPanelNotebook->append_page (*advancedPanelSW, *toiW);
toolPanelNotebook->append_page(*advancedPanelSW, *toiW);
toolPanelNotebook->append_page(*locallabPanelSW, *toiL);
toolPanelNotebook->append_page(*transformPanelSW, *toiT);
toolPanelNotebook->append_page(*rawPanelSW, *toiR);
@@ -234,6 +234,9 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
toolPanelNotebook->set_scrollable();
toolPanelNotebook->show_all();
notebookconn = toolPanelNotebook->signal_switch_page().connect(
sigc::mem_fun(*this, &ToolPanelCoordinator::notebookPageChanged));
for (auto toolPanel : toolPanels) {
toolPanel->setListener(this);
}
@@ -252,6 +255,19 @@ ToolPanelCoordinator::ToolPanelCoordinator(bool batch) : ipc(nullptr), hasChange
toolBar->setToolBarListener(this);
}
void ToolPanelCoordinator::notebookPageChanged(Gtk::Widget* page, guint page_num)
{
// Locallab spot curves are set visible if at least one photo has been loaded (to avoid
// segfault) and locallab panel is active
if (photoLoadedOnce) {
if (page == locallabPanelSW) {
locallab->subscribe();
} else {
locallab->unsubscribe();
}
}
}
void ToolPanelCoordinator::addPanel(Gtk::Box* where, FoldableToolPanel* panel, int level)
{
@@ -269,18 +285,22 @@ ToolPanelCoordinator::~ToolPanelCoordinator()
closeImage();
// When deleting toolPanelNotebook, pages removal activates notebookPageChanged function
// which is responsible of segfault if listener isn't deactivated before
notebookconn.block(true);
delete toolPanelNotebook;
delete toolBar;
}
void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono)
void ToolPanelCoordinator::imageTypeChanged(bool isRaw, bool isBayer, bool isXtrans, bool isMono)
{
if (isRaw) {
if (isBayer) {
const auto func = [](gpointer data) -> gboolean {
ToolPanelCoordinator* const self = static_cast<ToolPanelCoordinator*>(data);
self->rawPanelSW->set_sensitive (true);
self->rawPanelSW->set_sensitive(true);
self->sensorxtrans->FoldableToolPanel::hide();
self->sensorbayer->FoldableToolPanel::show();
self->preprocess->FoldableToolPanel::show();
@@ -289,12 +309,11 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt
return FALSE;
};
idle_register.add(func, this);
}
else if (isXtrans) {
} else if (isXtrans) {
const auto func = [](gpointer data) -> gboolean {
ToolPanelCoordinator* const self = static_cast<ToolPanelCoordinator*>(data);
self->rawPanelSW->set_sensitive (true);
self->rawPanelSW->set_sensitive(true);
self->sensorxtrans->FoldableToolPanel::show();
self->sensorbayer->FoldableToolPanel::hide();
self->preprocess->FoldableToolPanel::show();
@@ -303,12 +322,11 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt
return FALSE;
};
idle_register.add(func, this);
}
else if (isMono) {
} else if (isMono) {
const auto func = [](gpointer data) -> gboolean {
ToolPanelCoordinator* const self = static_cast<ToolPanelCoordinator*>(data);
self->rawPanelSW->set_sensitive (true);
self->rawPanelSW->set_sensitive(true);
self->sensorbayer->FoldableToolPanel::hide();
self->sensorxtrans->FoldableToolPanel::hide();
self->preprocess->FoldableToolPanel::hide();
@@ -321,7 +339,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt
const auto func = [](gpointer data) -> gboolean {
ToolPanelCoordinator* const self = static_cast<ToolPanelCoordinator*>(data);
self->rawPanelSW->set_sensitive (true);
self->rawPanelSW->set_sensitive(true);
self->sensorbayer->FoldableToolPanel::hide();
self->sensorxtrans->FoldableToolPanel::hide();
self->preprocess->FoldableToolPanel::hide();
@@ -335,7 +353,7 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt
const auto func = [](gpointer data) -> gboolean {
ToolPanelCoordinator* const self = static_cast<ToolPanelCoordinator*>(data);
self->rawPanelSW->set_sensitive (false);
self->rawPanelSW->set_sensitive(false);
return FALSE;
};
@@ -347,6 +365,9 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt
void ToolPanelCoordinator::panelChanged(rtengine::ProcEvent event, const Glib::ustring& descr)
{
// TODO Locallab printf
printf("panelChanged\n");
printf("panelChanged event: %d\n", (int)event);
if (!ipc) {
return;
@@ -385,7 +406,6 @@ void ToolPanelCoordinator::panelChanged(rtengine::ProcEvent event, const Glib::u
int fw, fh;
ipc->getInitialImage()->getImageSource()->getFullSize(fw, fh, tr);
gradient->updateGeometry(params->gradient.centerX, params->gradient.centerY, params->gradient.feather, params->gradient.degree, fw, fh);
locallab->updateGeometry(params->locallab.centerX, params->locallab.centerY, params->locallab.circrad, params->locallab.locY, params->locallab.degree, params->locallab.locX, params->locallab.locYT, params->locallab.locXL, fw, fh);
}
// some transformations make the crop change for convenience
@@ -412,10 +432,33 @@ void ToolPanelCoordinator::panelChanged(rtengine::ProcEvent event, const Glib::u
for (auto paramcListener : paramcListeners) {
paramcListener->procParamsChanged(params, event, descr);
}
// Locallab spot curves are set visible if at least one photo has been loaded (to avoid
// segfault) and locallab panel is active
// When a new photo is loaded, Locallab spot curves need to be set visible again
const auto func = [](gpointer data) -> gboolean {
ToolPanelCoordinator* const self = static_cast<ToolPanelCoordinator*>(data);
if (self->photoLoadedOnce && (self->toolPanelNotebook->get_nth_page(self->toolPanelNotebook->get_current_page()) == self->locallabPanelSW))
{
self->locallab->subscribe();
}
return FALSE;
};
if (event == rtengine::EvPhotoLoaded) {
idle_register.add(func, this);
}
photoLoadedOnce = true;
}
void ToolPanelCoordinator::profileChange(const PartialProfile *nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited)
{
// TODO Locallab printf
printf("profileChanged\n");
printf("profileChanged event: %d\n", (int)event);
int fw, fh, tr;
@@ -480,8 +523,6 @@ void ToolPanelCoordinator::profileChange(const PartialProfile *nparams, rtengine
if (event == rtengine::EvPhotoLoaded || event == rtengine::EvProfileChanged || event == rtengine::EvHistoryBrowsed || event == rtengine::EvCTRotate) {
// updating the "on preview" geometry
gradient->updateGeometry(params->gradient.centerX, params->gradient.centerY, params->gradient.feather, params->gradient.degree, fw, fh);
locallab->updateGeometry(params->locallab.centerX, params->locallab.centerY, params->locallab.circrad, params->locallab.locY, params->locallab.degree, params->locallab.locX, params->locallab.locYT, params->locallab.locXL, fw, fh);
}
// start the IPC processing
@@ -496,6 +537,26 @@ void ToolPanelCoordinator::profileChange(const PartialProfile *nparams, rtengine
for (auto paramcListener : paramcListeners) {
paramcListener->procParamsChanged(params, event, descr);
}
// Locallab spot curves are set visible if at least one photo has been loaded (to avoid
// segfault) and locallab panel is active
// When a new photo is loaded, Locallab spot curves need to be set visible again
const auto func = [](gpointer data) -> gboolean {
ToolPanelCoordinator* const self = static_cast<ToolPanelCoordinator*>(data);
if (self->photoLoadedOnce && (self->toolPanelNotebook->get_nth_page(self->toolPanelNotebook->get_current_page()) == self->locallabPanelSW))
{
self->locallab->subscribe();
}
return FALSE;
};
if (event == rtengine::EvPhotoLoaded) {
idle_register.add(func, this);
}
photoLoadedOnce = true;
}
void ToolPanelCoordinator::setDefaults(ProcParams* defparams)
@@ -685,9 +746,10 @@ void ToolPanelCoordinator::sharpMaskSelected(bool sharpMask)
if (!ipc) {
return;
}
ipc->beginUpdateParams ();
ipc->beginUpdateParams();
ipc->setSharpMask(sharpMask);
ipc->endUpdateParams (rtengine::EvShrEnabled);
ipc->endUpdateParams(rtengine::EvShrEnabled);
}
@@ -876,7 +938,7 @@ bool ToolPanelCoordinator::handleShortcutKey(GdkEventKey* event)
return true;
case GDK_KEY_w:
toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*advancedPanelSW));
toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*advancedPanelSW));
return true;
case GDK_KEY_o:
@@ -901,7 +963,7 @@ void ToolPanelCoordinator::updateVScrollbars(bool hide)
colorPanelSW->set_policy(Gtk::POLICY_AUTOMATIC, policy);
transformPanelSW->set_policy(Gtk::POLICY_AUTOMATIC, policy);
rawPanelSW->set_policy(Gtk::POLICY_AUTOMATIC, policy);
advancedPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy);
advancedPanelSW->set_policy(Gtk::POLICY_AUTOMATIC, policy);
locallabPanelSW->set_policy(Gtk::POLICY_AUTOMATIC, policy);
for (auto currExp : expList) {