Gui: fix Inputfield valid/invalid icon placement and size (#20466)

* Gui: fix inputfield icon size placement

* chore:Update inputfield comment to be more clear

Co-authored-by: Benjamin Bræstrup Sayoc <benj5378@outlook.com>

---------

Co-authored-by: Benjamin Bræstrup Sayoc <benj5378@outlook.com>
This commit is contained in:
Alfredo Monclus
2025-03-30 19:14:19 -03:00
committed by GitHub
parent dac7408ee2
commit f09e5e03a9
2 changed files with 25 additions and 15 deletions

View File

@@ -86,22 +86,33 @@ InputField::InputField(QWidget * parent)
}
iconLabel = new ExpressionLabel(this);
iconLabel->setCursor(Qt::ArrowCursor);
QPixmap pixmap = getValidationIcon(":/icons/button_valid.svg", QSize(sizeHint().height(),sizeHint().height()));
QFontMetrics fm(font());
int iconSize = fm.height();
QPixmap pixmap = getValidationIcon(":/icons/button_valid.svg", QSize(iconSize, iconSize));
iconLabel->setPixmap(pixmap);
iconLabel->setStyleSheet(QStringLiteral("QLabel { border: none; padding: 0px; }"));
iconLabel->hide();
connect(this, &QLineEdit::textChanged, this, &InputField::updateIconLabel);
int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
setStyleSheet(QStringLiteral("QLineEdit { padding-right: %1px } ").arg(iconLabel->sizeHint().width() + frameWidth + 1));
QSize msz = minimumSizeHint();
setMinimumSize(qMax(msz.width(), iconLabel->sizeHint().height() + frameWidth * 2 + 2),
qMax(msz.height(), iconLabel->sizeHint().height() + frameWidth * 2 + 2));
// Set Margins
// vertical margin, such that `,` won't be clipped to a `.` and similar font descents. Relevant on some OSX versions
// horizontal margin, such that text will not be behind `fx` icon
int margin = getMargin();
setTextMargins(margin, margin, margin + iconSize, margin);
this->setContextMenuPolicy(Qt::DefaultContextMenu);
connect(this, &QLineEdit::textChanged, this, &InputField::newInput);
}
int InputField::getMargin()
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
return style()->pixelMetric(QStyle::PM_LineEditIconMargin, nullptr, this) / 2;
#else
return style()->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, this);
#endif
}
InputField::~InputField() = default;
void InputField::bind(const App::ObjectIdentifier &_path)
@@ -175,12 +186,10 @@ void InputField::updateText(const Base::Quantity& quant)
setText(QString::fromStdString(txt));
}
void InputField::resizeEvent(QResizeEvent *)
void InputField::resizeEvent(QResizeEvent * /*event*/)
{
QSize sz = iconLabel->sizeHint();
int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
iconLabel->move(rect().right() - frameWidth - sz.width(),
rect().center().y() - sz.height() / 2);
QSize iconSize = iconLabel->sizeHint();
iconLabel->move(width() - (iconSize.width() + 2 * getMargin()), (height() - iconSize.height()) / 2);
}
void InputField::updateIconLabel(const QString& text)
@@ -260,7 +269,7 @@ void InputField::newInput(const QString & text)
}
catch(Base::Exception &e){
QString errorText = QString::fromLatin1(e.what());
QPixmap pixmap = getValidationIcon(":/icons/button_invalid.svg", QSize(sizeHint().height(),sizeHint().height()));
QPixmap pixmap = getValidationIcon(":/icons/button_invalid.svg", iconLabel->sizeHint());
iconLabel->setPixmap(pixmap);
Q_EMIT parseError(errorText);
validInput = false;
@@ -272,7 +281,7 @@ void InputField::newInput(const QString & text)
// check if unit fits!
if(!actUnit.isEmpty() && !res.getUnit().isEmpty() && actUnit != res.getUnit()){
QPixmap pixmap = getValidationIcon(":/icons/button_invalid.svg", QSize(sizeHint().height(),sizeHint().height()));
QPixmap pixmap = getValidationIcon(":/icons/button_invalid.svg", iconLabel->sizeHint());
iconLabel->setPixmap(pixmap);
Q_EMIT parseError(QStringLiteral("Wrong unit"));
validInput = false;
@@ -280,7 +289,7 @@ void InputField::newInput(const QString & text)
}
QPixmap pixmap = getValidationIcon(":/icons/button_valid.svg", QSize(sizeHint().height(),sizeHint().height()));
QPixmap pixmap = getValidationIcon(":/icons/button_valid.svg", iconLabel->sizeHint());
iconLabel->setPixmap(pixmap);
validInput = true;

View File

@@ -201,6 +201,7 @@ protected:
void wheelEvent(QWheelEvent * event) override;
void contextMenuEvent(QContextMenuEvent * event) override;
void resizeEvent(QResizeEvent*) override;
int getMargin();
private:
QPixmap getValidationIcon(const char* name, const QSize& size) const;