diff --git a/app/mainview.cpp b/app/mainview.cpp index dce5595..44f75ba 100644 --- a/app/mainview.cpp +++ b/app/mainview.cpp @@ -62,7 +62,6 @@ MainView::MainView( WidgetManager *manager, QWidget *parent) connect(m_editModeView, &EditModePanel::editCompleted, this, [this] () { switchToDisplayMode(); - m_animationContainer->showView(); }); // 使用定时器限制Geometry的更新间隔,防止过快更新造成画面撕裂 @@ -87,7 +86,6 @@ MainView::MainView( WidgetManager *manager, QWidget *parent) connect(m_displayModeView, &DisplayModePanel::editClicked, this, [this] () { switchToEditMode(); - m_animationContainer->showView(); }); m_layout->addStretch(); diff --git a/app/utils/animationviewcontainer.cpp b/app/utils/animationviewcontainer.cpp index 47a478c..11bfa09 100644 --- a/app/utils/animationviewcontainer.cpp +++ b/app/utils/animationviewcontainer.cpp @@ -24,6 +24,7 @@ DGUI_USE_NAMESPACE WIDGETS_FRAME_BEGIN_NAMESPACE AnimationViewContainer::AnimationViewContainer(QWidget *parent) : DBlurEffectWidget (parent) + , m_currentXAni(new QPropertyAnimation(this, "currentX")) , m_windowHandle(new DPlatformWindowHandle(this, this)) { resize(0, 0); // Should set size explicitly for region monitor to work correctly. @@ -32,6 +33,9 @@ AnimationViewContainer::AnimationViewContainer(QWidget *parent) m_themeType= DGuiApplicationHelper::instance()->themeType(); m_windowHandle->setBorderWidth(1); + m_currentXAni->setDuration(300); + m_currentXAni->setEasingCurve(QEasingCurve::OutQuart); + auto setOuterBorderColor = [this]() { auto outerBorderNewColor = outerBorderColor; if (m_themeType == DGuiApplicationHelper::ColorType::DarkType) { @@ -109,44 +113,16 @@ void AnimationViewContainer::regionMonitorHide(const QPoint &p, const int flag) void AnimationViewContainer::showView() { - if (m_currentXAni && (m_currentXAni->state() == QAbstractAnimation::Running)) - return; - - if (!m_currentXAni) { - m_currentXAni = new QPropertyAnimation(this, "currentX"); - const int AnimationTime = 300; - m_currentXAni->setEasingCurve(QEasingCurve::Linear); - m_currentXAni->setDuration(AnimationTime); - } - - const auto &rect = m_targetRect; - qDebug(dwLog()) << "show view:" << rect; + setCurrentX(m_targetRect.left()); show(); activateWindow(); - registerRegion(); - m_currentXAni->setStartValue(rect.left()); - m_currentXAni->setEndValue(rect.right()); - m_currentXAni->setDirection(QAbstractAnimation::Backward); - m_currentXAni->start(); - disconnect(m_currentXAni, &QPropertyAnimation::finished, this, &AnimationViewContainer::hide); } void AnimationViewContainer::hideView() { - Q_ASSERT(m_currentXAni); - if (m_currentXAni->state() == QAbstractAnimation::Running) - return; - - const auto &rect = m_targetRect; - qDebug(dwLog()) << "hide view" << rect; - unRegisterRegion(); - m_currentXAni->setStartValue(rect.left()); - m_currentXAni->setEndValue(rect.right()); - m_currentXAni->setDirection(QAbstractAnimation::Forward); - m_currentXAni->start(); - connect(m_currentXAni, &QPropertyAnimation::finished, this, &AnimationViewContainer::hide, Qt::UniqueConnection); + hide(); } void AnimationViewContainer::refreshView() @@ -163,27 +139,30 @@ void AnimationViewContainer::refreshView() void AnimationViewContainer::updateGeometry(const QRect &rect) { + m_currentXAni->stop(); + m_currentXAni->setStartValue(m_targetRect.left()); + m_currentXAni->setEndValue(rect.left()); m_targetRect = rect; if (isVisible()) { - QRect geometry = rect - QMargins(0, UI::Widget::WindowMargin, 0, UI::Widget::WindowMargin); - setGeometry(geometry); + m_currentXAni->start(); + } else { + } - qDebug() << "updateGeometry:" << geometry() << m_targetRect; } -int AnimationViewContainer::currentX() const +qreal AnimationViewContainer::currentX() const { return QWidget::x(); } -void AnimationViewContainer::setCurrentX(const int x) +void AnimationViewContainer::setCurrentX(const qreal x) { auto rect = m_targetRect; rect -= QMargins(0, UI::Widget::WindowMargin, 0, UI::Widget::WindowMargin); rect.setLeft(x); rect.setWidth(m_targetRect.right() - x); - setGeometry(rect); + setGeometry(rect.toRect()); } void AnimationViewContainer::paintEvent(QPaintEvent *e) diff --git a/app/utils/animationviewcontainer.h b/app/utils/animationviewcontainer.h index b0199fb..adab753 100644 --- a/app/utils/animationviewcontainer.h +++ b/app/utils/animationviewcontainer.h @@ -18,7 +18,7 @@ DWIDGET_USE_NAMESPACE class AnimationViewContainer : public DBlurEffectWidget { Q_OBJECT - Q_PROPERTY(int currentX READ currentX WRITE setCurrentX) + Q_PROPERTY(qreal currentX READ currentX WRITE setCurrentX) public: explicit AnimationViewContainer (QWidget *parent = nullptr); virtual ~AnimationViewContainer() override; @@ -38,13 +38,13 @@ private Q_SLOTS: void regionMonitorHide(const QPoint & p, const int flag); private: - int currentX() const; - void setCurrentX(const int x); + qreal currentX() const; + void setCurrentX(const qreal x); void registerRegion(); void unRegisterRegion(); private: - QRect m_targetRect; + QRectF m_targetRect; QPropertyAnimation *m_currentXAni = nullptr; DRegionMonitor *m_regionMonitor = nullptr;