You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

129 lines
2.9 KiB

import QtQuick
import QtQuick.Controls
import Eden.Constants
Item {
id: container
anchors {}
height: txt.contentHeight
clip: true
// TODO(crueter): util?
function toTitleCase(str) {
return str.replace(/\w\S*/g, text => text.charAt(0).toUpperCase(
) + text.substring(1).toLowerCase())
}
property string text
property string spacing: " "
property string combined: text + spacing
property string display: animate ? combined.substring(
step) + combined.substring(
0, step) : text
property int step: 0
property bool animate: canMarquee && txt.contentWidth > width
property bool canMarquee: false
property font font
property color color
property color background
onCanMarqueeChanged: checkMarquee()
function checkMarquee() {
if (canMarquee && txt.contentWidth > width) {
step = 0
delay.start()
} else {
delay.stop()
marquee.stop()
}
}
Timer {
id: marquee
interval: 150
running: false
repeat: true
onTriggered: {
parent.step = (parent.step + 1) % parent.combined.length
if (parent.step === 0) {
stop()
delay.start()
}
}
}
Timer {
id: delay
interval: 1500
repeat: false
onTriggered: {
marquee.start()
}
}
// fake container to gauge contentWidth
Text {
id: txt
visible: false
text: parent.text
font: container.font
onContentWidthChanged: container.checkMarquee()
}
Text {
anchors {
fill: parent
leftMargin: 10
rightMargin: 10
}
color: container.color
font: container.font
text: parent.display
horizontalAlignment: Text.AlignLeft
}
Rectangle {
anchors.fill: parent
z: 2
gradient: Gradient {
orientation: Gradient.Horizontal
GradientStop {
position: 0.0
color: marquee.running ? container.background : "transparent"
Behavior on color {
ColorAnimation {
duration: 200
}
}
}
GradientStop {
position: 0.1
color: "transparent"
}
GradientStop {
position: 0.9
color: "transparent"
}
GradientStop {
position: 1.0
color: marquee.running ? container.background : "transparent"
Behavior on color {
ColorAnimation {
duration: 200
}
}
}
}
}
}