Make control lines buttons react to line counts

Set the "apply" and "delete all" button sensitivity based on the number
of control lines. Add extra tooltip text to the apply button when
editing and there is not enough lines. The text explains there must be
enough vertical or horizontal control lines.
This commit is contained in:
Lawrence Lee 2021-05-30 18:02:29 -07:00
parent ef49d9eefd
commit 2c1e6a8ca1
5 changed files with 63 additions and 0 deletions

View File

@ -3320,6 +3320,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

@ -36,6 +36,7 @@ ControlLineManager::ControlLineManager():
draw_mode(false),
drawing_line(false),
edited(false),
horizontalCount(0), verticalCount(0),
prev_obj(-1),
selected_object(-1)
{
@ -84,6 +85,16 @@ size_t ControlLineManager::size(void) const
return control_lines.size();
}
size_t ControlLineManager::getHorizontalCount(void) const
{
return horizontalCount;
}
size_t ControlLineManager::getVerticalCount(void) const
{
return verticalCount;
}
bool ControlLineManager::button1Pressed(int modifierKey)
{
EditDataProvider* dataProvider = getEditProvider();
@ -164,9 +175,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[object_id - 1] = line.icon.get();
@ -405,6 +420,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)
@ -437,6 +457,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::OBJ_COUNT + 1] =
line.icon.get();
}
@ -448,6 +475,7 @@ void ControlLineManager::removeAll(void)
mouseOverGeometry.erase(mouseOverGeometry.begin() + 1,
mouseOverGeometry.end());
control_lines.clear();
horizontalCount = verticalCount = 0;
prev_obj = -1;
selected_object = -1;
edited = true;
@ -470,6 +498,11 @@ void ControlLineManager::removeLine(size_t line_id)
mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id
+ ::ControlLine::OBJ_COUNT + 1
);
if (control_lines[line_id]->type == rtengine::ControlLine::HORIZONTAL) {
horizontalCount--;
} else {
verticalCount--;
}
control_lines.erase(control_lines.begin() + line_id);
edited = true;

View File

@ -52,6 +52,7 @@ protected:
bool draw_mode;
bool drawing_line;
bool edited;
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;
@ -87,6 +88,10 @@ public:
~ControlLineManager();
bool getEdited(void) const;
/** Returns the number of horizontal control lines. */
size_t getHorizontalCount(void) const;
/** Returns the number of vertical control lines. */
size_t getVerticalCount(void) const;
void removeAll(void);
/** Sets whether or not the lines are visible and interact-able. */
void setActive(bool active);

View File

@ -351,6 +351,8 @@ void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited)
method->set_active (1);
}
updateApplyDeleteButtons();
enableListener ();
}
@ -739,11 +741,29 @@ void PerspCorrection::setEditProvider(EditDataProvider* provider)
void PerspCorrection::lineChanged(void)
{
updateApplyDeleteButtons();
if (listener) {
listener->panelChanged(EvPerspControlLines, M("HISTORY_CHANGED"));
}
}
void PerspCorrection::updateApplyDeleteButtons(void)
{
if (batchMode) {
return;
}
bool edit_mode = lines_button_edit->get_active();
bool enough_lines = lines->getHorizontalCount() >= 2 || lines->getVerticalCount() >= 2;
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) {
@ -784,6 +804,7 @@ void PerspCorrection::linesEditButtonPressed(void)
panel_listener->controlLineEditModeChanged(false);
}
}
updateApplyDeleteButtons();
}
void PerspCorrection::linesEraseButtonPressed(void)
@ -795,6 +816,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,6 +96,7 @@ 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(void);
public: