Warning, /plasma/plasma-workspace/applets/digital-clock/package/contents/ui/main.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2013 Heena Mahour <heena393@gmail.com>
0003     SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 import QtQuick 2.15
0008 import QtQuick.Layouts 1.1
0009 import org.kde.plasma.plasmoid 2.0
0010 import org.kde.plasma.core as PlasmaCore
0011 import org.kde.plasma.plasma5support 2.0 as P5Support
0012 import org.kde.plasma.private.digitalclock 1.0
0013 import org.kde.kquickcontrolsaddons 2.0
0014 import org.kde.kirigami 2.20 as Kirigami
0015 
0016 import org.kde.kcmutils // KCMLauncher
0017 import org.kde.config // KAuthorized
0018 
0019 PlasmoidItem {
0020     id: root
0021 
0022     width: Kirigami.Units.gridUnit * 10
0023     height: Kirigami.Units.gridUnit * 4
0024     property string dateFormatString: setDateFormatString()
0025     Plasmoid.backgroundHints: PlasmaCore.Types.ShadowBackground | PlasmaCore.Types.ConfigurableBackground
0026     property date tzDate: {
0027         const data = dataSource.data[Plasmoid.configuration.lastSelectedTimezone];
0028         if (data === undefined) {
0029             return new Date();
0030         }
0031         // get the time for the given timezone from the dataengine
0032         const now = data["DateTime"];
0033         // get current UTC time
0034         const msUTC = now.getTime() + (now.getTimezoneOffset() * 60000);
0035         // add the dataengine TZ offset to it
0036         return new Date(msUTC + (data["Offset"] * 1000));
0037     }
0038 
0039     function initTimezones() {
0040         const tz = []
0041         if (Plasmoid.configuration.selectedTimeZones.indexOf("Local") === -1) {
0042             tz.push("Local");
0043         }
0044         root.allTimezones = tz.concat(Plasmoid.configuration.selectedTimeZones);
0045     }
0046 
0047     function timeForZone(zone, showSecondsForZone) {
0048         if (!compactRepresentationItem) {
0049             return "";
0050         }
0051 
0052         // get the time for the given timezone from the dataengine
0053         const now = dataSource.data[zone]["DateTime"];
0054         // get current UTC time
0055         const msUTC = now.getTime() + (now.getTimezoneOffset() * 60000);
0056         // add the dataengine TZ offset to it
0057         const dateTime = new Date(msUTC + (dataSource.data[zone]["Offset"] * 1000));
0058 
0059         let formattedTime;
0060         if (showSecondsForZone) {
0061             formattedTime = Qt.formatTime(dateTime, compactRepresentationItem.timeFormatWithSeconds);
0062         } else {
0063             formattedTime = Qt.formatTime(dateTime, compactRepresentationItem.timeFormat);
0064         }
0065 
0066         if (dateTime.getDay() !== dataSource.data["Local"]["DateTime"].getDay()) {
0067             formattedTime += " (" + Qt.formatDate(dateTime, compactRepresentationItem.dateFormat) + ")";
0068         }
0069 
0070         return formattedTime;
0071     }
0072 
0073     function nameForZone(zone) {
0074         // add the timezone string to the clock
0075         if (Plasmoid.configuration.displayTimezoneAsCode) {
0076             return dataSource.data[zone]["Timezone Abbreviation"];
0077         } else {
0078             return TimezonesI18n.i18nCity(dataSource.data[zone]["Timezone"]);
0079         }
0080     }
0081 
0082     preferredRepresentation: compactRepresentation
0083     compactRepresentation: DigitalClock {
0084         activeFocusOnTab: true
0085         hoverEnabled: true
0086 
0087         Accessible.name: tooltipLoader.item.Accessible.name
0088         Accessible.description: tooltipLoader.item.Accessible.description
0089     }
0090     fullRepresentation: CalendarView { }
0091 
0092     toolTipItem: Loader {
0093         id: tooltipLoader
0094 
0095         Layout.minimumWidth: item ? item.implicitWidth : 0
0096         Layout.maximumWidth: item ? item.implicitWidth : 0
0097         Layout.minimumHeight: item ? item.implicitHeight : 0
0098         Layout.maximumHeight: item ? item.implicitHeight : 0
0099 
0100         source: Qt.resolvedUrl("Tooltip.qml")
0101     }
0102 
0103     //We need Local to be *always* present, even if not disaplayed as
0104     //it's used for formatting in ToolTip.dateTimeChanged()
0105     property var allTimezones
0106     Connections {
0107         target: Plasmoid.configuration
0108         function onSelectedTimeZonesChanged() { root.initTimezones(); }
0109     }
0110 
0111     Binding {
0112         target: root
0113         property: "hideOnWindowDeactivate"
0114         value: !Plasmoid.configuration.pin
0115         restoreMode: Binding.RestoreBinding
0116     }
0117 
0118     P5Support.DataSource {
0119         id: dataSource
0120         engine: "time"
0121         connectedSources: allTimezones
0122         interval: intervalAlignment === P5Support.Types.NoAlignment ? 1000 : 60000
0123         intervalAlignment: {
0124             if (Plasmoid.configuration.showSeconds === 2
0125                 || (Plasmoid.configuration.showSeconds === 1
0126                     && compactRepresentationItem
0127                     && compactRepresentationItem.containsMouse)) {
0128                 return P5Support.Types.NoAlignment;
0129             } else {
0130                 return P5Support.Types.AlignToMinute;
0131             }
0132         }
0133     }
0134 
0135     function setDateFormatString() {
0136         // remove "dddd" from the locale format string
0137         // /all/ locales in LongFormat have "dddd" either
0138         // at the beginning or at the end. so we just
0139         // remove it + the delimiter and space
0140         let format = Qt.locale().dateFormat(Locale.LongFormat);
0141         format = format.replace(/(^dddd.?\s)|(,?\sdddd$)/, "");
0142         return format;
0143     }
0144 
0145     Plasmoid.contextualActions: [
0146         PlasmaCore.Action {
0147             id: clipboardAction
0148             text: i18n("Copy to Clipboard")
0149             icon.name: "edit-copy"
0150         },
0151         PlasmaCore.Action {
0152             text: i18n("Adjust Date and Time…")
0153             icon.name: "clock"
0154             visible: KAuthorized.authorize("kcm_clock")
0155             onTriggered: KCMLauncher.openSystemSettings("kcm_clock")
0156         },
0157         PlasmaCore.Action {
0158             text: i18n("Set Time Format…")
0159             icon.name: "gnumeric-format-thousand-separator"
0160             visible: KAuthorized.authorizeControlModule("kcm_regionandlang")
0161             onTriggered: KCMLauncher.openSystemSettings("kcm_regionandlang")
0162         }
0163     ]
0164 
0165     Component.onCompleted: {
0166         ClipboardMenu.setupMenu(clipboardAction);
0167 
0168         root.initTimezones();
0169     }
0170 }