Warning, /plasma/kdeplasma-addons/applets/timer/package/contents/ui/CompactRepresentation.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2022 Fushan Wen <qydwhotmail@gmail.com>
0003 *
0004 * SPDX-License-Identifier: GPL-3.0-or-later
0005 */
0006
0007 import QtQuick
0008 import QtQuick.Layouts 1.15
0009
0010 import org.kde.kirigami 2.20 as Kirigami
0011 import org.kde.plasma.components 3.0 as PlasmaComponents3
0012 import org.kde.plasma.plasmoid 2.0
0013
0014 import org.kde.plasma.private.timer 0.1 as TimerPlasmoid
0015
0016 Item {
0017 id: compactRepresentation
0018
0019 Layout.minimumHeight: root.inPanel ? Layout.preferredHeight : -1
0020
0021 Layout.preferredWidth: grid.width
0022 Layout.preferredHeight: grid.height
0023
0024 enum LayoutType {
0025 HorizontalPanel,
0026 VerticalPanel,
0027 HorizontalDesktop,
0028 VerticalDesktop,
0029 IconOnly
0030 }
0031
0032 property int layoutForm
0033
0034 Binding on layoutForm {
0035 delayed: true
0036 value: {
0037 if (root.inPanel) {
0038 return root.isVertical ? CompactRepresentation.LayoutType.VerticalPanel : CompactRepresentation.LayoutType.HorizontalPanel;
0039 }
0040 if (compactRepresentation.parent.width - iconItem.Layout.preferredWidth >= remainingTimeLabel.contentWidth) {
0041 return CompactRepresentation.LayoutType.HorizontalDesktop;
0042 }
0043 if (compactRepresentation.parent.height - iconItem.Layout.preferredHeight >= remainingTimeLabel.contentHeight) {
0044 return CompactRepresentation.LayoutType.VerticalDesktop;
0045 }
0046 return CompactRepresentation.LayoutType.IconOnly;
0047 }
0048 }
0049
0050 Keys.onUpPressed: adjustSecond(10);
0051 Keys.onDownPressed: adjustSecond(-10);
0052
0053 function adjustSecond(value) {
0054 while (value >= 15 && root.seconds + 1 < 24*60*60) {
0055 root.seconds += 1;
0056 value -= 15;
0057 }
0058 while (value <= -15 && root.seconds - 1 >= 0) {
0059 root.seconds -= 1;
0060 value += 15;
0061 }
0062 return value;
0063 }
0064
0065 WheelHandler {
0066 acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
0067 enabled: !root.running
0068 onWheel: {
0069 event.accepted = true;
0070 rotation = compactRepresentation.adjustSecond(rotation);
0071 }
0072 }
0073
0074 GridLayout {
0075 id: grid
0076
0077 width: {
0078 switch (compactRepresentation.layoutForm) {
0079 case CompactRepresentation.LayoutType.HorizontalPanel:
0080 case CompactRepresentation.LayoutType.HorizontalDesktop:
0081 return implicitWidth;
0082 case CompactRepresentation.LayoutType.VerticalPanel:
0083 case CompactRepresentation.LayoutType.VerticalDesktop:
0084 return compactRepresentation.parent.width;
0085 case CompactRepresentation.LayoutType.IconOnly:
0086 return iconItem.Layout.preferredWidth;
0087 }
0088 }
0089 height: {
0090 switch (compactRepresentation.layoutForm) {
0091 case CompactRepresentation.LayoutType.HorizontalPanel:
0092 case CompactRepresentation.LayoutType.HorizontalDesktop:
0093 case CompactRepresentation.LayoutType.VerticalDesktop:
0094 return compactRepresentation.parent.height;
0095 case CompactRepresentation.LayoutType.VerticalPanel:
0096 return implicitHeight;
0097 case CompactRepresentation.LayoutType.IconOnly:
0098 return iconItem.Layout.preferredHeight;
0099 }
0100 }
0101
0102 rowSpacing: 0
0103 columnSpacing: rowSpacing
0104 flow: {
0105 switch (compactRepresentation.layoutForm) {
0106 case CompactRepresentation.LayoutType.VerticalPanel:
0107 case CompactRepresentation.LayoutType.VerticalDesktop:
0108 return GridLayout.TopToBottom;
0109 default:
0110 return GridLayout.LeftToRight;
0111 }
0112 }
0113
0114 Item {
0115 id: spacerItem
0116 Layout.fillHeight: true
0117 visible: layoutForm === CompactRepresentation.LayoutType.VerticalDesktop
0118 }
0119
0120 PlasmaComponents3.ToolButton {
0121 id: iconItem
0122
0123 Layout.alignment: Qt.AlignVCenter
0124 Layout.preferredWidth: Math.min(compactRepresentation.parent.width, compactRepresentation.parent.height)
0125 Layout.preferredHeight: Layout.preferredWidth
0126 visible: root.showTimerToggle
0127
0128 display: PlasmaComponents3.AbstractButton.IconOnly
0129 icon.name: {
0130 if (root.running) {
0131 return "chronometer-pause";
0132 }
0133 return root.seconds > 0 ? "chronometer-start" : "chronometer";
0134 }
0135 text: root.running ? i18nc("@action:button", "Pause Timer") : i18nc("@action:button", "Start Timer")
0136
0137 onClicked: {
0138 if (root.seconds === 0) {
0139 root.expanded = !root.expanded;
0140 } else {
0141 root.toggleTimer();
0142 }
0143 }
0144 }
0145
0146 ColumnLayout {
0147 Layout.alignment: Qt.AlignVCenter
0148 Layout.fillWidth: layoutForm === CompactRepresentation.LayoutType.VerticalPanel || layoutForm === CompactRepresentation.LayoutType.VerticalDesktop
0149 Layout.maximumWidth: {
0150 switch (layoutForm) {
0151 case CompactRepresentation.LayoutType.HorizontalPanel:
0152 return Kirigami.Units.gridUnit * 10;
0153 case CompactRepresentation.LayoutType.HorizontalDesktop:
0154 return compactRepresentation.parent.width - iconItem.Layout.preferredWidth;
0155 default:
0156 return -1;
0157 }
0158 }
0159 Layout.maximumHeight: textMetrics.height * 2
0160 visible: compactRepresentation.layoutForm !== CompactRepresentation.LayoutType.IconOnly ? 1 : 0
0161
0162 spacing: parent.columnSpacing
0163
0164 TapHandler {
0165 acceptedButtons: Qt.LeftButton
0166 onTapped: root.expanded = !root.expanded
0167 }
0168
0169 PlasmaComponents3.Label {
0170 id: titleLabel
0171
0172 Layout.fillWidth: true
0173 Layout.fillHeight: true
0174 visible: root.showTitle && root.title !== ""
0175
0176 elide: Text.ElideRight
0177 font.bold: remainingTimeLabel.font.bold
0178 fontSizeMode: remainingTimeLabel.fontSizeMode
0179 horizontalAlignment: remainingTimeLabel.horizontalAlignment
0180 minimumPointSize: remainingTimeLabel.minimumPointSize
0181 text: root.title
0182 textFormat: Text.PlainText
0183 }
0184
0185 PlasmaComponents3.Label {
0186 id: remainingTimeLabel
0187
0188 Layout.fillWidth: parent.Layout.fillWidth
0189 Layout.fillHeight: true
0190 Layout.maximumWidth: Layout.fillWidth ? -1 : textMetrics.width
0191 Layout.minimumWidth: Layout.maximumWidth
0192 visible: root.showRemainingTime
0193
0194 TextMetrics {
0195 id: textMetrics
0196 text: {
0197 if (root.isVertical) {
0198 return i18ncp("remaining time", "%1s", "%1s", root.seconds);
0199 }
0200 // make it not jump around: reserve space for one extra digit than reasonable
0201 return root.showSeconds ? "44:44:444" : "44:444";
0202 }
0203 font: remainingTimeLabel.font
0204 }
0205
0206 activeFocusOnTab: true
0207 elide: root.inPanel ? Text.ElideRight : Text.ElideNone
0208 font.bold: root.alertMode
0209 fontSizeMode: layoutForm === CompactRepresentation.LayoutType.HorizontalPanel || layoutForm === CompactRepresentation.LayoutType.HorizontalDesktop ? Text.VerticalFit : Text.HorizontalFit
0210 horizontalAlignment: layoutForm === CompactRepresentation.LayoutType.HorizontalPanel || layoutForm === CompactRepresentation.LayoutType.HorizontalDesktop ? Text.AlignJustify : Text.AlignHCenter
0211 minimumPointSize: Kirigami.Theme.smallFont.pointSize
0212 verticalAlignment: Text.AlignVCenter
0213
0214 text: {
0215 if (root.isVertical) {
0216 return i18ncp("remaining time", "%1s", "%1s", root.seconds);
0217 }
0218
0219 return root.showSeconds ? TimerPlasmoid.Timer.secondsToString(root.seconds, "hh:mm:ss") : TimerPlasmoid.Timer.secondsToString(root.seconds, "hh:mm");
0220 }
0221 textFormat: Text.PlainText
0222
0223 Accessible.name: Plasmoid.toolTipMainText
0224 Accessible.description: Plasmoid.toolTipSubText
0225 Accessible.role: Accessible.Button
0226 }
0227
0228 PlasmaComponents3.ProgressBar {
0229 id: remainingTimeProgressBar
0230
0231 Layout.fillWidth: true
0232 Layout.fillHeight: true
0233 Layout.maximumWidth: (parent.visibleChildren.length > 1) ? Math.max(titleLabel.width, remainingTimeLabel.width) : -1
0234 Layout.minimumWidth: Layout.maximumWidth
0235 visible: root.showProgressBar
0236
0237 from: plasmoid.configuration.seconds
0238 to: 0
0239 value: root.seconds
0240 }
0241 }
0242
0243 Item {
0244 Layout.fillHeight: true
0245 visible: spacerItem.visible
0246 }
0247 }
0248 }