1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-01 19:18:28 -04:00

media: throttle frame rate of media-related animations

port 1.5

related #2869

(cherry picked from commit cdaedad969)
This commit is contained in:
bbedward
2026-07-15 12:57:25 -04:00
committed by dms-ci[bot]
parent 01c0ed2778
commit 815820aa27
4 changed files with 53 additions and 37 deletions
+36 -24
View File
@@ -358,38 +358,50 @@ BasePill {
onTextChanged: {
scrollOffset = 0;
textShift = 0;
scrollTimer.reset();
textChangeAnimation.restart();
}
SequentialAnimation {
id: scrollAnimation
// Timer stepping, not NumberAnimation — a running animation commits frames every vsync (#2863)
Timer {
id: scrollTimer
readonly property real maxOffset: Math.max(0, mediaText.implicitWidth - textContainer.width + 5)
property int direction: 1
property int holdTicks: 33
interval: 60
repeat: true
running: mediaText.needsScrolling && textContainer.visible && mediaText.onScreen && root._isPlaying
loops: Animation.Infinite
onStopped: mediaText.scrollOffset = 0
PauseAnimation {
duration: 2000
function reset() {
mediaText.scrollOffset = 0;
direction = 1;
holdTicks = 33;
}
NumberAnimation {
target: mediaText
property: "scrollOffset"
from: 0
to: mediaText.implicitWidth - textContainer.width + 5
duration: Math.max(1000, (mediaText.implicitWidth - textContainer.width + 5) * 60)
easing.type: Easing.Linear
onRunningChanged: {
if (!running)
reset();
}
PauseAnimation {
duration: 2000
}
NumberAnimation {
target: mediaText
property: "scrollOffset"
to: 0
duration: Math.max(1000, (mediaText.implicitWidth - textContainer.width + 5) * 60)
easing.type: Easing.Linear
onTriggered: {
if (holdTicks > 0) {
holdTicks--;
return;
}
const next = mediaText.scrollOffset + direction;
if (next >= maxOffset) {
mediaText.scrollOffset = maxOffset;
direction = -1;
holdTicks = 33;
return;
}
if (next <= 0) {
mediaText.scrollOffset = 0;
direction = 1;
holdTicks = 33;
return;
}
mediaText.scrollOffset = next;
}
}
+6 -10
View File
@@ -182,16 +182,12 @@ Item {
}
}
FrameAnimation {
running: blobEffect.visible
property real pending: 0
onTriggered: {
pending += frameTime;
if (pending < 0.03)
return;
root.stepBlob(Math.min(pending, 0.05));
pending = 0;
}
// Timer, not FrameAnimation — a running animation commits frames every vsync (#2863)
Timer {
running: blobEffect.visible && root.onScreen
interval: 33
repeat: true
onTriggered: root.stepBlob(0.033)
}
ShaderEffect {
+4
View File
@@ -147,6 +147,10 @@ Item {
trackColor: MediaAccentService.accentTrack
actualProgressColor: MediaAccentService.accentSubtle
isPlaying: activePlayer && activePlayer.playbackState === MprisPlaybackState.Playing
onFrameTicked: {
if (!root.isSeeking)
activePlayer.positionChanged();
}
MouseArea {
id: waveMouseArea
+7 -3
View File
@@ -50,11 +50,15 @@ Item {
fragmentShader: Qt.resolvedUrl("../Shaders/qsb/wave_progress.frag.qsb")
}
signal frameTicked
FrameAnimation {
running: root.visible && (root.isPlaying || root.currentAmp > 0)
running: root.visible && (root.isPlaying || root.currentAmp > 0) && (root.Window.window?.visible ?? false)
onTriggered: {
if (root.isPlaying)
root.phase += 0.03 * frameTime * 60;
if (!root.isPlaying)
return;
root.phase = (root.phase + 0.03 * frameTime * 60) % 6.28318530718;
root.frameTicked();
}
}
}