diff --git a/kcms/desktoptheme/package/contents/ui/Hand.qml b/kcms/desktoptheme/package/contents/ui/Hand.qml --- a/kcms/desktoptheme/package/contents/ui/Hand.qml +++ b/kcms/desktoptheme/package/contents/ui/Hand.qml @@ -24,26 +24,49 @@ 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 { diff --git a/kcms/desktoptheme/package/contents/ui/ThemePreview.qml b/kcms/desktoptheme/package/contents/ui/ThemePreview.qml --- a/kcms/desktoptheme/package/contents/ui/ThemePreview.qml +++ b/kcms/desktoptheme/package/contents/ui/ThemePreview.qml @@ -97,9 +97,43 @@ 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 @@ 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 @@ 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 } } }