Skip to content

Commit

Permalink
fix: show hidden animation lag
Browse files Browse the repository at this point in the history
- Show hidden default animations using the window manager
- Optimize animations that enter editing mode

Issue: linuxdeepin/developer-center#9728
  • Loading branch information
mhduiy committed Aug 27, 2024
1 parent 2bea126 commit 660d4c6
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 42 deletions.
2 changes: 0 additions & 2 deletions app/mainview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ MainView::MainView( WidgetManager *manager, QWidget *parent)

connect(m_editModeView, &EditModePanel::editCompleted, this, [this] () {
switchToDisplayMode();
m_animationContainer->showView();
});

// 使用定时器限制Geometry的更新间隔,防止过快更新造成画面撕裂
Expand All @@ -87,7 +86,6 @@ MainView::MainView( WidgetManager *manager, QWidget *parent)

connect(m_displayModeView, &DisplayModePanel::editClicked, this, [this] () {
switchToEditMode();
m_animationContainer->showView();
});

m_layout->addStretch();
Expand Down
51 changes: 15 additions & 36 deletions app/utils/animationviewcontainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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) {
Expand Down Expand Up @@ -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()
Expand All @@ -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)
Expand Down
8 changes: 4 additions & 4 deletions app/utils/animationviewcontainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down

0 comments on commit 660d4c6

Please sign in to comment.