Merge pull request #6268 from Beep6581/perspective-ux

Perspective tool: Improve control lines user experience
This commit is contained in:
Lawrence37 2021-06-03 21:37:30 -07:00 committed by GitHub
commit 38ff2b5695
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 76 additions and 14 deletions

View File

@ -3321,6 +3321,7 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,
TP_PCVIGNETTE_STRENGTH;Strength
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
TP_PDSHARPENING_LABEL;Capture Sharpening
TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required.
TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor
TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length
TP_PERSPECTIVE_CAMERA_FRAME;Correction

View File

@ -84,6 +84,7 @@ ControlLineManager::ControlLineManager():
draw_mode(false),
drawing_line(false),
edited(false),
horizontalCount(0), verticalCount(0),
prev_obj(-1),
selected_object(-1)
{
@ -127,11 +128,21 @@ void ControlLineManager::setDrawMode(bool draw)
draw_mode = draw;
}
size_t ControlLineManager::size(void) const
std::size_t ControlLineManager::size() const
{
return control_lines.size();
}
std::size_t ControlLineManager::getHorizontalCount() const
{
return horizontalCount;
}
std::size_t ControlLineManager::getVerticalCount() const
{
return verticalCount;
}
bool ControlLineManager::button1Pressed(int modifierKey)
{
EditDataProvider* dataProvider = getEditProvider();
@ -214,9 +225,13 @@ bool ControlLineManager::pick1(bool picked)
if (line.type == rtengine::ControlLine::HORIZONTAL) {
line.icon = line.icon_v;
line.type = rtengine::ControlLine::VERTICAL;
horizontalCount--;
verticalCount++;
} else if (line.type == rtengine::ControlLine::VERTICAL) {
line.icon = line.icon_h;
line.type = rtengine::ControlLine::HORIZONTAL;
horizontalCount++;
verticalCount--;
}
visibleGeometry[mouseOverIdToVisibleId(object_id)] = line.icon.get();
@ -491,6 +506,11 @@ void ControlLineManager::addLine(Coord begin, Coord end,
EditSubscriber::mouseOverGeometry.push_back(control_line->end.get());
control_lines.push_back(std::move(control_line));
if (type == rtengine::ControlLine::HORIZONTAL) {
horizontalCount++;
} else {
verticalCount++;
}
}
void ControlLineManager::autoSetLineType(int object_id)
@ -523,6 +543,13 @@ void ControlLineManager::autoSetLineType(int object_id)
if (type != line.type) { // Need to update line type.
line.type = type;
line.icon = icon;
if (type == rtengine::ControlLine::HORIZONTAL) {
horizontalCount++;
verticalCount--;
} else {
horizontalCount--;
verticalCount++;
}
visibleGeometry[line_id * ::ControlLine::OBJECT_COUNT
+ VISIBLE_OBJECT_COUNT + ::ControlLine::ICON] =
line.icon.get();
@ -535,13 +562,14 @@ void ControlLineManager::removeAll(void)
mouseOverGeometry.erase(mouseOverGeometry.begin() + MO_OBJECT_COUNT,
mouseOverGeometry.end());
control_lines.clear();
horizontalCount = verticalCount = 0;
prev_obj = -1;
selected_object = -1;
edited = true;
callbacks->lineChanged();
}
void ControlLineManager::removeLine(size_t line_id)
void ControlLineManager::removeLine(std::size_t line_id)
{
if (line_id >= control_lines.size()) {
return;
@ -556,6 +584,11 @@ void ControlLineManager::removeLine(size_t line_id)
mouseOverGeometry.begin() + ::ControlLine::OBJECT_COUNT * line_id + MO_OBJECT_COUNT,
mouseOverGeometry.begin() + ::ControlLine::OBJECT_COUNT * line_id + MO_OBJECT_COUNT + ::ControlLine::OBJECT_COUNT
);
if (control_lines[line_id]->type == rtengine::ControlLine::HORIZONTAL) {
horizontalCount--;
} else {
verticalCount--;
}
control_lines.erase(control_lines.begin() + line_id);
edited = true;

View File

@ -59,6 +59,7 @@ protected:
bool draw_mode;
bool drawing_line;
bool edited;
std::size_t horizontalCount, verticalCount;
Cairo::RefPtr<RTSurface> line_icon_h, line_icon_v;
Cairo::RefPtr<RTSurface> line_icon_h_prelight, line_icon_v_prelight;
int prev_obj;
@ -74,7 +75,7 @@ protected:
* line, inclusive, the line type is set to vertical. Otherwise, horizontal.
*/
void autoSetLineType(int object_id);
void removeLine(size_t line_id);
void removeLine(std::size_t line_id);
public:
class Callbacks
@ -94,6 +95,10 @@ public:
~ControlLineManager();
bool getEdited(void) const;
/** Returns the number of horizontal control lines. */
std::size_t getHorizontalCount() const;
/** Returns the number of vertical control lines. */
std::size_t getVerticalCount() const;
/** Release anything that is currently being dragged. */
void releaseEdit(void);
void removeAll(void);
@ -105,7 +110,7 @@ public:
void setEditProvider(EditDataProvider* provider);
void setLines(const std::vector<rtengine::ControlLine>& lines);
/** Returns the number of lines. */
size_t size(void) const;
std::size_t size() const;
/**
* Allocates a new array and populates it with copies of the control lines.
*/

View File

@ -351,6 +351,8 @@ void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited)
method->set_active (1);
}
updateApplyDeleteButtons();
enableListener ();
}
@ -517,22 +519,16 @@ void PerspCorrection::applyControlLines(void)
}
std::vector<rtengine::ControlLine> control_lines;
int h_count = 0, v_count = 0;
double rot = camera_roll->getValue();
double pitch = camera_pitch->getValue();
double yaw = camera_yaw->getValue();
lines->toControlLines(control_lines);
for (unsigned int i = 0; i < lines->size(); i++) {
if (control_lines[i].type == rtengine::ControlLine::HORIZONTAL) {
h_count++;
} else if (control_lines[i].type == rtengine::ControlLine::VERTICAL) {
v_count++;
}
}
lens_geom_listener->autoPerspRequested(v_count > 1, h_count > 1, rot, pitch,
yaw, &control_lines);
lens_geom_listener->autoPerspRequested(
lines->getVerticalCount() >= MIN_VERT_LINES,
lines->getHorizontalCount() >= MIN_HORIZ_LINES,
rot, pitch, yaw, &control_lines);
disableListener();
camera_pitch->setValue(pitch);
@ -739,11 +735,29 @@ void PerspCorrection::setEditProvider(EditDataProvider* provider)
void PerspCorrection::lineChanged(void)
{
updateApplyDeleteButtons();
if (listener) {
listener->panelChanged(EvPerspControlLines, M("HISTORY_CHANGED"));
}
}
void PerspCorrection::updateApplyDeleteButtons()
{
if (batchMode) {
return;
}
bool edit_mode = lines_button_edit->get_active();
bool enough_lines = lines->getHorizontalCount() >= MIN_HORIZ_LINES || lines->getVerticalCount() >= MIN_VERT_LINES;
const auto tooltip = M("GENERAL_APPLY")
+ ((edit_mode && !enough_lines) ? "\n\n" + M("TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP") : "");
lines_button_apply->set_sensitive(edit_mode && enough_lines);
lines_button_apply->set_tooltip_text(tooltip);
lines_button_erase->set_sensitive(edit_mode && lines->size() > 0);
}
void PerspCorrection::linesApplyButtonPressed(void)
{
if (method->get_active_row_number() == 1) {
@ -785,6 +799,7 @@ void PerspCorrection::linesEditButtonPressed(void)
panel_listener->controlLineEditModeChanged(false);
}
}
updateApplyDeleteButtons();
}
void PerspCorrection::linesEraseButtonPressed(void)
@ -796,6 +811,8 @@ void PerspCorrection::requestApplyControlLines(void)
{
if (lines_button_apply->is_sensitive()) {
linesApplyButtonPressed();
} else if (lines_button_edit->get_active()) {
lines_button_edit->set_active(false);
}
}

View File

@ -96,9 +96,15 @@ protected:
void tweakParams(rtengine::procparams::ProcParams &pparams) override;
void setCamBasedEventsActive (bool active = true);
void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata);
void updateApplyDeleteButtons();
public:
/** Minimum number of horizontal lines for horizontal/full correction. */
static constexpr std::size_t MIN_HORIZ_LINES = 2;
/** Minimum number of vertical lines for vertical/full correction. */
static constexpr std::size_t MIN_VERT_LINES = 2;
PerspCorrection ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override;