Warning, /plasma/plasma-workspace/kcms/nightcolor/ui/DayNightView.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2022 Bharadwaj Raju <bharadwaj.raju777@protonmail.com> 0003 SPDX-FileCopyrightText: 2023 Ismael Asensio <isma.af@gmail.com> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 import QtQuick 0009 import QtQuick.Layouts 0010 import QtQuick.Controls as QQC2 0011 import org.kde.kirigami as Kirigami 0012 0013 ColumnLayout { 0014 id: root 0015 0016 required property int dayTransitionOn 0017 required property int dayTransitionOff 0018 required property int nightTransitionOn 0019 required property int nightTransitionOff 0020 0021 property bool alwaysOn: false 0022 property int dayTemperature: 6500 0023 property int nightTemperature: 4200 0024 0025 readonly property bool show24h: true // TODO: Get from user's prefernces 0026 readonly property bool singleColor: root.alwaysOn || !root.enabled 0027 0028 Rectangle { 0029 id: view 0030 0031 Layout.fillWidth: true 0032 Layout.preferredHeight: Kirigami.Units.gridUnit * 2 0033 // Align the edges with the center of the first and last labels 0034 Layout.leftMargin: axis.width / 50 - border.width 0035 Layout.rightMargin: Layout.leftMargin 0036 border.color: Qt.alpha(Kirigami.Theme.textColor, 0.2) 0037 radius: 3 0038 0039 gradient: root.singleColor ? null : grad 0040 // The color only get used when there's no gradient 0041 color: root.enabled ? grad.nightColor : Kirigami.Theme.backgroundColor 0042 0043 Gradient { 0044 id: grad 0045 orientation: Gradient.Horizontal 0046 0047 readonly property color dayColor: colorForTemp(root.dayTemperature) 0048 readonly property color nightColor: colorForTemp(root.nightTemperature) 0049 readonly property color edgeColor: (root.nightTransitionOn < root.dayTransitionOff) ? dayColor : nightColor 0050 0051 GradientStop { position: 0; color: grad.edgeColor } 0052 GradientStop { position: dayTransitionOn/1440; color: grad.nightColor } 0053 GradientStop { position: dayTransitionOff/1440; color: grad.dayColor } 0054 GradientStop { position: nightTransitionOn/1440; color: grad.dayColor } 0055 GradientStop { position: nightTransitionOff/1440; color: grad.nightColor } 0056 GradientStop { position: 1; color: grad.edgeColor } 0057 } 0058 0059 Repeater { 0060 model: (root.singleColor) ? [ { left: 0, right: 1440, isNight: true } ] : [ 0061 { left: 0, right: Math.min(root.dayTransitionOff, root.nightTransitionOn), isNight: root.dayTransitionOn < root.nightTransitionOn }, 0062 { left: root.dayTransitionOff, right: root.nightTransitionOn, isNight: root.dayTransitionOn > root.nightTransitionOn }, 0063 { left: Math.max(root.dayTransitionOff, root.nightTransitionOff), right: 1440, isNight: root.dayTransitionOff < root.nightTransitionOff }, 0064 ] 0065 0066 Kirigami.Icon { 0067 source: { 0068 if (!root.enabled) { 0069 return 'redshift-status-off' 0070 } 0071 if (modelData.isNight) { 0072 return nightTemperature == 6500 ? 'weather-clear-night-symbolic': 'redshift-status-on' 0073 } 0074 return dayTemperature == 6500 ? 'weather-clear-symbolic' : 'redshift-status-day' 0075 } 0076 width: Kirigami.Units.iconSizes.medium 0077 height: width 0078 x: (modelData.left + modelData.right)/2/1440 * parent.width - width/2 0079 y: (parent.height - height) / 2 0080 visible: Math.abs(modelData.right - modelData.left) > 2 * width 0081 // The view background is always light except when disabled 0082 color: root.enabled ? 'black' : Kirigami.Theme.textColor 0083 } 0084 } 0085 0086 Kirigami.Icon { 0087 x: Math.round(now.minutes/1440 * view.width - width/2) 0088 anchors.top: parent.bottom 0089 source: "draw-triangle4-symbolic" // Pointing-down triangle 0090 color: Kirigami.Theme.textColor 0091 width: 10 0092 height: 10 0093 0094 Timer { 0095 id: now 0096 property int minutes: 0 0097 interval: 60 0098 repeat: true 0099 running: true 0100 triggeredOnStart: true 0101 onTriggered: minutes = minutesForDate(new Date()) 0102 } 0103 } 0104 0105 HoverHandler { 0106 id: hover 0107 } 0108 0109 QQC2.ToolTip { 0110 readonly property string eveningChange: i18n("Color temperature begins changing to night time at %1 and is fully changed by %2", 0111 prettyTime(nightTransitionOn), prettyTime(nightTransitionOff)) 0112 0113 readonly property string morningChange: i18n("Color temperature begins changing to day time at %1 and is fully changed by %2", prettyTime(dayTransitionOn), 0114 prettyTime(dayTransitionOff)) 0115 0116 text: `${eveningChange}\n\n${morningChange}` 0117 visible: hover.hovered && !root.singleColor 0118 0119 function prettyTime(minutes) { 0120 const date = new Date() 0121 date.setHours(minutes / 60) 0122 date.setMinutes(minutes % 60) 0123 return date.toLocaleString(Qt.locale(), "h:mm"); 0124 } 0125 } 0126 } 0127 0128 RowLayout { 0129 id: axis 0130 Layout.fillWidth: true 0131 0132 Repeater { 0133 model: 25 0134 delegate: QQC2.Label { 0135 Layout.fillWidth: true 0136 Layout.preferredWidth: 10 // The actual value doesn't matter. It just makes the labels the same size 0137 Layout.alignment: Qt.AlignTop | Qt.AlignHCenter 0138 horizontalAlignment: Text.AlignHCenter 0139 text: { 0140 if (root.show24h) { 0141 return `${index % 24}` 0142 } 0143 if (index % 12 == 0) { 0144 return (index % 24 == 0) ? '12\nAM' : '12\nPM' 0145 } 0146 return `${index % 12}` 0147 } 0148 textFormat: Text.PlainText 0149 color: Kirigami.Theme.textColor 0150 } 0151 } 0152 } 0153 0154 function minutesForDate(date) { 0155 return date.getHours() * 60 + date.getMinutes() 0156 } 0157 0158 function isThemeDark() { 0159 const bg = Kirigami.Theme.backgroundColor; 0160 const gray = (bg.r + bg.g + bg.b) / 3; 0161 return (gray < 192); 0162 } 0163 0164 function colorForTemp(temp) { 0165 // from KWin colortemperature.h 0166 /** 0167 * Whitepoint values for temperatures at 100K intervals. 0168 * These will be interpolated for the actual temperature. 0169 * This table was provided by Ingo Thies, 2013. 0170 * See the following file for more information: 0171 * https://github.com/jonls/redshift/blob/master/README-colorramp 0172 */ 0173 const temp2RGB = [ 0174 [1.00000000, 0.18172716, 0.00000000], /* 1000K */ 0175 [1.00000000, 0.25503671, 0.00000000], /* 1100K */ 0176 [1.00000000, 0.30942099, 0.00000000], /* 1200K */ 0177 [1.00000000, 0.35357379, 0.00000000], /* ... */ 0178 [1.00000000, 0.39091524, 0.00000000], 0179 [1.00000000, 0.42322816, 0.00000000], 0180 [1.00000000, 0.45159884, 0.00000000], 0181 [1.00000000, 0.47675916, 0.00000000], 0182 [1.00000000, 0.49923747, 0.00000000], 0183 [1.00000000, 0.51943421, 0.00000000], 0184 [1.00000000, 0.54360078, 0.08679949], /* 2000K */ 0185 [1.00000000, 0.56618736, 0.14065513], 0186 [1.00000000, 0.58734976, 0.18362641], 0187 [1.00000000, 0.60724493, 0.22137978], 0188 [1.00000000, 0.62600248, 0.25591950], 0189 [1.00000000, 0.64373109, 0.28819679], 0190 [1.00000000, 0.66052319, 0.31873863], 0191 [1.00000000, 0.67645822, 0.34786758], 0192 [1.00000000, 0.69160518, 0.37579588], 0193 [1.00000000, 0.70602449, 0.40267128], 0194 [1.00000000, 0.71976951, 0.42860152], /* 3000K */ 0195 [1.00000000, 0.73288760, 0.45366838], 0196 [1.00000000, 0.74542112, 0.47793608], 0197 [1.00000000, 0.75740814, 0.50145662], 0198 [1.00000000, 0.76888303, 0.52427322], 0199 [1.00000000, 0.77987699, 0.54642268], 0200 [1.00000000, 0.79041843, 0.56793692], 0201 [1.00000000, 0.80053332, 0.58884417], 0202 [1.00000000, 0.81024551, 0.60916971], 0203 [1.00000000, 0.81957693, 0.62893653], 0204 [1.00000000, 0.82854786, 0.64816570], /* 4000K */ 0205 [1.00000000, 0.83717703, 0.66687674], 0206 [1.00000000, 0.84548188, 0.68508786], 0207 [1.00000000, 0.85347859, 0.70281616], 0208 [1.00000000, 0.86118227, 0.72007777], 0209 [1.00000000, 0.86860704, 0.73688797], /* 4500K */ 0210 [1.00000000, 0.87576611, 0.75326132], 0211 [1.00000000, 0.88267187, 0.76921169], 0212 [1.00000000, 0.88933596, 0.78475236], 0213 [1.00000000, 0.89576933, 0.79989606], 0214 [1.00000000, 0.90198230, 0.81465502], /* 5000K */ 0215 [1.00000000, 0.90963069, 0.82838210], 0216 [1.00000000, 0.91710889, 0.84190889], 0217 [1.00000000, 0.92441842, 0.85523742], 0218 [1.00000000, 0.93156127, 0.86836903], 0219 [1.00000000, 0.93853986, 0.88130458], 0220 [1.00000000, 0.94535695, 0.89404470], 0221 [1.00000000, 0.95201559, 0.90658983], 0222 [1.00000000, 0.95851906, 0.91894041], 0223 [1.00000000, 0.96487079, 0.93109690], 0224 [1.00000000, 0.97107439, 0.94305985], /* 6000K */ 0225 [1.00000000, 0.97713351, 0.95482993], 0226 [1.00000000, 0.98305189, 0.96640795], 0227 [1.00000000, 0.98883326, 0.97779486], 0228 [1.00000000, 0.99448139, 0.98899179], 0229 [1.00000000, 1.00000000, 1.00000000] /* 6500K */ 0230 ] 0231 var rgb = temp2RGB[(temp - 1000)/100]; 0232 var col = Qt.rgba(rgb[0], rgb[1], rgb[2], 1); 0233 if (isThemeDark() && col.hsvSaturation < 0.7) { 0234 col.hsvSaturation += 0.3; 0235 } 0236 return col; 0237 } 0238 }