From ebf585c0c7e29e01253673216b32bbdce61cdae7 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 22 Dec 2019 11:52:59 +0100 Subject: [PATCH] Gui: implement size hint for quantity spin box --- src/Gui/QuantitySpinBox.cpp | 66 +++++++++++++++++++++++++++++++++++-- src/Gui/QuantitySpinBox.h | 2 ++ 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/Gui/QuantitySpinBox.cpp b/src/Gui/QuantitySpinBox.cpp index cfbdc0b196..8b2ecd0245 100644 --- a/src/Gui/QuantitySpinBox.cpp +++ b/src/Gui/QuantitySpinBox.cpp @@ -26,6 +26,7 @@ # include # include # include +# include # include # include # include @@ -477,10 +478,8 @@ void Gui::QuantitySpinBox::keyPressEvent(QKeyEvent *event) { if (event->text() == QString::fromUtf8("=") && isBound()) openFormulaDialog(); - else { - if (!hasExpression()) + else if (!hasExpression()) QAbstractSpinBox::keyPressEvent(event); - } } @@ -769,6 +768,67 @@ void QuantitySpinBox::stepBy(int steps) selectNumber(); } +QSize QuantitySpinBox::sizeHint() const +{ + Q_D(const QuantitySpinBox); + ensurePolished(); + + const QFontMetrics fm(fontMetrics()); + int h = lineEdit()->sizeHint().height(); + int w = 0; + + QString s; + QString fixedContent = QLatin1String(" "); + + Base::Quantity q(d->quantity); + q.setValue(d->maximum); + s = textFromValue(q); + s.truncate(18); + s += fixedContent; + w = qMax(w, fm.width(s)); + + w += 2; // cursor blinking space + w += iconHeight; + + QStyleOptionSpinBox opt; + initStyleOption(&opt); + QSize hint(w, h); + QSize size = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this) + .expandedTo(QApplication::globalStrut()); + return size; +} + +QSize QuantitySpinBox::minimumSizeHint() const +{ + Q_D(const QuantitySpinBox); + ensurePolished(); + + const QFontMetrics fm(fontMetrics()); + int h = lineEdit()->minimumSizeHint().height(); + int w = 0; + + QString s; + QString fixedContent = QLatin1String(" "); + + Base::Quantity q(d->quantity); + q.setValue(d->maximum); + s = textFromValue(q); + s.truncate(18); + s += fixedContent; + w = qMax(w, fm.width(s)); + + w += 2; // cursor blinking space + w += iconHeight; + + QStyleOptionSpinBox opt; + initStyleOption(&opt); + QSize hint(w, h); + + QSize size = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this) + .expandedTo(QApplication::globalStrut()); + return size; +} + void QuantitySpinBox::showEvent(QShowEvent * event) { Q_D(QuantitySpinBox); diff --git a/src/Gui/QuantitySpinBox.h b/src/Gui/QuantitySpinBox.h index f5ba9e8d62..cc9c9ddaea 100644 --- a/src/Gui/QuantitySpinBox.h +++ b/src/Gui/QuantitySpinBox.h @@ -124,6 +124,8 @@ public: virtual QValidator::State validate(QString &input, int &pos) const; virtual void fixup(QString &str) const; + QSize sizeHint() const; + QSize minimumSizeHint() const; bool event(QEvent *event); void setExpression(boost::shared_ptr expr);