mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-02-23 23:55:54 +00:00
230 lines
8.6 KiB
QML
230 lines
8.6 KiB
QML
/*
|
|
SPDX-FileCopyrightText: 2012 Viranch Mehta <viranch.mehta@gmail.com>
|
|
SPDX-FileCopyrightText: 2012 Marco Martin <mart@kde.org>
|
|
SPDX-FileCopyrightText: 2013 David Edmundson <davidedmundson@kde.org>
|
|
|
|
SPDX-License-Identifier: LGPL-2.0-or-later
|
|
*/
|
|
|
|
import QtQuick 2.0
|
|
import org.kde.plasma.plasmoid 2.0
|
|
import org.kde.plasma.calendar 2.0 as PlasmaCalendar
|
|
import QtQuick.Layouts 1.1
|
|
|
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
|
import org.kde.plasma.components 3.0 as PlasmaComponents
|
|
|
|
Item {
|
|
id: analogclock
|
|
|
|
width: PlasmaCore.Units.gridUnit * 15
|
|
height: PlasmaCore.Units.gridUnit * 15
|
|
property int hours
|
|
property int minutes
|
|
property int seconds
|
|
property bool showSecondsHand: plasmoid.configuration.showSecondHand
|
|
property bool showTimezone: plasmoid.configuration.showTimezoneString
|
|
property int tzOffset
|
|
|
|
Plasmoid.backgroundHints: "NoBackground";
|
|
Plasmoid.preferredRepresentation: Plasmoid.compactRepresentation
|
|
|
|
Plasmoid.toolTipMainText: Qt.formatDate(dataSource.data["Local"]["DateTime"],"dddd")
|
|
Plasmoid.toolTipSubText: Qt.formatTime(dataSource.data["Local"]["DateTime"], Qt.locale().timeFormat(Locale.LongFormat)) + "\n" +
|
|
Qt.formatDate(dataSource.data["Local"]["DateTime"], Qt.locale().dateFormat(Locale.LongFormat).replace(/(^dddd.?\s)|(,?\sdddd$)/, ""))
|
|
|
|
PlasmaCore.DataSource {
|
|
id: dataSource
|
|
engine: "time"
|
|
connectedSources: "Local"
|
|
interval: showSecondsHand ? 1000 : 30000
|
|
onDataChanged: {
|
|
var date = new Date(data["Local"]["DateTime"]);
|
|
hours = date.getHours();
|
|
minutes = date.getMinutes();
|
|
seconds = date.getSeconds();
|
|
}
|
|
Component.onCompleted: {
|
|
onDataChanged();
|
|
}
|
|
}
|
|
|
|
function dateTimeChanged()
|
|
{
|
|
//console.log("Date/time changed!");
|
|
|
|
var currentTZOffset = dataSource.data["Local"]["Offset"] / 60;
|
|
if (currentTZOffset !== tzOffset) {
|
|
tzOffset = currentTZOffset;
|
|
//console.log("TZ offset changed: " + tzOffset);
|
|
Date.timeZoneUpdated(); // inform the QML JS engine about TZ change
|
|
}
|
|
}
|
|
|
|
Component.onCompleted: {
|
|
tzOffset = new Date().getTimezoneOffset();
|
|
//console.log("Initial TZ offset: " + tzOffset);
|
|
dataSource.onDataChanged.connect(dateTimeChanged);
|
|
}
|
|
|
|
Plasmoid.compactRepresentation: Item {
|
|
id: representation
|
|
Layout.minimumWidth: plasmoid.formFactor !== PlasmaCore.Types.Vertical ? representation.height : PlasmaCore.Units.gridUnit
|
|
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Vertical ? representation.width : PlasmaCore.Units.gridUnit
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: plasmoid.expanded = !plasmoid.expanded
|
|
}
|
|
|
|
|
|
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();
|
|
}
|
|
}
|
|
|
|
Item {
|
|
id: clock
|
|
width: parent.width
|
|
anchors {
|
|
top: parent.top
|
|
bottom: showTimezone ? timezoneBg.top : parent.bottom
|
|
}
|
|
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.SvgItem {
|
|
id: face
|
|
anchors.centerIn: parent
|
|
width: Math.min(parent.width, parent.height)
|
|
height: Math.min(parent.width, parent.height)
|
|
svg: clockSvg
|
|
elementId: "ClockFace"
|
|
}
|
|
|
|
Hand {
|
|
elementId: "HourHandShadow"
|
|
rotationCenterHintId: "hint-hourhandshadow-rotation-center-offset"
|
|
horizontalRotationOffset: clock.horizontalShadowOffset
|
|
verticalRotationOffset: clock.verticalShadowOffset
|
|
rotation: 180 + hours * 30 + (minutes/2)
|
|
svgScale: clock.svgScale
|
|
|
|
}
|
|
Hand {
|
|
elementId: "HourHand"
|
|
rotationCenterHintId: "hint-hourhand-rotation-center-offset"
|
|
rotation: 180 + hours * 30 + (minutes/2)
|
|
svgScale: clock.svgScale
|
|
}
|
|
|
|
Hand {
|
|
elementId: "MinuteHandShadow"
|
|
rotationCenterHintId: "hint-minutehandshadow-rotation-center-offset"
|
|
horizontalRotationOffset: clock.horizontalShadowOffset
|
|
verticalRotationOffset: clock.verticalShadowOffset
|
|
rotation: 180 + minutes * 6
|
|
svgScale: clock.svgScale
|
|
}
|
|
Hand {
|
|
elementId: "MinuteHand"
|
|
rotationCenterHintId: "hint-minutehand-rotation-center-offset"
|
|
rotation: 180 + minutes * 6
|
|
svgScale: clock.svgScale
|
|
}
|
|
|
|
Hand {
|
|
elementId: "SecondHandShadow"
|
|
rotationCenterHintId: "hint-secondhandshadow-rotation-center-offset"
|
|
horizontalRotationOffset: clock.horizontalShadowOffset
|
|
verticalRotationOffset: clock.verticalShadowOffset
|
|
rotation: 180 + seconds * 6
|
|
visible: showSecondsHand
|
|
svgScale: clock.svgScale
|
|
}
|
|
Hand {
|
|
elementId: "SecondHand"
|
|
rotationCenterHintId: "hint-secondhand-rotation-center-offset"
|
|
rotation: 180 + seconds * 6
|
|
visible: showSecondsHand
|
|
svgScale: clock.svgScale
|
|
}
|
|
|
|
PlasmaCore.SvgItem {
|
|
id: center
|
|
width: naturalSize.width * clock.svgScale
|
|
height: naturalSize.height * clock.svgScale
|
|
anchors.centerIn: clock
|
|
svg: clockSvg
|
|
elementId: "HandCenterScrew"
|
|
z: 1000
|
|
}
|
|
|
|
PlasmaCore.SvgItem {
|
|
anchors.fill: face
|
|
svg: clockSvg
|
|
elementId: "Glass"
|
|
width: naturalSize.width * clock.svgScale
|
|
height: naturalSize.height * clock.svgScale
|
|
}
|
|
}
|
|
|
|
PlasmaCore.FrameSvgItem {
|
|
id: timezoneBg
|
|
anchors {
|
|
horizontalCenter: parent.horizontalCenter
|
|
bottom: parent.bottom
|
|
bottomMargin: 10
|
|
}
|
|
imagePath: "widgets/background"
|
|
width: childrenRect.width + margins.right + margins.left
|
|
height: childrenRect.height + margins.top + margins.bottom
|
|
visible: showTimezone
|
|
PlasmaComponents.Label {
|
|
id: timezoneText
|
|
x: timezoneBg.margins.left
|
|
y: timezoneBg.margins.top
|
|
text: dataSource.data["Local"]["Timezone"]
|
|
}
|
|
}
|
|
}
|
|
Plasmoid.fullRepresentation: PlasmaCalendar.MonthView {
|
|
Layout.minimumWidth: PlasmaCore.Units.gridUnit * 20
|
|
Layout.minimumHeight: PlasmaCore.Units.gridUnit * 20
|
|
|
|
today: dataSource.data["Local"]["DateTime"]
|
|
}
|
|
|
|
}
|