lux-shell/modules/pomodoro/Pomodoro.qml
2025-09-17 09:47:32 -04:00

107 lines
3 KiB
QML

pragma ComponentBehavior: Bound
import qs.components
import qs.config
import qs.services
import qs.widgets
import QtQuick
import QtQuick.Layouts
import Quickshell.Widgets
StyledPanelWindow {
id: root
name: "pomodoro"
visible: Visibility.pomodoro
implicitWidth: rect.width
implicitHeight: rect.height
onFocusedChanged: {
Visibility.pomodoro = focused;
}
WrapperItem {
id: rect
leftMargin: 48
rightMargin: 48
topMargin: 24
bottomMargin: 24
ColumnLayout {
spacing: 22
StyledText {
Layout.alignment: Qt.AlignHCenter
text: "Pomodoro"
font.pixelSize: 22
}
Item {
implicitWidth: circle.width
implicitHeight: circle.height
Circle {
id: circle
radius: 150
borderColor: Styling.theme.base100
strokeColor: PomodoroService.state == "timer" ? Styling.theme.primary : Styling.theme.warning
strokeWidth: 12
fillColor: button.hovered ? Styling.theme.primary : "transparent"
percentage: (PomodoroService.state == "timer" ? (PomodoroService.initialTime - PomodoroService.remainingTime) : PomodoroService.remainingTime) / PomodoroService.initialTime % 1
}
StyledIconButton {
id: button
anchors.centerIn: circle
radius: 9999
focus: root.visible
text: PomodoroService.running ? Styling.lucide.icons.square : Styling.lucide.icons.play
font.pixelSize: 48
background: Item {}
onClicked: {
PomodoroService.toggle();
}
Keys.onSpacePressed: event => {
event.accepted = true;
PomodoroService.toggle();
}
Keys.onEscapePressed: event => {
event.accepted = true;
Visibility.pomodoro = false;
}
Keys.onTabPressed: event => {
event.accepted = true;
PomodoroService.reset();
}
}
}
StyledText {
Layout.alignment: Qt.AlignHCenter
text: {
const date = new Date(PomodoroService.remainingTime);
return `${date.getMinutes().toString().padStart(2, "0")}:${(date.getSeconds() % 3600).toString().padStart(2, "0")}`;
}
font.pixelSize: 16
}
StyledButton {
Layout.alignment: Qt.AlignHCenter
text: "Reset"
onClicked: {
PomodoroService.reset();
}
}
}
}
}