nova-shell/shell/applets/MemoryApplet.qml

178 lines
5 KiB
QML

import QtQuick
import "../services" as S
import NovaStats as NS
Column {
id: root
required property int percent
required property real usedGb
required property real totalGb
required property real availGb
required property real cachedGb
required property real buffersGb
required property var processes
required property color accentColor
property bool active: true
function _fmt(gb) {
return gb >= 10 ? gb.toFixed(1) + "G" : gb.toFixed(2) + "G";
}
// Usage bar
Item {
width: root.width
height: 14
Item {
id: memBar
anchors.left: parent.left
anchors.leftMargin: 12
anchors.right: parent.right
anchors.rightMargin: 12
anchors.verticalCenter: parent.verticalCenter
height: 6
Rectangle {
anchors.fill: parent
color: NS.ThemeService.base02
radius: 3
}
// Cached (base0D, behind used)
Rectangle {
width: parent.width * Math.min(1, (root.usedGb + root.cachedGb) / Math.max(root.totalGb, 0.001))
height: parent.height
color: NS.ThemeService.base0D
opacity: 0.4
radius: 3
Behavior on width {
enabled: root.active
NumberAnimation {
duration: 200
}
}
}
// Used (accentColor, on top)
Rectangle {
width: parent.width * Math.min(1, root.usedGb / Math.max(root.totalGb, 0.001))
height: parent.height
color: root.accentColor
radius: 3
Behavior on width {
enabled: root.active
NumberAnimation {
duration: 200
}
}
}
}
}
// Breakdown rows
InfoRow {
label: "Used"
value: root._fmt(root.usedGb)
}
InfoRow {
label: "Cached"
value: root._fmt(root.cachedGb)
}
InfoRow {
label: "Available"
value: root._fmt(root.availGb)
}
InfoRow {
label: "Total"
value: root._fmt(root.totalGb)
}
// Memory history sparkline
SparklineCanvas {
anchors.left: parent.left
anchors.leftMargin: 12
anchors.right: parent.right
anchors.rightMargin: 12
height: 32
history: S.SystemStats.memHistory
strokeColor: root.accentColor
colorAt: v => S.ThemeUtil.loadColor(v)
active: root.active
}
// Process list - hidden on lock screen (exposes running process names)
Column {
visible: !S.LockService.locked
width: root.width
Separator {}
Item {
width: parent.width
height: 18
Text {
anchors.left: parent.left
anchors.leftMargin: 12
anchors.verticalCenter: parent.verticalCenter
text: "PROCESS"
color: NS.ThemeService.base03
font.pixelSize: NS.ThemeService.fontSize - 3
font.family: NS.ThemeService.fontFamily
font.letterSpacing: 1
}
Text {
anchors.right: parent.right
anchors.rightMargin: 12
anchors.verticalCenter: parent.verticalCenter
text: "MEM"
color: NS.ThemeService.base03
font.pixelSize: NS.ThemeService.fontSize - 3
font.family: NS.ThemeService.fontFamily
font.letterSpacing: 1
}
}
Repeater {
model: root.processes
delegate: Item {
required property var modelData
width: root.width
height: 20
Text {
anchors.left: parent.left
anchors.leftMargin: 12
anchors.verticalCenter: parent.verticalCenter
text: modelData.cmd
color: NS.ThemeService.base05
font.pixelSize: NS.ThemeService.fontSize - 2
font.family: NS.ThemeService.fontFamily
elide: Text.ElideRight
width: parent.width - 80
}
Text {
anchors.right: parent.right
anchors.rightMargin: 12
anchors.verticalCenter: parent.verticalCenter
text: modelData.mem.toFixed(1) + "%"
color: NS.ThemeService.base04
font.pixelSize: NS.ThemeService.fontSize - 2
font.family: NS.ThemeService.fontFamily
width: 36
horizontalAlignment: Text.AlignRight
}
}
}
Item {
width: 1
height: 4
}
}
}