rawTherapee/rtgui/perspective.h
Lawrence Lee 1b06cb9999 Limit preview refreshing in control line edit mode
Previously, changing values in the camera-based perspective correction
tool while in control line edit mode resulted in the preview being
refreshed. This is unnecessary because all perspective transformations
are disabled in edit mode. This commit disables preview refreshing for
camera-based perspective adjustments in edit mode.
2020-06-24 17:06:21 -07:00

205 lines
7.0 KiB
C++

/*
* This file is part of RawTherapee.
*
* Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
*
* RawTherapee is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* RawTherapee is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include <gtkmm.h>
#include "adjuster.h"
#include "editcallbacks.h"
#include "editwidgets.h"
#include "lensgeomlistener.h"
#include "toolpanel.h"
#include "../rtengine/perspectivecorrection.h"
struct ControlLine
{
static constexpr int OBJ_COUNT = 4;
Line* line;
OPIcon* icon;
OPIcon *icon_h, *icon_v;
Circle *begin, *end;
rtengine::ControlLine::Type type;
};
class ControlLineManager: EditSubscriber
{
protected:
/** Determine how horizontal and vertical lines are displayed. */
bool active_h, active_v;
/** Hidden object for capturing mouse events. */
Rectangle* canvas_area;
rtengine::Coord drag_delta;
std::vector<ControlLine*> control_lines;
CursorShape cursor;
bool draw_mode;
Cairo::RefPtr<RTSurface> line_icon_h, line_icon_v;
Cairo::RefPtr<RTSurface> line_icon_h_prelight, line_icon_v_prelight;
int prev_obj;
int selected_object;
void addLine (rtengine::Coord begin, rtengine::Coord end);
Geometry::State calcLineState(const ControlLine& line) const;
void removeLine (size_t line_id);
public:
class Callbacks
{
public:
virtual ~Callbacks() {};
/** Called when the EditSubscriber's switchOffEditMode is called. */
virtual void switchOffEditMode (void) {};
};
/** Callbacks to invoke. */
Callbacks* callbacks;
/** Type of line for newly drawn lines. */
rtengine::ControlLine::Type draw_line_type;
ControlLineManager();
~ControlLineManager();
void removeAll (void);
/** Sets whether or not the lines are visible and interact-able. */
void setActive (bool active);
/** Set whether or not lines can be drawn and deleted. */
void setDrawMode (bool draw);
void setEditProvider (EditDataProvider* provider);
/** Determines how each line type is displayed. */
void setLinesState (bool horiz_active, bool vert_active);
/** Returns the number of lines. */
size_t size (void) const;
/**
* Allocates a new array and populates it with copies of the control lines.
*/
rtengine::ControlLine* toControlLines (void) const;
// EditSubscriber overrides
bool button1Pressed (int modifierKey) override;
bool button1Released (void) override;
bool button3Pressed (int modifierKey) override;
bool pick1 (bool picked) override;
bool pick3 (bool picked) override;
bool drag1 (int modifierKey) override;
CursorShape getCursor (int objectID) const override;
bool mouseOver (int modifierKey) override;
void switchOffEditMode (void) override;
};
class PerspCorrection final :
public ToolParamBlock,
public AdjusterListener,
public FoldableToolPanel
{
protected:
bool render = true;
MyComboBoxText* method;
Gtk::VBox* simple;
Adjuster* horiz;
Adjuster* vert;
Gtk::Button* auto_pitch;
Gtk::Button* auto_yaw;
Gtk::Button* auto_pitch_yaw;
Gtk::VBox* camera_based;
Adjuster* camera_crop_factor;
Adjuster* camera_focal_length;
Adjuster* camera_pitch;
Adjuster* camera_roll;
Adjuster* camera_shift_horiz;
Adjuster* camera_shift_vert;
Adjuster* camera_yaw;
Gtk::Image* img_ctrl_lines_edit;
Gtk::Image* img_ctrl_lines_apply;
ControlLineManager* lines;
Gtk::ToggleButton* lines_button_edit;
Gtk::Button* lines_button_erase;
Gtk::ToggleButton* lines_button_h;
Gtk::ToggleButton* lines_button_v;
Adjuster* projection_pitch;
Adjuster* projection_rotate;
Adjuster* projection_shift_horiz;
Adjuster* projection_shift_vert;
Adjuster* projection_yaw;
rtengine::ProcEvent EvPerspCamFocalLength;
rtengine::ProcEvent EvPerspCamShift;
rtengine::ProcEvent EvPerspCamAngle;
rtengine::ProcEvent EvPerspMethod;
rtengine::ProcEvent EvPerspProjShift;
rtengine::ProcEvent EvPerspProjRotate;
rtengine::ProcEvent EvPerspProjAngle;
rtengine::ProcEvent EvPerspRender;
rtengine::ProcEvent EvPerspCamFocalLengthVoid;
rtengine::ProcEvent EvPerspCamShiftVoid;
rtengine::ProcEvent EvPerspCamAngleVoid;
rtengine::ProcEvent EvPerspProjShiftVoid;
rtengine::ProcEvent EvPerspProjRotateVoid;
rtengine::ProcEvent EvPerspProjAngleVoid;
rtengine::ProcEvent* event_persp_cam_focal_length;
rtengine::ProcEvent* event_persp_cam_shift;
rtengine::ProcEvent* event_persp_cam_angle;
rtengine::ProcEvent* event_persp_proj_shift;
rtengine::ProcEvent* event_persp_proj_rotate;
rtengine::ProcEvent* event_persp_proj_angle;
LensGeomListener* lens_geom_listener;
const rtengine::FramesMetaData* metadata;
void applyControlLines (void);
void setCamBasedEventsActive (bool active = true);
void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata);
public:
PerspCorrection ();
~PerspCorrection ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override;
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override;
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override;
void setBatchMode (bool batchMode) override;
void adjusterChanged (Adjuster* a, double newval) override;
void autoCorrectionPressed (Gtk::Button* b);
void linesButtonPressed (Gtk::ToggleButton* button);
void linesEditButtonPressed (void);
void linesEraseButtonPressed (void);
void methodChanged (void);
void setAdjusterBehavior (bool badd, bool camera_focal_length_add, bool camera_shift_add, bool camera_angle_add, bool projection_angle_add, bool projection_shift_add, bool projection_rotate_add);
void setEditProvider (EditDataProvider* provider) override;
void setLensGeomListener (LensGeomListener* listener)
{
lens_geom_listener = listener;
}
void setMetadata (const rtengine::FramesMetaData* metadata);
void switchOffEditMode (ControlLineManager* lines);
void trimValues (rtengine::procparams::ProcParams* pp) override;
};
class LinesCallbacks: public ControlLineManager::Callbacks
{
protected:
ControlLineManager* lines;
PerspCorrection* tool;
public:
LinesCallbacks(PerspCorrection* tool, ControlLineManager* lines);
~LinesCallbacks();
void switchOffEditMode (void) override;
};