import QtQuick 2.0 import Sailfish.Silica 1.0 Item { id: root property QtObject timerClock // Size of the clock border decoration as a fraction of the radius property real _faceRadiusBase: 84 property real _faceHourLength: 14.736 / _faceRadiusBase Image { id: clockFace anchors.fill: parent fillMode: Image.PreserveAspectFit source: "image://theme/graphic-clock-face-3" } ShaderEffect { id: timerVisualization anchors.fill: clockFace visible: stopwatch.update onVisibleChanged: { _updateTimerVisualization() } property int _seconds: stopwatch.seconds on_SecondsChanged: _updateTimerVisualization() property real outerRadius: 1 property real innerRadius: 1 - _faceHourLength property real endAngle property real loopRadius: outerRadius / 10 property real count property color highlightColor: Theme.rgba(Theme.highlightColor, 0.75) function _updateTimerVisualization() { if (stopwatch.fast) { count = _seconds } else { count = Math.floor(_seconds / 60) } endAngle = 2 * Math.PI * count / 60 innerRadius = outerRadius - loopRadius * (parseInt(count / 60) + 1) } vertexShader: " uniform highp mat4 qt_Matrix; attribute highp vec4 qt_Vertex; attribute highp vec2 qt_MultiTexCoord0; varying highp vec2 coord; void main() { coord = qt_MultiTexCoord0; gl_Position = qt_Matrix * qt_Vertex; }" fragmentShader: " varying highp vec2 coord; uniform lowp float qt_Opacity; uniform lowp float outerRadius; uniform lowp float innerRadius; uniform lowp float endAngle; uniform lowp float loopRadius; uniform lowp vec4 highlightColor; uniform lowp float count; lowp float PI = 3.14159265358979323846264; void main() { highp vec2 vector = 2.0*(coord - vec2(0.5, 0.5)); lowp float radius = length(vector); lowp float angle = atan(vector.y, vector.x) + PI/2.0; angle += angle < 0.0 ? 2.0*PI : 0.0; lowp float minRadius = outerRadius - ((count / 60.0) + 1.0) * loopRadius + (loopRadius * angle / (2.0 * PI)); lowp float maxRadius = outerRadius - ((mod(count, 60.0) / 60.0) + 1.0) * loopRadius + (loopRadius * angle / (2.0 * PI)); if (angle < 2.0 * PI * mod(count, 60.0) / 60.0) { maxRadius += loopRadius; } if (radius >= minRadius && radius < maxRadius) { if (mod(radius - minRadius, loopRadius) > 0.2 * loopRadius) { gl_FragColor = highlightColor; return; } } gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); return; }" } }