mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-14 23:34:01 -04:00
131 lines
4.0 KiB
QML
131 lines
4.0 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import qs.Common
|
|
import qs.DCommon.Widgets
|
|
import qs.Modules.Plugins
|
|
import qs.Modules.DDash
|
|
|
|
DashCardComponent {
|
|
id: root
|
|
|
|
readonly property string period: options.period ?? "day"
|
|
readonly property var span: spanFor(clock.date, period)
|
|
readonly property real progress: Math.max(0, Math.min(1, (clock.date - span.start) / (span.end - span.start)))
|
|
readonly property bool wide: width >= DashMetrics.gridRowUnit * 2
|
|
readonly property bool tall: height >= DashMetrics.gridRowUnit * 2
|
|
readonly property string periodText: {
|
|
switch (period) {
|
|
case "week":
|
|
return I18n.trFor("dashCardExample", "This week");
|
|
case "month":
|
|
return I18n.trFor("dashCardExample", "This month");
|
|
case "year":
|
|
return I18n.trFor("dashCardExample", "This year");
|
|
}
|
|
return I18n.trFor("dashCardExample", "Today");
|
|
}
|
|
readonly property string remainingText: {
|
|
const minutes = Math.ceil((span.end - clock.date) / 60000);
|
|
if (minutes < 60)
|
|
return I18n.trFor("dashCardExample", "%1 min left").arg(minutes);
|
|
const hours = Math.floor(minutes / 60);
|
|
if (hours < 48)
|
|
return I18n.trFor("dashCardExample", "%1 h left").arg(hours);
|
|
return I18n.trFor("dashCardExample", "%1 days left").arg(Math.floor(hours / 24));
|
|
}
|
|
|
|
tone: options.tone ?? ""
|
|
|
|
function weekStart() {
|
|
const setting = SettingsData.firstDayOfWeek;
|
|
return (setting >= 0 && setting < 7 ? setting : Qt.locale().firstDayOfWeek) % 7;
|
|
}
|
|
|
|
function spanFor(now, period) {
|
|
const year = now.getFullYear();
|
|
const month = now.getMonth();
|
|
const day = now.getDate();
|
|
switch (period) {
|
|
case "week":
|
|
{
|
|
const first = day - (now.getDay() - weekStart() + 7) % 7;
|
|
return {
|
|
start: new Date(year, month, first),
|
|
end: new Date(year, month, first + 7)
|
|
};
|
|
}
|
|
case "month":
|
|
return {
|
|
start: new Date(year, month, 1),
|
|
end: new Date(year, month + 1, 1)
|
|
};
|
|
case "year":
|
|
return {
|
|
start: new Date(year, 0, 1),
|
|
end: new Date(year + 1, 0, 1)
|
|
};
|
|
}
|
|
return {
|
|
start: new Date(year, month, day),
|
|
end: new Date(year, month, day + 1)
|
|
};
|
|
}
|
|
|
|
SystemClock {
|
|
id: clock
|
|
enabled: root.live
|
|
precision: SystemClock.Minutes
|
|
}
|
|
|
|
StyledText {
|
|
id: label
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
text: root.periodText
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
font.weight: Theme.fontWeightMedium
|
|
color: root.mutedColor
|
|
elide: Text.ElideRight
|
|
}
|
|
|
|
Column {
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
NumericText {
|
|
isMonospace: false
|
|
text: Math.floor(root.progress * 100) + "%"
|
|
font.pixelSize: root.tall ? Theme.fontSizeDisplay : root.wide ? Theme.fontSizeXXLarge : Theme.fontSizeXLarge
|
|
font.weight: Theme.fontWeightMedium
|
|
color: root.accentColor
|
|
}
|
|
|
|
StyledText {
|
|
width: parent.width
|
|
visible: root.options.remaining !== false && (root.wide || root.tall)
|
|
text: root.remainingText
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: root.mutedColor
|
|
elide: Text.ElideRight
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.bottom: parent.bottom
|
|
height: Theme.spacingS
|
|
radius: height / 2
|
|
color: root.chipColor
|
|
|
|
Rectangle {
|
|
width: Math.max(height, parent.width * root.progress)
|
|
height: parent.height
|
|
radius: height / 2
|
|
color: root.accentColor
|
|
}
|
|
}
|
|
}
|