[Desktop Theme KCM] Adapt clock to new hand rotation center options

Summary:
The new hints
* hint-hourhand-rotation-center-offset
* hint-minutehand-rotation-center-offset
allow themes to define where in the hand pixmap the rotation center should
be placed.

Test Plan:
Clear the cache (rm .cache/plasma* -r) and restart system settings, see
clocks of unmodified themes still have hands at normal position, and hands
of modified themes at expected positions.

Reviewers: #plasma, #vdg, mart, davidedmundson, ngraham

Reviewed By: #plasma, #vdg, mart, ngraham

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D20113
parent 78c7ca72
......@@ -24,26 +24,49 @@ import QtQuick 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
PlasmaCore.SvgItem {
id: secondHand
id: handRoot
property alias rotation: rotation.angle
property double svgScale
property double horizontalRotationOffset: 0
property double verticalRotationOffset: 0
property string rotationCenterHintId
readonly property double horizontalRotationCenter: {
if (svg.hasElement(rotationCenterHintId)) {
var hintedCenterRect = svg.elementRect(rotationCenterHintId),
handRect = svg.elementRect(elementId),
hintedX = hintedCenterRect.x - handRect.x + hintedCenterRect.width/2;
return Math.round(hintedX * svgScale) + Math.round(hintedX * svgScale) % 2;
}
return width/2;
}
readonly property double verticalRotationCenter: {
if (svg.hasElement(rotationCenterHintId)) {
var hintedCenterRect = svg.elementRect(rotationCenterHintId),
handRect = svg.elementRect(elementId),
hintedY = hintedCenterRect.y - handRect.y + hintedCenterRect.height/2;
return Math.round(hintedY * svgScale) + width % 2;
}
return width/2;
}
width: Math.round(naturalSize.width * svgScale) + Math.round(naturalSize.width * svgScale) % 2
height: Math.round(naturalSize.height * svgScale) + width % 2
anchors {
top: clock.verticalCenter
topMargin: -width / 2
horizontalCenter: clock.horizontalCenter
topMargin: -verticalRotationCenter + verticalRotationOffset
left: clock.horizontalCenter
leftMargin: -horizontalRotationCenter + horizontalRotationOffset
}
svg: clockSvg
smooth: !anim.running
transform: Rotation {
id: rotation
angle: 0
origin {
x: width / 2
y: width / 2
x: handRoot.horizontalRotationCenter
y: handRoot.verticalRotationCenter
}
Behavior on angle {
RotationAnimation {
......
......@@ -97,9 +97,43 @@ Item {
property int hours: 9
property int minutes: 5
readonly property double svgScale: face.width / face.naturalSize.width
readonly property double horizontalShadowOffset:
Math.round(clockSvg.naturalHorizontalHandShadowOffset * svgScale) + Math.round(clockSvg.naturalHorizontalHandShadowOffset * svgScale) % 2
readonly property double verticalShadowOffset:
Math.round(clockSvg.naturalVerticalHandShadowOffset * svgScale) + Math.round(clockSvg.naturalVerticalHandShadowOffset * svgScale) % 2
PlasmaCore.Svg {
id: clockSvg
imagePath: "widgets/clock"
function estimateHorizontalHandShadowOffset() {
var id = "hint-hands-shadow-offset-to-west";
if (hasElement(id)) {
return -elementSize(id).width;
}
id = "hint-hands-shadows-offset-to-east";
if (hasElement(id)) {
return elementSize(id).width;
}
return 0;
}
function estimateVerticalHandShadowOffset() {
var id = "hint-hands-shadow-offset-to-north";
if (hasElement(id)) {
return -elementSize(id).height;
}
id = "hint-hands-shadow-offset-to-south";
if (hasElement(id)) {
return elementSize(id).height;
}
return 0;
}
property double naturalHorizontalHandShadowOffset: estimateHorizontalHandShadowOffset()
property double naturalVerticalHandShadowOffset: estimateVerticalHandShadowOffset()
onRepaintNeeded: {
naturalHorizontalHandShadowOffset = estimateHorizontalHandShadowOffset();
naturalVerticalHandShadowOffset = estimateVerticalHandShadowOffset();
}
}
PlasmaCore.SvgItem {
......@@ -113,20 +147,22 @@ Item {
Hand {
elementId: "HourHand"
rotationCenterHintId: "hint-hourhand-rotation-center-offset"
rotation: 180 + clock.hours * 30 + (clock.minutes/2)
svgScale: face.width / face.naturalSize.width
svgScale: clock.svgScale
}
Hand {
elementId: "MinuteHand"
rotationCenterHintId: "hint-minutehand-rotation-center-offset"
rotation: 180 + clock.minutes * 6
svgScale: face.width / face.naturalSize.width
svgScale: clock.svgScale
}
PlasmaCore.SvgItem {
id: center
width: naturalSize.width * face.width / face.naturalSize.width
height: naturalSize.height * face.width / face.naturalSize.width
width: naturalSize.width * clock.svgScale
height: naturalSize.height * clock.svgScale
anchors.centerIn: clock
svg: clockSvg
elementId: "HandCenterScrew"
......@@ -137,8 +173,8 @@ Item {
anchors.fill: face
svg: clockSvg
elementId: "Glass"
width: naturalSize.width * face.width / face.naturalSize.width
height: naturalSize.height * face.width / face.naturalSize.width
width: naturalSize.width * clock.svgScale
height: naturalSize.height * clock.svgScale
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment