diff --git a/src/widgets/dsearchedit.cpp b/src/widgets/dsearchedit.cpp index afafab3a0..5aee3d135 100644 --- a/src/widgets/dsearchedit.cpp +++ b/src/widgets/dsearchedit.cpp @@ -270,7 +270,11 @@ DSearchEditPrivate::DSearchEditPrivate(DSearchEdit *q) , action(nullptr) , iconWidget(nullptr) , label(nullptr) + , m_animation(new QPropertyAnimation) { + m_animation->setPropertyName("pos"); + m_animation->setEasingCurve(QEasingCurve::OutCubic); + m_animation->setDuration(200); } DSearchEditPrivate::~DSearchEditPrivate() @@ -377,16 +381,36 @@ void DSearchEditPrivate::_q_toEditMode(bool focus) { D_Q(DSearchEdit); - if (focus || !q->lineEdit()->text().isEmpty()) { - action->setVisible(true); - iconWidget->setVisible(false); - lineEdit->setPlaceholderText(placeholderText); - } else { + if (m_animation->state() == QPropertyAnimation::Running) + return; + + auto textMargins = q->lineEdit()->textMargins(); + QMargins marginsInAnimation(-4, 0, 0, 0); + + m_animation->setTargetObject(iconWidget); + m_animation->setStartValue(QPoint(q->lineEdit()->geometry().center().x() - iconWidget->width() / 2, iconWidget->pos().y())); + m_animation->setEndValue(QPoint(0, iconWidget->pos().y())); + + if (focus) { + m_animation->setDirection(QPropertyAnimation::Direction::Forward); + } else if (q->lineEdit()->text().isEmpty()) { action->setVisible(false); - iconWidget->setVisible(true); - lineEdit->setPlaceholderText(QString()); + m_animation->setDirection(QPropertyAnimation::Direction::Backward); } + q->connect(m_animation, &QPropertyAnimation::finished, q, [q, this, textMargins]() { + q->lineEdit()->setTextMargins(textMargins); + if (m_animation->direction() == QPropertyAnimation::Direction::Forward) { + action->setVisible(true); + iconWidget->setVisible(false); + lineEdit->setPlaceholderText(placeholderText); + } else { + iconWidget->setVisible(true); + lineEdit->setPlaceholderText(QString()); + iconWidget->move(QPoint(q->lineEdit()->geometry().center().x() - iconWidget->width() / 2, iconWidget->pos().y())); + } + }); + #ifdef ENABLE_AI //Focus disappears, clear voice check if (voiceAction) { @@ -394,6 +418,12 @@ void DSearchEditPrivate::_q_toEditMode(bool focus) _q_onVoiceActionTrigger(false); } #endif + if (!q->lineEdit()->text().isEmpty()) + return; + + iconWidget->setVisible(q->lineEdit()->text().isEmpty()); + q->lineEdit()->setTextMargins(marginsInAnimation); + m_animation->start(); } void DSearchEditPrivate::_q_onVoiceActionTrigger(bool checked) diff --git a/src/widgets/private/dsearchedit_p.h b/src/widgets/private/dsearchedit_p.h index d5c3eaac3..7738bd413 100644 --- a/src/widgets/private/dsearchedit_p.h +++ b/src/widgets/private/dsearchedit_p.h @@ -9,6 +9,7 @@ #include #include +#include QT_BEGIN_NAMESPACE class QAudioInput; @@ -37,6 +38,7 @@ class DSearchEditPrivate : DLineEditPrivate QWidget *iconWidget; QLabel *label; + QPropertyAnimation *m_animation; #ifdef ENABLE_AI QAction *voiceAction = nullptr;