From 11d4feff382cc5dea847dd9771f79943c8d8bb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Mazurski?= Date: Wed, 15 Nov 2023 18:56:19 +0100 Subject: [PATCH] plz work --- ...ing-damper_model_for_slide_animation.patch | 197 +++++++++--------- 1 file changed, 101 insertions(+), 96 deletions(-) diff --git a/revert_mass-spring-damper_model_for_slide_animation.patch b/revert_mass-spring-damper_model_for_slide_animation.patch index 324b08c..d11270a 100644 --- a/revert_mass-spring-damper_model_for_slide_animation.patch +++ b/revert_mass-spring-damper_model_for_slide_animation.patch @@ -1,4 +1,4 @@ -Subject: [PATCH] 5.27.9 Patch +Subject: [PATCH] revert mass-spring-damper model for slide animation --- Index: src/effects/slide/slide.kcfg IDEA additional info: @@ -6,8 +6,8 @@ Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/src/effects/slide/slide.kcfg b/src/effects/slide/slide.kcfg ---- a/src/effects/slide/slide.kcfg (revision 9d677be2a82a781e6ab19216716d9e0d2dba6d53) -+++ b/src/effects/slide/slide.kcfg (date 1699994239466) +--- a/src/effects/slide/slide.kcfg (revision 9ae6a9fc7377d72e8a320e1eca4dce7fba40205c) ++++ b/src/effects/slide/slide.kcfg (date 1699984902100) @@ -6,11 +6,17 @@ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" > @@ -26,103 +26,14 @@ diff --git a/src/effects/slide/slide.kcfg b/src/effects/slide/slide.kcfg true -Index: src/effects/slide/slide.cpp -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/src/effects/slide/slide.cpp b/src/effects/slide/slide.cpp ---- a/src/effects/slide/slide.cpp (revision 9d677be2a82a781e6ab19216716d9e0d2dba6d53) -+++ b/src/effects/slide/slide.cpp (date 1699994239446) -@@ -25,6 +25,8 @@ - initConfig(); - reconfigure(ReconfigureAll); - -+ m_timeLine.setEasingCurve(QEasingCurve::OutCubic); -+ - connect(effects, QOverload::of(&EffectsHandler::desktopChanged), - this, &SlideEffect::desktopChanged); - connect(effects, QOverload::of(&EffectsHandler::desktopChanging), -@@ -59,11 +61,8 @@ - { - SlideConfig::self()->read(); - -- const qreal springConstant = 300.0 / effects->animationTimeFactor(); -- const qreal dampingRatio = 1.1; -- -- m_motionX = SpringMotion(springConstant, dampingRatio); -- m_motionY = SpringMotion(springConstant, dampingRatio); -+ m_fullAnimationDuration = animationTime(500); -+ m_timeLine.setDuration(std::chrono::milliseconds(m_fullAnimationDuration)); - - m_hGap = SlideConfig::horizontalGap(); - m_vGap = SlideConfig::verticalGap(); -@@ -96,13 +95,10 @@ - timeDelta = presentTime - m_lastPresentTime; - } - m_lastPresentTime = presentTime; -+ m_timeLine.update(timeDelta); - - if (m_state == State::ActiveAnimation) { -- m_motionX.advance(timeDelta); -- m_motionY.advance(timeDelta); -- const QSize virtualSpaceSize = effects->virtualScreenSize(); -- m_currentPosition.setX(m_motionX.position() / virtualSpaceSize.width()); -- m_currentPosition.setY(m_motionY.position() / virtualSpaceSize.height()); -+ m_currentPosition = m_startPos + (m_endPos - m_startPos) * m_timeLine.value(); - } - - const int w = effects->desktopGridWidth(); -@@ -252,7 +248,7 @@ - - void SlideEffect::postPaintScreen() - { -- if (m_state == State::ActiveAnimation && !m_motionX.isMoving() && !m_motionY.isMoving()) { -+ if (m_state == State::ActiveAnimation && m_timeLine.done()) { - finishedSwitching(); - } - -@@ -295,6 +291,7 @@ - - m_state = State::ActiveAnimation; - m_movingWindow = movingWindow; -+ m_timeLine.reset(); - - m_startPos = m_currentPosition; - m_endPos = effects->desktopGridCoords(current); -@@ -302,11 +299,19 @@ - optimizePath(); - } - -- const QSize virtualSpaceSize = effects->virtualScreenSize(); -- m_motionX.setAnchor(m_endPos.x() * virtualSpaceSize.width()); -- m_motionX.setPosition(m_startPos.x() * virtualSpaceSize.width()); -- m_motionY.setAnchor(m_endPos.y() * virtualSpaceSize.height()); -- m_motionY.setPosition(m_startPos.y() * virtualSpaceSize.height()); -+ // Find an apropriate duration -+ QPointF distance = m_startPos - m_endPos; -+ distance.setX(std::abs(distance.x())); -+ distance.setY(std::abs(distance.y())); -+ if (distance.x() < 1 && distance.y() < 1) { -+ if (distance.x() > distance.y()) { -+ m_timeLine.setDuration(std::chrono::milliseconds(std::max(1, (int)(m_fullAnimationDuration * distance.x())))); -+ } else { -+ m_timeLine.setDuration(std::chrono::milliseconds(std::max(1, (int)(m_fullAnimationDuration * distance.y())))); -+ } -+ } else { -+ m_timeLine.setDuration(std::chrono::milliseconds(m_fullAnimationDuration)); -+ } - - effects->setActiveFullScreenEffect(this); - effects->addRepaintFull(); Index: src/effects/slide/slide_config.ui IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/src/effects/slide/slide_config.ui b/src/effects/slide/slide_config.ui ---- a/src/effects/slide/slide_config.ui (revision 9d677be2a82a781e6ab19216716d9e0d2dba6d53) -+++ b/src/effects/slide/slide_config.ui (date 1699994239473) +--- a/src/effects/slide/slide_config.ui (revision 9ae6a9fc7377d72e8a320e1eca4dce7fba40205c) ++++ b/src/effects/slide/slide_config.ui (date 1699984902103) @@ -12,6 +12,39 @@ @@ -183,8 +94,8 @@ Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/src/effects/slide/slide.h b/src/effects/slide/slide.h ---- a/src/effects/slide/slide.h (revision 9d677be2a82a781e6ab19216716d9e0d2dba6d53) -+++ b/src/effects/slide/slide.h (date 1699994239456) +--- a/src/effects/slide/slide.h (revision 9ae6a9fc7377d72e8a320e1eca4dce7fba40205c) ++++ b/src/effects/slide/slide.h (date 1699993636445) @@ -68,6 +68,7 @@ static bool supported(); @@ -221,3 +132,97 @@ diff --git a/src/effects/slide/slide.h b/src/effects/slide/slide.h inline int SlideEffect::horizontalGap() const { return m_hGap; +Index: src/effects/slide/slide.cpp +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/effects/slide/slide.cpp b/src/effects/slide/slide.cpp +--- a/src/effects/slide/slide.cpp (revision 9ae6a9fc7377d72e8a320e1eca4dce7fba40205c) ++++ b/src/effects/slide/slide.cpp (date 1700066958682) +@@ -26,6 +26,8 @@ + initConfig(); + reconfigure(ReconfigureAll); + ++ m_timeLine.setEasingCurve(QEasingCurve::OutCubic); ++ + connect(effects, &EffectsHandler::desktopChanged, + this, &SlideEffect::desktopChanged); + connect(effects, &EffectsHandler::desktopChanging, +@@ -62,11 +64,8 @@ + { + SlideConfig::self()->read(); + +- const qreal springConstant = 300.0 / effects->animationTimeFactor(); +- const qreal dampingRatio = 1.1; +- +- m_motionX = SpringMotion(springConstant, dampingRatio); +- m_motionY = SpringMotion(springConstant, dampingRatio); ++ m_fullAnimationDuration = animationTime(500); ++ m_timeLine.setDuration(std::chrono::milliseconds(m_fullAnimationDuration)); + + m_hGap = SlideConfig::horizontalGap(); + m_vGap = SlideConfig::verticalGap(); +@@ -94,18 +93,10 @@ + + void SlideEffect::prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) + { +- std::chrono::milliseconds timeDelta = std::chrono::milliseconds::zero(); +- if (m_lastPresentTime.count()) { +- timeDelta = presentTime - m_lastPresentTime; +- } +- m_lastPresentTime = presentTime; ++ m_timeLine.advance(presentTime); + + if (m_state == State::ActiveAnimation) { +- m_motionX.advance(timeDelta); +- m_motionY.advance(timeDelta); +- const QSize virtualSpaceSize = effects->virtualScreenSize(); +- m_currentPosition.setX(m_motionX.position() / virtualSpaceSize.width()); +- m_currentPosition.setY(m_motionY.position() / virtualSpaceSize.height()); ++ m_currentPosition = m_startPos + (m_endPos - m_startPos) * m_timeLine.value(); + } + + const QList desktops = effects->desktops(); +@@ -252,7 +243,7 @@ + + void SlideEffect::postPaintScreen() + { +- if (m_state == State::ActiveAnimation && !m_motionX.isMoving() && !m_motionY.isMoving()) { ++ if (m_state == State::ActiveAnimation && m_timeLine.done()) { + finishedSwitching(); + } + +@@ -295,6 +286,7 @@ + + m_state = State::ActiveAnimation; + m_movingWindow = movingWindow; ++ m_timeLine.reset(); + + m_startPos = m_currentPosition; + m_endPos = effects->desktopGridCoords(current); +@@ -302,11 +294,19 @@ + optimizePath(); + } + +- const QSize virtualSpaceSize = effects->virtualScreenSize(); +- m_motionX.setAnchor(m_endPos.x() * virtualSpaceSize.width()); +- m_motionX.setPosition(m_startPos.x() * virtualSpaceSize.width()); +- m_motionY.setAnchor(m_endPos.y() * virtualSpaceSize.height()); +- m_motionY.setPosition(m_startPos.y() * virtualSpaceSize.height()); ++ // Find an apropriate duration ++ QPointF distance = m_startPos - m_endPos; ++ distance.setX(std::abs(distance.x())); ++ distance.setY(std::abs(distance.y())); ++ if (distance.x() < 1 && distance.y() < 1) { ++ if (distance.x() > distance.y()) { ++ m_timeLine.setDuration(std::chrono::milliseconds(std::max(1, (int)(m_fullAnimationDuration * distance.x())))); ++ } else { ++ m_timeLine.setDuration(std::chrono::milliseconds(std::max(1, (int)(m_fullAnimationDuration * distance.y())))); ++ } ++ } else { ++ m_timeLine.setDuration(std::chrono::milliseconds(m_fullAnimationDuration)); ++ } + + effects->setActiveFullScreenEffect(this); + effects->addRepaintFull();