Fix control line edit crash when undoing history
When perspective control line editing is active and the history entry is changed such that edit mode is automatically disabled, there is a crash. The history change triggers a processing parameters update and disables editing. When editing is disabled, the perspective tool also tries to update the processing parameters, causing a double mutex lock attempt. This commit avoids updating parameters from the perspective tool and uses the tweak operator (introduced with the spot removal tool) to achieve the same effect. Closes #6251.
This commit is contained in:
parent
99f2a87819
commit
36f1300a6b
@ -35,5 +35,4 @@ public:
|
|||||||
virtual void autoCropRequested () = 0;
|
virtual void autoCropRequested () = 0;
|
||||||
virtual double autoDistorRequested () = 0;
|
virtual double autoDistorRequested () = 0;
|
||||||
virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) = 0;
|
virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) = 0;
|
||||||
virtual void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) = 0;
|
|
||||||
};
|
};
|
||||||
|
@ -543,6 +543,11 @@ void PerspCorrection::applyControlLines(void)
|
|||||||
adjusterChanged(camera_pitch, pitch);
|
adjusterChanged(camera_pitch, pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PerspCorrection::tweakParams(rtengine::procparams::ProcParams &pparams)
|
||||||
|
{
|
||||||
|
pparams.perspective.render = render;
|
||||||
|
}
|
||||||
|
|
||||||
void PerspCorrection::autoCorrectionPressed(Gtk::Button* b)
|
void PerspCorrection::autoCorrectionPressed(Gtk::Button* b)
|
||||||
{
|
{
|
||||||
if (!lens_geom_listener) {
|
if (!lens_geom_listener) {
|
||||||
@ -754,8 +759,9 @@ void PerspCorrection::linesEditButtonPressed(void)
|
|||||||
lines->setActive(true);
|
lines->setActive(true);
|
||||||
lines->setDrawMode(true);
|
lines->setDrawMode(true);
|
||||||
render = false;
|
render = false;
|
||||||
if (lens_geom_listener) {
|
if (listener) {
|
||||||
lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, false);
|
listener->setTweakOperator(this);
|
||||||
|
listener->refreshPreview(EvPerspRender);
|
||||||
}
|
}
|
||||||
lines_button_apply->set_sensitive(true);
|
lines_button_apply->set_sensitive(true);
|
||||||
lines_button_erase->set_sensitive(true);
|
lines_button_erase->set_sensitive(true);
|
||||||
@ -768,8 +774,9 @@ void PerspCorrection::linesEditButtonPressed(void)
|
|||||||
lines_button_apply->set_sensitive(false);
|
lines_button_apply->set_sensitive(false);
|
||||||
lines_button_erase->set_sensitive(false);
|
lines_button_erase->set_sensitive(false);
|
||||||
render = true;
|
render = true;
|
||||||
if (lens_geom_listener) {
|
if (listener) {
|
||||||
lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, true);
|
listener->unsetTweakOperator(this);
|
||||||
|
listener->refreshPreview(EvPerspRender);
|
||||||
}
|
}
|
||||||
lines->setDrawMode(false);
|
lines->setDrawMode(false);
|
||||||
lines->setActive(false);
|
lines->setActive(false);
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "controllines.h"
|
#include "controllines.h"
|
||||||
#include "lensgeomlistener.h"
|
#include "lensgeomlistener.h"
|
||||||
#include "toolpanel.h"
|
#include "toolpanel.h"
|
||||||
|
#include "../rtengine/tweakoperator.h"
|
||||||
|
|
||||||
class PerspCorrectionPanelListener
|
class PerspCorrectionPanelListener
|
||||||
{
|
{
|
||||||
@ -34,6 +35,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
class PerspCorrection final :
|
class PerspCorrection final :
|
||||||
|
public rtengine::TweakOperator,
|
||||||
public ToolParamBlock,
|
public ToolParamBlock,
|
||||||
public AdjusterListener,
|
public AdjusterListener,
|
||||||
public FoldableToolPanel
|
public FoldableToolPanel
|
||||||
@ -91,6 +93,7 @@ protected:
|
|||||||
const rtengine::FramesMetaData* metadata;
|
const rtengine::FramesMetaData* metadata;
|
||||||
|
|
||||||
void applyControlLines (void);
|
void applyControlLines (void);
|
||||||
|
void tweakParams(rtengine::procparams::ProcParams &pparams) override;
|
||||||
void setCamBasedEventsActive (bool active = true);
|
void setCamBasedEventsActive (bool active = true);
|
||||||
void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata);
|
void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata);
|
||||||
|
|
||||||
|
@ -1037,16 +1037,6 @@ double ToolPanelCoordinator::autoDistorRequested()
|
|||||||
return rtengine::ImProcFunctions::getAutoDistor(ipc->getInitialImage()->getFileName(), 400);
|
return rtengine::ImProcFunctions::getAutoDistor(ipc->getInitialImage()->getFileName(), 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolPanelCoordinator::updateTransformPreviewRequested(rtengine::ProcEvent event, bool render_perspective)
|
|
||||||
{
|
|
||||||
if (!ipc) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ipc->beginUpdateParams()->perspective.render = render_perspective;
|
|
||||||
ipc->endUpdateParams(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToolPanelCoordinator::spotWBRequested(int size)
|
void ToolPanelCoordinator::spotWBRequested(int size)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -321,7 +321,6 @@ public:
|
|||||||
void autoCropRequested () override;
|
void autoCropRequested () override;
|
||||||
void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) override;
|
void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) override;
|
||||||
double autoDistorRequested () override;
|
double autoDistorRequested () override;
|
||||||
void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) override;
|
|
||||||
|
|
||||||
// spotwblistener interface
|
// spotwblistener interface
|
||||||
void spotWBRequested (int size) override;
|
void spotWBRequested (int size) override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user