forked from Shinonome/dots-hyprland
116 lines
4.3 KiB
QML
116 lines
4.3 KiB
QML
import qs
|
|
import qs.services
|
|
import qs.modules.common
|
|
import qs.modules.common.widgets
|
|
import Qt5Compat.GraphicalEffects
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import Quickshell
|
|
|
|
Item {
|
|
id: root
|
|
|
|
implicitHeight: contentColumn.implicitHeight
|
|
implicitWidth: contentColumn.implicitWidth
|
|
|
|
ColumnLayout {
|
|
id: contentColumn
|
|
anchors.fill: parent
|
|
spacing: 0
|
|
|
|
// The Pomodoro timer circle
|
|
CircularProgress {
|
|
Layout.alignment: Qt.AlignHCenter
|
|
lineWidth: 8
|
|
value: {
|
|
return TimerService.pomodoroSecondsLeft / TimerService.pomodoroLapDuration;
|
|
}
|
|
implicitSize: 200
|
|
enableAnimation: true
|
|
|
|
ColumnLayout {
|
|
anchors.centerIn: parent
|
|
spacing: 0
|
|
|
|
StyledText {
|
|
Layout.alignment: Qt.AlignHCenter
|
|
text: {
|
|
let minutes = Math.floor(TimerService.pomodoroSecondsLeft / 60).toString().padStart(2, '0');
|
|
let seconds = Math.floor(TimerService.pomodoroSecondsLeft % 60).toString().padStart(2, '0');
|
|
return `${minutes}:${seconds}`;
|
|
}
|
|
font.pixelSize: 40
|
|
color: Appearance.m3colors.m3onSurface
|
|
}
|
|
StyledText {
|
|
Layout.alignment: Qt.AlignHCenter
|
|
text: TimerService.pomodoroLongBreak ? Translation.tr("Long break") : TimerService.pomodoroBreak ? Translation.tr("Break") : Translation.tr("Focus")
|
|
font.pixelSize: Appearance.font.pixelSize.normal
|
|
color: Appearance.colors.colSubtext
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
radius: Appearance.rounding.full
|
|
color: Appearance.colors.colLayer2
|
|
|
|
anchors {
|
|
right: parent.right
|
|
bottom: parent.bottom
|
|
}
|
|
implicitWidth: 36
|
|
implicitHeight: implicitWidth
|
|
|
|
StyledText {
|
|
id: cycleText
|
|
anchors.centerIn: parent
|
|
color: Appearance.colors.colOnLayer2
|
|
text: TimerService.pomodoroCycle + 1
|
|
}
|
|
}
|
|
}
|
|
|
|
// The Start/Stop and Reset buttons
|
|
RowLayout {
|
|
Layout.alignment: Qt.AlignHCenter
|
|
spacing: 10
|
|
|
|
RippleButton {
|
|
contentItem: StyledText {
|
|
anchors.centerIn: parent
|
|
horizontalAlignment: Text.AlignHCenter
|
|
text: TimerService.pomodoroRunning ? Translation.tr("Pause") : (TimerService.pomodoroSecondsLeft === TimerService.focusTime) ? Translation.tr("Start") : Translation.tr("Resume")
|
|
color: TimerService.pomodoroRunning ? Appearance.colors.colOnSecondaryContainer : Appearance.colors.colOnPrimary
|
|
}
|
|
implicitHeight: 35
|
|
implicitWidth: 90
|
|
font.pixelSize: Appearance.font.pixelSize.larger
|
|
onClicked: TimerService.togglePomodoro()
|
|
colBackground: TimerService.pomodoroRunning ? Appearance.colors.colSecondaryContainer : Appearance.colors.colPrimary
|
|
colBackgroundHover: TimerService.pomodoroRunning ? Appearance.colors.colSecondaryContainer : Appearance.colors.colPrimary
|
|
}
|
|
|
|
RippleButton {
|
|
implicitHeight: 35
|
|
implicitWidth: 90
|
|
|
|
onClicked: TimerService.resetPomodoro()
|
|
enabled: (TimerService.pomodoroSecondsLeft < TimerService.pomodoroLapDuration) || TimerService.pomodoroCycle > 0 || TimerService.pomodoroBreak
|
|
|
|
font.pixelSize: Appearance.font.pixelSize.larger
|
|
colBackground: Appearance.colors.colErrorContainer
|
|
colBackgroundHover: Appearance.colors.colErrorContainerHover
|
|
colRipple: Appearance.colors.colErrorContainerActive
|
|
|
|
contentItem: StyledText {
|
|
anchors.centerIn: parent
|
|
horizontalAlignment: Text.AlignHCenter
|
|
text: Translation.tr("Reset")
|
|
color: Appearance.colors.colOnErrorContainer
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|