|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
Subject: [PATCH] revert mass-spring-damper model for slide animation
|
|
|
|
|
Subject: [PATCH] 5.27.9 Patch
|
|
|
|
|
---
|
|
|
|
|
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 9ae6a9fc7377d72e8a320e1eca4dce7fba40205c)
|
|
|
|
|
+++ b/src/effects/slide/slide.kcfg (date 1699984902100)
|
|
|
|
|
--- a/src/effects/slide/slide.kcfg (revision 9d677be2a82a781e6ab19216716d9e0d2dba6d53)
|
|
|
|
|
+++ b/src/effects/slide/slide.kcfg (date 1700071065013)
|
|
|
|
|
@@ -6,11 +6,17 @@
|
|
|
|
|
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
|
|
|
|
|
<kcfgfile arg="true"/>
|
|
|
|
@ -26,14 +26,108 @@ diff --git a/src/effects/slide/slide.kcfg b/src/effects/slide/slide.kcfg
|
|
|
|
|
</entry>
|
|
|
|
|
<entry name="SlideBackground" type="Bool">
|
|
|
|
|
<default>true</default>
|
|
|
|
|
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 1700071064990)
|
|
|
|
|
@@ -25,6 +25,8 @@
|
|
|
|
|
initConfig<SlideConfig>();
|
|
|
|
|
reconfigure(ReconfigureAll);
|
|
|
|
|
|
|
|
|
|
+ m_timeLine.setEasingCurve(QEasingCurve::OutCubic);
|
|
|
|
|
+
|
|
|
|
|
connect(effects, QOverload<int, int, EffectWindow *>::of(&EffectsHandler::desktopChanged),
|
|
|
|
|
this, &SlideEffect::desktopChanged);
|
|
|
|
|
connect(effects, QOverload<uint, QPointF, EffectWindow *>::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<SlideConfig>(500);
|
|
|
|
|
+ m_timeLine.setDuration(std::chrono::milliseconds(m_fullAnimationDuration));
|
|
|
|
|
|
|
|
|
|
m_hGap = SlideConfig::horizontalGap();
|
|
|
|
|
m_vGap = SlideConfig::verticalGap();
|
|
|
|
|
@@ -91,18 +90,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 int w = effects->desktopGridWidth();
|
|
|
|
|
@@ -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();
|
|
|
|
|
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 9ae6a9fc7377d72e8a320e1eca4dce7fba40205c)
|
|
|
|
|
+++ b/src/effects/slide/slide_config.ui (date 1699984902103)
|
|
|
|
|
--- a/src/effects/slide/slide_config.ui (revision 9d677be2a82a781e6ab19216716d9e0d2dba6d53)
|
|
|
|
|
+++ b/src/effects/slide/slide_config.ui (date 1700071065020)
|
|
|
|
|
@@ -12,6 +12,39 @@
|
|
|
|
|
</property>
|
|
|
|
|
<layout class="QVBoxLayout" name="verticalLayout">
|
|
|
|
@ -94,8 +188,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 9ae6a9fc7377d72e8a320e1eca4dce7fba40205c)
|
|
|
|
|
+++ b/src/effects/slide/slide.h (date 1699993636445)
|
|
|
|
|
--- a/src/effects/slide/slide.h (revision 9d677be2a82a781e6ab19216716d9e0d2dba6d53)
|
|
|
|
|
+++ b/src/effects/slide/slide.h (date 1700071065003)
|
|
|
|
|
@@ -68,6 +68,7 @@
|
|
|
|
|
|
|
|
|
|
static bool supported();
|
|
|
|
@ -132,97 +226,3 @@ 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<SlideConfig>();
|
|
|
|
|
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<SlideConfig>(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<VirtualDesktop *> 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();
|
|
|
|
|