summaryrefslogtreecommitdiffstats
path: root/src/widgets/widgets/qlineedit_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/widgets/qlineedit_p.cpp')
-rw-r--r--src/widgets/widgets/qlineedit_p.cpp111
1 files changed, 79 insertions, 32 deletions
diff --git a/src/widgets/widgets/qlineedit_p.cpp b/src/widgets/widgets/qlineedit_p.cpp
index cccb44c4ef..6dcb2dd693 100644
--- a/src/widgets/widgets/qlineedit_p.cpp
+++ b/src/widgets/widgets/qlineedit_p.cpp
@@ -218,6 +218,7 @@ void QLineEditPrivate::init(const QString& txt)
QObject::connect(control, SIGNAL(updateNeeded(QRect)),
q, SLOT(_q_updateNeeded(QRect)));
+ QObject::connect(control, SIGNAL(inputRejected()), q, SIGNAL(inputRejected()));
QStyleOptionFrame opt;
q->initStyleOption(&opt);
@@ -350,11 +351,9 @@ void QLineEditIconButton::paintEvent(QPaintEvent *)
QWindow *window = nullptr;
if (const QWidget *nativeParent = nativeParentWidget())
window = nativeParent->windowHandle();
- // Note isDown should really use the active state but in most styles
- // this has no proper feedback
QIcon::Mode state = QIcon::Disabled;
if (isEnabled())
- state = isDown() ? QIcon::Selected : QIcon::Normal;
+ state = isDown() ? QIcon::Active : QIcon::Normal;
const QLineEditPrivate *lep = lineEditPrivate();
const int iconWidth = lep ? lep->sideWidgetParameters().iconSize : 16;
const QSize iconSize(iconWidth, iconWidth);
@@ -393,9 +392,47 @@ void QLineEditIconButton::setOpacity(qreal value)
}
#if QT_CONFIG(animation)
+bool QLineEditIconButton::shouldHideWithText() const
+{
+ return m_hideWithText;
+}
+
+void QLineEditIconButton::setHideWithText(bool hide)
+{
+ m_hideWithText = hide;
+}
+
+void QLineEditIconButton::onAnimationFinished()
+{
+ if (shouldHideWithText() && isVisible() && !m_wasHidden) {
+ hide();
+
+ // Invalidate previous geometry to take into account new size of side widgets
+ if (auto le = lineEditPrivate())
+ le->updateGeometry_helper(true);
+ }
+}
+
+void QLineEditIconButton::animateShow(bool visible)
+{
+ m_wasHidden = visible;
+
+ if (shouldHideWithText() && !isVisible()) {
+ show();
+
+ // Invalidate previous geometry to take into account new size of side widgets
+ if (auto le = lineEditPrivate())
+ le->updateGeometry_helper(true);
+ }
+
+ startOpacityAnimation(visible ? 1.0 : 0.0);
+}
+
void QLineEditIconButton::startOpacityAnimation(qreal endValue)
{
QPropertyAnimation *animation = new QPropertyAnimation(this, QByteArrayLiteral("opacity"));
+ connect(animation, &QPropertyAnimation::finished, this, &QLineEditIconButton::onAnimationFinished);
+
animation->setDuration(160);
animation->setEndValue(endValue);
animation->start(QAbstractAnimation::DeleteWhenStopped);
@@ -410,6 +447,16 @@ void QLineEditIconButton::updateCursor()
}
#endif // QT_CONFIG(toolbutton)
+#if QT_CONFIG(animation) && QT_CONFIG(toolbutton)
+static void displayWidgets(const QLineEditPrivate::SideWidgetEntryList &widgets, bool display)
+{
+ for (const auto &e : widgets) {
+ if (e.flags & QLineEditPrivate::SideWidgetFadeInWithText)
+ static_cast<QLineEditIconButton *>(e.widget)->animateShow(display);
+ }
+}
+#endif
+
void QLineEditPrivate::_q_textChanged(const QString &text)
{
if (hasSideWidgets()) {
@@ -417,15 +464,9 @@ void QLineEditPrivate::_q_textChanged(const QString &text)
if (!newTextSize || !lastTextSize) {
lastTextSize = newTextSize;
#if QT_CONFIG(animation) && QT_CONFIG(toolbutton)
- const bool fadeIn = newTextSize > 0;
- for (const SideWidgetEntry &e : leadingSideWidgets) {
- if (e.flags & SideWidgetFadeInWithText)
- static_cast<QLineEditIconButton *>(e.widget)->animateShow(fadeIn);
- }
- for (const SideWidgetEntry &e : trailingSideWidgets) {
- if (e.flags & SideWidgetFadeInWithText)
- static_cast<QLineEditIconButton *>(e.widget)->animateShow(fadeIn);
- }
+ const bool display = newTextSize > 0;
+ displayWidgets(leadingSideWidgets, display);
+ displayWidgets(trailingSideWidgets, display);
#endif
}
}
@@ -444,7 +485,7 @@ QLineEditPrivate::SideWidgetParameters QLineEditPrivate::sideWidgetParameters()
{
Q_Q(const QLineEdit);
SideWidgetParameters result;
- result.iconSize = q->height() < 34 ? 16 : 32;
+ result.iconSize = q->style()->pixelMetric(QStyle::PM_SmallIconSize, 0, q);
result.margin = result.iconSize / 4;
result.widgetWidth = result.iconSize + 6;
result.widgetHeight = result.iconSize + 2;
@@ -468,6 +509,8 @@ void QLineEditPrivate::setClearButtonEnabled(bool enabled)
break;
}
}
+#else
+ Q_UNUSED(enabled);
#endif
}
@@ -485,6 +528,8 @@ void QLineEditPrivate::positionSideWidgets()
#if QT_CONFIG(action)
if (e.action->isVisible())
widgetGeometry.moveLeft(widgetGeometry.left() + delta);
+#else
+ Q_UNUSED(delta);
#endif
}
widgetGeometry.moveLeft(contentRect.width() - p.widgetWidth - p.margin);
@@ -538,8 +583,15 @@ QWidget *QLineEditPrivate::addAction(QAction *newAction, QAction *before, QLineE
QLineEditIconButton *toolButton = new QLineEditIconButton(q);
toolButton->setIcon(newAction->icon());
toolButton->setOpacity(lastTextSize > 0 || !(flags & SideWidgetFadeInWithText) ? 1 : 0);
- if (flags & SideWidgetClearButton)
+ if (flags & SideWidgetClearButton) {
QObject::connect(toolButton, SIGNAL(clicked()), q, SLOT(_q_clearButtonClicked()));
+
+#if QT_CONFIG(animation)
+ // The clear button is handled only by this widget. The button should be really
+ // shown/hidden in order to calculate size hints correctly.
+ toolButton->setHideWithText(true);
+#endif
+ }
toolButton->setDefaultAction(newAction);
w = toolButton;
#else
@@ -598,36 +650,31 @@ void QLineEditPrivate::removeAction(QAction *action)
if (!hasSideWidgets()) // Last widget, remove connection
QObject::disconnect(q, SIGNAL(textChanged(QString)), q, SLOT(_q_textChanged(QString)));
q->update();
+#else
+ Q_UNUSED(action);
#endif // QT_CONFIG(action)
}
-static bool isSideWidgetVisible(const QLineEditPrivate::SideWidgetEntry &e)
+static int effectiveTextMargin(int defaultMargin, const QLineEditPrivate::SideWidgetEntryList &widgets,
+ const QLineEditPrivate::SideWidgetParameters &parameters)
{
- return e.widget->isVisible();
+ if (widgets.empty())
+ return defaultMargin;
+
+ return defaultMargin + (parameters.margin + parameters.widgetWidth) *
+ int(std::count_if(widgets.begin(), widgets.end(),
+ [](const QLineEditPrivate::SideWidgetEntry &e) {
+ return e.widget->isVisibleTo(e.widget->parentWidget()); }));
}
int QLineEditPrivate::effectiveLeftTextMargin() const
{
- int result = leftTextMargin;
- if (!leftSideWidgetList().empty()) {
- const SideWidgetParameters p = sideWidgetParameters();
- result += (p.margin + p.widgetWidth)
- * int(std::count_if(leftSideWidgetList().begin(), leftSideWidgetList().end(),
- isSideWidgetVisible));
- }
- return result;
+ return effectiveTextMargin(leftTextMargin, leftSideWidgetList(), sideWidgetParameters());
}
int QLineEditPrivate::effectiveRightTextMargin() const
{
- int result = rightTextMargin;
- if (!rightSideWidgetList().empty()) {
- const SideWidgetParameters p = sideWidgetParameters();
- result += (p.margin + p.widgetWidth)
- * int(std::count_if(rightSideWidgetList().begin(), rightSideWidgetList().end(),
- isSideWidgetVisible));
- }
- return result;
+ return effectiveTextMargin(rightTextMargin, rightSideWidgetList(), sideWidgetParameters());
}