Merge pull request #1607 from thmoee/feat/diskdetails

feat(widget): display disk space in systemMonitor Widget
This commit is contained in:
Lemmy
2026-02-02 12:17:37 -05:00
committed by GitHub
24 changed files with 199 additions and 56 deletions
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Swap-Speichernutzung anzeigen.",
"swap-usage-label": "Swap-Auslastung",
"use-monospace-font-description": "Verwende eine Monospace-Schriftart für eine konsistente Zeichenbreite.",
"use-monospace-font-label": "Schriftart mit fester Breite"
"use-monospace-font-label": "Schriftart mit fester Breite",
"storage-as-percentage-label": "Festplatte in Prozent",
"storage-as-percentage-description": "Zeige den Speicherplatz als Prozentsatz statt als absolute Werte an.",
"storage-available-label": "Verfügbarer Speicherplatz",
"storage-available-description": "Zeigt an, wie viel Speicherplatz verfügbar ist, anstatt wie viel belegt ist."
},
"taskbar": {
"colorize-icons-description": "Theme-Farben auf Taskbar-Symbole anwenden.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Kritische Farbe",
"custom-highlight-colors-title-label": "Benutzerdefinierte Hervorhebungsfarben",
"disk-section-label": "Festplattennutzung",
"disk-available-label": "Festplattenspeicher verfügbar",
"enable-dgpu-monitoring-description": "Warnung: Dies aktiviert Ihre dedizierte GPU (NVIDIA/AMD), was die Akkulaufzeit von Laptops mit Hybridgrafik erheblich beeinträchtigen kann.",
"enable-dgpu-monitoring-label": "Dedizierte GPU-Überwachung aktivieren",
"external-monitor-description": "Geben Sie den Befehl oder Anwendungspfad ein, um die externe Systemmonitor-Anwendung zu starten.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Show swap memory usage.",
"swap-usage-label": "Swap usage",
"use-monospace-font-description": "Use monospace font for consistent character width.",
"use-monospace-font-label": "Monospace font"
"use-monospace-font-label": "Monospace font",
"storage-as-percentage-label": "Disk as percentage",
"storage-as-percentage-description": "Show disk space as percentage instead of absolute values.",
"storage-available-label": "Disk space available",
"storage-available-description": "Shows how much disk space is available instead of how much is used."
},
"taskbar": {
"colorize-icons-description": "Apply theme colors to taskbar icons.",
@@ -1351,6 +1355,7 @@
"critical-color-label": "Critical color",
"custom-highlight-colors-title-label": "Custom highlight colors",
"disk-section-label": "Disk usage",
"disk-available-label": "Disk available",
"enable-dgpu-monitoring-description": "Warning: This will wake up your discrete GPU (NVIDIA/AMD), which may significantly impact battery life on laptops with hybrid graphics.",
"enable-dgpu-monitoring-label": "Enable discrete GPU monitoring",
"external-monitor-description": "Enter the command or application path to launch when activating the external system monitor application.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Mostrar el uso de la memoria swap.",
"swap-usage-label": "Uso de swap",
"use-monospace-font-description": "Utilice fuente monoespaciada para un ancho de carácter consistente.",
"use-monospace-font-label": "Fuente monoespaciada"
"use-monospace-font-label": "Fuente monoespaciada",
"storage-as-percentage-label": "Disco como porcentaje",
"storage-as-percentage-description": "Mostrar el espacio en disco como porcentaje en lugar de valores absolutos.",
"storage-available-label": "Espacio disponible en disco",
"storage-available-description": "Muestra cuánto espacio en disco hay disponible en lugar de cuánto se está utilizando."
},
"taskbar": {
"colorize-icons-description": "Aplicar colores del tema a los iconos de la barra de tareas.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Color crítico",
"custom-highlight-colors-title-label": "Colores de resaltado personalizados",
"disk-section-label": "Uso de disco",
"disk-available-label": "Disco disponible",
"enable-dgpu-monitoring-description": "Advertencia: Esto activará tu GPU dedicada (NVIDIA/AMD), lo que podría afectar significativamente la duración de la batería en portátiles con gráficos híbridos.",
"enable-dgpu-monitoring-label": "Habilitar la monitorización de la GPU dedicada",
"external-monitor-description": "Ingrese el comando o ruta de la aplicación para ejecutar al activar la aplicación externa del monitor del sistema.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Afficher l'utilisation de la mémoire swap.",
"swap-usage-label": "Utilisation du swap",
"use-monospace-font-description": "Utilisez une police de caractères à chasse fixe pour une largeur de caractère uniforme.",
"use-monospace-font-label": "Police à chasse fixe"
"use-monospace-font-label": "Police à chasse fixe",
"storage-as-percentage-label": "Disque en pourcentage",
"storage-as-percentage-description": "Afficher l'espace disque en pourcentage plutôt qu'en valeurs absolues.",
"storage-available-label": "Espace disque disponible",
"storage-available-description": "Affiche l'espace disque disponible plutôt que l'espace utilisé."
},
"taskbar": {
"colorize-icons-description": "Appliquer les couleurs du thème aux icônes de la barre des tâches.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Couleur critique",
"custom-highlight-colors-title-label": "Couleurs de surbrillance personnalisées",
"disk-section-label": "Utilisation disque",
"disk-available-label": "Disque disponible",
"enable-dgpu-monitoring-description": "Attention : Ceci va activer votre GPU dédié (NVIDIA/AMD), ce qui peut avoir un impact significatif sur l'autonomie de la batterie des ordinateurs portables dotés de cartes graphiques hybrides.",
"enable-dgpu-monitoring-label": "Activer la surveillance du GPU dédié",
"external-monitor-description": "Entrez la commande ou le chemin de l'application à lancer lors de l'activation de l'application externe de surveillance du système.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Cserehely memória használatának megjelenítése.",
"swap-usage-label": "Cserehely használat",
"use-monospace-font-description": "Használjon monospace betűtípust az egységes karakter-szélességhez.",
"use-monospace-font-label": "Monospace betűtípus"
"use-monospace-font-label": "Monospace betűtípus",
"storage-as-percentage-label": "Lemez százalékban kifejezve",
"storage-as-percentage-description": "A lemezterületet százalékban jeleníti meg, nem abszolút értékekben.",
"storage-available-label": "Rendelkezésre álló lemezterület",
"storage-available-description": "Megmutatja, hogy mennyi lemezterület áll rendelkezésre, ahelyett, hogy mennyi van használatban."
},
"taskbar": {
"colorize-icons-description": "Témaszínek alkalmazása a tálca ikonjaira.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Kritikus szín",
"custom-highlight-colors-title-label": "Egyéni kiemelőszínek",
"disk-section-label": "Lemezhasználat",
"disk-available-label": "Lemez rendelkezésre áll",
"enable-dgpu-monitoring-description": "Figyelem: Ez felébreszti a dedikált GPU-t (NVIDIA/AMD), ami jelentősen befolyásolhatja az akkumulátor élettartamát a hibrid grafikával rendelkező laptopokon.",
"enable-dgpu-monitoring-label": "Dedikált GPU figyelés engedélyezése",
"external-monitor-description": "Adja meg a parancsot vagy alkalmazás elérési útját a külső rendszermonitor alkalmazás indításához.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "スワップメモリの使用状況を表示します。",
"swap-usage-label": "スワップ使用量",
"use-monospace-font-description": "タイプライター体で翻訳します。",
"use-monospace-font-label": "等幅フォント"
"use-monospace-font-label": "等幅フォント",
"storage-as-percentage-label": "ディスク使用率(パーセンテージ)",
"storage-as-percentage-description": "ディスク容量を絶対値ではなくパーセンテージで表示する。",
"storage-available-label": "利用可能なディスク容量",
"storage-available-description": "使用済みディスク容量ではなく、空きディスク容量を表示します。"
},
"taskbar": {
"colorize-icons-description": "タスクバーのアイコンにテーマカラーを適用します。",
@@ -1350,6 +1354,7 @@
"critical-color-label": "危険時の色",
"custom-highlight-colors-title-label": "カスタムハイライト色",
"disk-section-label": "ストレージ使用量",
"disk-available-label": "ディスク空き容量",
"enable-dgpu-monitoring-description": "警告: これにより外部GPU (NVIDIA/AMD) が起動状態になるため、ハイブリッドグラフィックス搭載のノート PC ではバッテリー駆動時間に大きな影響を与える可能性があります。",
"enable-dgpu-monitoring-label": "外部GPUモニタリングを有効にする",
"external-monitor-description": "外部システムモニターアプリケーションを起動する際に実行するコマンドまたはアプリケーションパスを入力してください。",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "스왑 메모리 사용량을 표시합니다.",
"swap-usage-label": "스왑 사용량",
"use-monospace-font-description": "일관된 문자 너비를 위해 고정폭 글꼴을 사용합니다.",
"use-monospace-font-label": "고정폭 글꼴"
"use-monospace-font-label": "고정폭 글꼴",
"storage-as-percentage-label": "디스크 사용률(퍼센트)",
"storage-as-percentage-description": "디스크 공간을 절대값 대신 백분율로 표시합니다.",
"storage-available-label": "사용 가능한 디스크 공간",
"storage-available-description": "사용된 디스크 공간이 아닌 사용 가능한 디스크 공간을 표시합니다."
},
"taskbar": {
"colorize-icons-description": "작업 표시줄 아이콘에 테마 색상을 적용합니다.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "위험 색상",
"custom-highlight-colors-title-label": "사용자 지정 강조 색상",
"disk-section-label": "디스크 사용량",
"disk-available-label": "사용 가능한 디스크 공간",
"enable-dgpu-monitoring-description": "경고: 이 기능은 외장 GPU(NVIDIA/AMD)를 깨워 하이브리드 그래픽 노트북의 배터리 수명에 상당한 영향을 줄 수 있습니다.",
"enable-dgpu-monitoring-label": "외장 GPU 모니터링 활성화",
"external-monitor-description": "외부 시스템 모니터 애플리케이션 기능을 활성화할 때 실행할 명령 또는 애플리케이션 경로를 입력하세요.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Bikaranîna bîra swapê nîşan bide.",
"swap-usage-label": "Bikaranîna Swapê",
"use-monospace-font-description": "Bi kar tîne fonta monospace ji bo firehiya karakterê ya domdar.",
"use-monospace-font-label": "Tîpa yek-firehî"
"use-monospace-font-label": "Tîpa yek-firehî",
"storage-as-percentage-label": "Dîsk wekî rêje",
"storage-as-percentage-description": "Cihê dîskê li şûna nirxên mutleq, wekî rêjeyê nîşan bide.",
"storage-available-label": "Cihê dîskê yê berdest",
"storage-available-description": "Nîşan dide ka çiqas cihê dîskê berdest e, li şûna ku nîşan bide ka çiqas hatiye bikaranîn."
},
"taskbar": {
"colorize-icons-description": "Rengên temayê li îkonên taskbarê bicîh bike.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Rengê krîtîk",
"custom-highlight-colors-title-label": "Rengên ronîkirina xwerû",
"disk-section-label": "Bikaranîna dîskê",
"disk-available-label": "Dîsk berdest e",
"enable-dgpu-monitoring-description": "Hişyarî: Ev dê YKG a te ya veqetandî (NVIDIA/AMD) hişyar bike, ku dibe ku bandorek girîng li ser jiyana pîlê li ser laptopên bi grafîkên hîbrîd bike.",
"enable-dgpu-monitoring-label": "Çavdêriya YKG veqetandî çalak bike",
"external-monitor-description": "Fermanî an rêya sepanê binivîse ku dema sepana monitora pergala derveyî çalak dike were xebitandin.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Toon swap geheugengebruik.",
"swap-usage-label": "Swapgebruik",
"use-monospace-font-description": "Gebruik een monospace lettertype voor een consistente tekenbreedte.",
"use-monospace-font-label": "Lettertype met vaste breedte"
"use-monospace-font-label": "Lettertype met vaste breedte",
"storage-as-percentage-label": "Schijf als percentage",
"storage-as-percentage-description": "Geef schijfruimte weer als percentage in plaats van absolute waarden.",
"storage-available-label": "Beschikbare schijfruimte",
"storage-available-description": "Geeft aan hoeveel schijfruimte beschikbaar is in plaats van hoeveel er in gebruik is."
},
"taskbar": {
"colorize-icons-description": "Pas themakleuren toe op taakbalkpictogrammen.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Kritische kleur",
"custom-highlight-colors-title-label": "Aangepaste markeerkleuren",
"disk-section-label": "Schijfgebruik",
"disk-available-label": "Schijf beschikbaar",
"enable-dgpu-monitoring-description": "Waarschuwing: Dit zal uw dedicated GPU (NVIDIA/AMD) activeren, wat een aanzienlijke impact kan hebben op de accuduur van laptops met hybride grafische kaarten.",
"enable-dgpu-monitoring-label": "Dedicated GPU-monitoring inschakelen",
"external-monitor-description": "Voer de opdracht of applicatiepad in om te starten bij het activeren van de externe systeemmonitor applicatie.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Pokaż użycie pamięci wymiany.",
"swap-usage-label": "Użycie pamięci wymiany",
"use-monospace-font-description": "Użyj czcionki o stałej szerokości znaków dla zachowania spójnej szerokości znaków.",
"use-monospace-font-label": "Czcionka o stałej szerokości znaków"
"use-monospace-font-label": "Czcionka o stałej szerokości znaków",
"storage-as-percentage-label": "Dysk jako procent",
"storage-as-percentage-description": "Pokaż miejsce na dysku jako wartość procentową zamiast wartości bezwzględnej.",
"storage-available-label": "Dostępna przestrzeń dyskowa",
"storage-available-description": "Pokazuje, ile miejsca na dysku jest dostępne, a nie ile jest zajęte."
},
"taskbar": {
"colorize-icons-description": "Zastosuj kolory motywu do ikon paska zadań.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Kolor krytyczny",
"custom-highlight-colors-title-label": "Własne kolory podświetlenia",
"disk-section-label": "Użycie dysku",
"disk-available-label": "Dysk dostępny",
"enable-dgpu-monitoring-description": "Ostrzeżenie: To obudzi twoją dedykowaną kartę graficzną (NVIDIA/AMD), co może znacząco wpłynąć na żywotność baterii w laptopach z hybrydową grafiką.",
"enable-dgpu-monitoring-label": "Włącz monitorowanie dedykowanej karty graficznej",
"external-monitor-description": "Wprowadź polecenie lub ścieżkę aplikacji do uruchomienia przy aktywacji zewnętrznej aplikacji monitora systemu.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Mostrar o uso da memória swap.",
"swap-usage-label": "Utilização de swap",
"use-monospace-font-description": "Use fonte monoespaçada para largura de caractere consistente.",
"use-monospace-font-label": "Fonte monoespaçada"
"use-monospace-font-label": "Fonte monoespaçada",
"storage-as-percentage-label": "Disco em percentagem",
"storage-as-percentage-description": "Mostrar o espaço em disco como percentagem em vez de valores absolutos.",
"storage-available-label": "Espaço disponível em disco",
"storage-available-description": "Mostra quanto espaço em disco está disponível, em vez de quanto está a ser utilizado."
},
"taskbar": {
"colorize-icons-description": "Aplicar cores do tema aos ícones da barra de tarefas.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Cor crítica",
"custom-highlight-colors-title-label": "Cores de destaque personalizadas",
"disk-section-label": "Uso do disco",
"disk-available-label": "Disco disponível",
"enable-dgpu-monitoring-description": "Atenção: Isto irá ativar sua GPU dedicada (NVIDIA/AMD), o que pode impactar significativamente a duração da bateria em laptops com gráficos híbridos.",
"enable-dgpu-monitoring-label": "Ativar o monitoramento da GPU dedicada",
"external-monitor-description": "Digite o comando ou caminho da aplicação para executar ao ativar a aplicação externa de monitoramento do sistema.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Показать использование swap-памяти.",
"swap-usage-label": "Использование swap",
"use-monospace-font-description": "Используйте моноширинный шрифт для единообразной ширины символов.",
"use-monospace-font-label": "Моноширинный шрифт"
"use-monospace-font-label": "Моноширинный шрифт",
"storage-as-percentage-label": "Диск в процентах",
"storage-as-percentage-description": "Показывать место на диске в процентах, а не в абсолютных значениях.",
"storage-available-label": "Доступное место на диске",
"storage-available-description": "Показывает, сколько дискового пространства доступно, а не сколько используется."
},
"taskbar": {
"colorize-icons-description": "Применить цвета темы к иконкам панели задач.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Критический цвет",
"custom-highlight-colors-title-label": "Пользовательские цвета выделения",
"disk-section-label": "Использование диска",
"disk-available-label": "Доступный диск",
"enable-dgpu-monitoring-description": "Внимание: Это разбудит ваш дискретный графический процессор (NVIDIA/AMD), что может значительно повлиять на время работы от аккумулятора на ноутбуках с гибридной графикой.",
"enable-dgpu-monitoring-label": "Включить мониторинг дискретного GPU",
"external-monitor-description": "Введите команду или путь к приложению для запуска при активации внешнего приложения мониторинга системы.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Visa användning av växlingsminne.",
"swap-usage-label": "Växlingsanvändning",
"use-monospace-font-description": "Använd monospace-teckensnitt för enhetlig teckenbredd. ",
"use-monospace-font-label": "Teckensnitt för fast bredd"
"use-monospace-font-label": "Teckensnitt för fast bredd",
"storage-as-percentage-label": "Disk i procent",
"storage-as-percentage-description": "Visa diskutrymme som procentandel istället för absoluta värden.",
"storage-available-label": "Tillgängligt diskutrymme",
"storage-available-description": "Visar hur mycket diskutrymme som är tillgängligt istället för hur mycket som används."
},
"taskbar": {
"colorize-icons-description": "Tillämpa temafärger på ikoner i aktivitetsfältet.",
@@ -1348,6 +1352,7 @@
"critical-color-label": "Kritisk färg",
"custom-highlight-colors-title-label": "Anpassade markeringsfärger",
"disk-section-label": "Diskanvändning",
"disk-available-label": "Disk tillgänglig",
"enable-dgpu-monitoring-description": "Varning: Detta aktiverar din diskreta GPU (NVIDIA/AMD), vilket kan påverka batteritiden avsevärt på bärbara datorer med hybridgrafik.",
"enable-dgpu-monitoring-label": "Aktivera övervakning av diskret GPU",
"external-monitor-description": "Ange kommandot eller applikationsvägen som ska startas när den externa systemövervakningsapplikationen aktiveras.",
+6 -1
View File
@@ -216,7 +216,11 @@
"swap-usage-description": "Takas belleği kullanımını göster.",
"swap-usage-label": "Takas kullanımı",
"use-monospace-font-description": "Tekdüze karakter genişliği için tek aralıklı yazı tipini kullanın.",
"use-monospace-font-label": "Tek aralıklı yazı tipi"
"use-monospace-font-label": "Tek aralıklı yazı tipi",
"storage-as-percentage-label": "Disk yüzdesi olarak",
"storage-as-percentage-description": "Disk alanını mutlak değerler yerine yüzde olarak göster.",
"storage-available-label": "Kullanılabilir disk alanı",
"storage-available-description": "Kullanılan disk alanı yerine kullanılabilir disk alanının ne kadar olduğunu gösterir."
},
"taskbar": {
"colorize-icons-description": "Görev çubuğu simgelerine tema renklerini uygula.",
@@ -1350,6 +1354,7 @@
"critical-color-label": "Kritik renk",
"custom-highlight-colors-title-label": "Özel vurgulama renkleri",
"disk-section-label": "Disk kullanımı",
"disk-available-label": "Disk kullanılabilir",
"enable-dgpu-monitoring-description": "Uyarı: Bu, ayrık GPU'nuzu (NVIDIA/AMD) uyandıracak ve bu da hibrit grafiklere sahip dizüstü bilgisayarlarda pil ömrünü önemli ölçüde etkileyebilir.",
"enable-dgpu-monitoring-label": "Ayrık GPU izlemeyi etkinleştir",
"external-monitor-description": "Harici sistem izleyici uygulamasını etkinleştirirken başlatılacak komut veya uygulama yolunu girin.",
+2
View File
@@ -270,6 +270,8 @@
"swapCriticalThreshold": 90,
"diskWarningThreshold": 80,
"diskCriticalThreshold": 90,
"diskAvailWarningThreshold": 20,
"diskAvailCriticalThreshold": 10,
"cpuPollingInterval": 1000,
"gpuPollingInterval": 3000,
"enableDgpuMonitoring": false,
+2 -1
View File
@@ -138,7 +138,8 @@
"showSwapUsage": false,
"showNetworkStats": false,
"showDiskUsage": false,
"showDiskAsFree": false,
"showDiskUsageAsPercent": false,
"showDiskAvailable": false,
"diskPath": "/"
},
"Taskbar": {
+2
View File
@@ -482,6 +482,8 @@ Singleton {
property int swapCriticalThreshold: 90
property int diskWarningThreshold: 80
property int diskCriticalThreshold: 90
property int diskAvailWarningThreshold: 20
property int diskAvailCriticalThreshold: 10
property int cpuPollingInterval: 1000
property int gpuPollingInterval: 3000
property bool enableDgpuMonitoring: false // Opt-in: reading dGPU sysfs/nvidia-smi wakes it from D3cold, draining battery
+12 -15
View File
@@ -51,7 +51,8 @@ Item {
readonly property bool showSwapUsage: (widgetSettings.showSwapUsage !== undefined) ? widgetSettings.showSwapUsage : widgetMetadata.showSwapUsage
readonly property bool showNetworkStats: (widgetSettings.showNetworkStats !== undefined) ? widgetSettings.showNetworkStats : widgetMetadata.showNetworkStats
readonly property bool showDiskUsage: (widgetSettings.showDiskUsage !== undefined) ? widgetSettings.showDiskUsage : widgetMetadata.showDiskUsage
readonly property bool showDiskAsFree: (widgetSettings.showDiskAsFree !== undefined) ? widgetSettings.showDiskAsFree : widgetMetadata.showDiskAsFree
readonly property bool showDiskUsageAsPercent: (widgetSettings.showDiskUsageAsPercent !== undefined) ? widgetSettings.showDiskUsageAsPercent : widgetMetadata.showDiskUsageAsPercent
readonly property bool showDiskAvailable: (widgetSettings.showDiskAvailable !== undefined) ? widgetSettings.showDiskAvailable : widgetMetadata.showDiskAvailable
readonly property bool showLoadAverage: (widgetSettings.showLoadAverage !== undefined) ? widgetSettings.showLoadAverage : widgetMetadata.showLoadAverage
readonly property string diskPath: (widgetSettings.diskPath !== undefined) ? widgetSettings.diskPath : widgetMetadata.diskPath
readonly property string fontFamily: useMonospaceFont ? Settings.data.ui.fontFixed : Settings.data.ui.fontDefault
@@ -94,11 +95,11 @@ Item {
}
// Memory
rows.push([I18n.tr("common.memory"), `${Math.round(SystemStatService.memPercent)}% (${SystemStatService.formatMemoryGb(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"})`]);
rows.push([I18n.tr("common.memory"), `${Math.round(SystemStatService.memPercent)}% (${SystemStatService.formatGigabytes(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"})`]);
// Swap (if available)
if (SystemStatService.swapTotalGb > 0) {
rows.push([I18n.tr("bar.system-monitor.swap-usage-label"), `${Math.round(SystemStatService.swapPercent)}% (${SystemStatService.formatMemoryGb(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"})`]);
rows.push([I18n.tr("bar.system-monitor.swap-usage-label"), `${Math.round(SystemStatService.swapPercent)}% (${SystemStatService.formatGigabytes(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"})`]);
}
// Network
@@ -110,7 +111,7 @@ Item {
if (diskPercent !== undefined) {
const usedGb = SystemStatService.diskUsedGb[diskPath] || 0;
const sizeGb = SystemStatService.diskSizeGb[diskPath] || 0;
const availGb = SystemStatService.diskAvailGb[diskPath] || 0;
const availGb = SystemStatService.diskAvailableGb[diskPath] || 0;
rows.push([I18n.tr("system-monitor.disk"), `${diskPercent}% (${usedGb.toFixed(1)} / ${sizeGb.toFixed(1)} GB)`]);
rows.push([I18n.tr("common.available"), `${availGb.toFixed(1)} GB`]);
}
@@ -595,7 +596,7 @@ Item {
// Text mode
NText {
visible: !compactMode
text: showMemoryAsPercent ? `${Math.round(SystemStatService.memPercent)}%` : SystemStatService.formatMemoryGb(SystemStatService.memGb)
text: showMemoryAsPercent ? `${Math.round(SystemStatService.memPercent)}%` : SystemStatService.formatGigabytes(SystemStatService.memGb)
family: fontFamily
pointSize: barFontSize
applyUiScale: false
@@ -861,14 +862,10 @@ Item {
// Text mode
NText {
visible: !compactMode
text: {
if (showDiskAsFree && !isVertical) {
let avail = SystemStatService.diskAvailGb[diskPath] || 0;
return avail.toFixed(1) + "G";
} else {
return SystemStatService.diskPercents[diskPath] ? `${SystemStatService.diskPercents[diskPath]}%` : "n/a";
}
}
text: SystemStatService.formatDiskDisplay(diskPath, {
percent: showDiskUsageAsPercent,
available: showDiskAvailable
})
family: fontFamily
pointSize: barFontSize
applyUiScale: false
@@ -890,8 +887,8 @@ Item {
Layout.column: 1
onLoaded: {
item.ratio = Qt.binding(() => (SystemStatService.diskPercents[diskPath] ?? 0) / 100);
item.statColor = Qt.binding(() => SystemStatService.getDiskColor(diskPath));
item.ratio = Qt.binding(() => (showDiskAvailable ? SystemStatService.diskAvailPercents[diskPath] : SystemStatService.diskPercents[diskPath] ?? 0) / 100);
item.statColor = Qt.binding(() => SystemStatService.getDiskColor(diskPath, showDiskAvailable));
}
}
}
@@ -29,7 +29,8 @@ ColumnLayout {
property bool valueShowSwapUsage: widgetData.showSwapUsage !== undefined ? widgetData.showSwapUsage : widgetMetadata.showSwapUsage
property bool valueShowNetworkStats: widgetData.showNetworkStats !== undefined ? widgetData.showNetworkStats : widgetMetadata.showNetworkStats
property bool valueShowDiskUsage: widgetData.showDiskUsage !== undefined ? widgetData.showDiskUsage : widgetMetadata.showDiskUsage
property bool valueShowDiskAsFree: widgetData.showDiskAsFree !== undefined ? widgetData.showDiskAsFree : widgetMetadata.showDiskAsFree
property bool valueShowDiskUsageAsPercent: widgetData.showDiskUsageAsPercent !== undefined ? widgetData.showDiskUsageAsPercent : widgetMetadata.showDiskUsageAsPercent
property bool valueShowDiskAvailable: widgetData.showDiskAvailable !== undefined ? widgetData.showDiskAvailable : widgetMetadata.showDiskAvailable
property string valueDiskPath: widgetData.diskPath !== undefined ? widgetData.diskPath : widgetMetadata.diskPath
function saveSettings() {
@@ -47,7 +48,8 @@ ColumnLayout {
settings.showSwapUsage = valueShowSwapUsage;
settings.showNetworkStats = valueShowNetworkStats;
settings.showDiskUsage = valueShowDiskUsage;
settings.showDiskAsFree = valueShowDiskAsFree;
settings.showDiskUsageAsPercent = valueShowDiskUsageAsPercent;
settings.showDiskAvailable = valueShowDiskAvailable;
settings.diskPath = valueDiskPath;
return settings;
@@ -211,16 +213,27 @@ ColumnLayout {
}
NToggle {
id: showDiskAsFree
id: showDiskUsageAsPercent
Layout.fillWidth: true
label: "Show Free Space" // TODO: use I18n.tr
description: "Display available space (GB) instead of percentage" // TODO: use I18n.tr
checked: valueShowDiskAsFree
label: I18n.tr("bar.system-monitor.storage-as-percentage-label")
description: I18n.tr("bar.system-monitor.storage-as-percentage-description")
checked: valueShowDiskUsageAsPercent
onToggled: checked => {
valueShowDiskAsFree = checked;
valueShowDiskUsageAsPercent = checked;
settingsChanged(saveSettings());
}
}
NToggle {
id: showDiskAvailable
Layout.fillWidth: true
label: I18n.tr("bar.system-monitor.storage-available-label")
description: I18n.tr("bar.system-monitor.storage-available-description")
checked: valueShowDiskAvailable
onToggled: checked => {
valueShowDiskAvailable = checked;
settingsChanged(saveSettings());
}
visible: valueShowDiskUsage
}
NComboBox {
@@ -140,7 +140,7 @@ ColumnLayout {
info += "GPU: " + gpu.result.map(g => g.name || "Unknown").join(", ") + "\n";
}
if (mem?.result) {
info += "Memory: " + SystemStatService.formatMemoryGb(mem.result.total / root.giga) + "\n";
info += "Memory: " + SystemStatService.formatGigabytes(mem.result.total / root.giga) + "\n";
}
if (wm?.result) {
info += "WM: " + (wm.result.prettyName || wm.result.processName || "N/A") + "\n";
@@ -697,8 +697,8 @@ ColumnLayout {
const mem = root.getModule("Memory");
if (!mem?.result)
return "N/A";
const used = SystemStatService.formatMemoryGb(mem.result.used / root.giga);
const total = SystemStatService.formatMemoryGb(mem.result.total / root.giga);
const used = SystemStatService.formatGigabytes(mem.result.used / root.giga);
const total = SystemStatService.formatGigabytes(mem.result.total / root.giga);
return used + " / " + total;
}
color: Color.mOnSurface
@@ -721,8 +721,8 @@ ColumnLayout {
const rootDisk = disk.result.find(d => d.mountpoint === "/");
if (!rootDisk?.bytes)
return "N/A";
const used = SystemStatService.formatMemoryGb(rootDisk.bytes.used / root.giga);
const total = SystemStatService.formatMemoryGb(rootDisk.bytes.total / root.giga);
const used = SystemStatService.formatGigabytes(rootDisk.bytes.used / root.giga);
const total = SystemStatService.formatGigabytes(rootDisk.bytes.total / root.giga);
return used + " / " + total + " (" + rootDisk.filesystem + ")";
}
color: Color.mOnSurface
@@ -243,5 +243,38 @@ ColumnLayout {
suffix: "%"
onValueChanged: Settings.data.systemMonitor.diskCriticalThreshold = value
}
// Disk Available
NText {
text: I18n.tr("panels.system-monitor.disk-available-label")
pointSize: Style.fontSizeM
}
NSpinBox {
Layout.alignment: Qt.AlignHCenter
from: 0
to: 100
stepSize: 5
value: Settings.data.systemMonitor.diskAvailWarningThreshold
defaultValue: Settings.getDefaultValue("systemMonitor.diskAvailWarningThreshold")
suffix: "%"
onValueChanged: {
Settings.data.systemMonitor.diskAvailWarningThreshold = value;
if (Settings.data.systemMonitor.diskAvailCriticalThreshold > value) {
Settings.data.systemMonitor.diskAvailCriticalThreshold = value;
}
}
}
NSpinBox {
Layout.alignment: Qt.AlignHCenter
from: 0
to: 20
stepSize: 5
value: Settings.data.systemMonitor.diskAvailCriticalThreshold
defaultValue: Settings.getDefaultValue("systemMonitor.diskAvailCriticalThreshold")
suffix: "%"
onValueChanged: Settings.data.systemMonitor.diskAvailCriticalThreshold = value
}
}
}
@@ -170,7 +170,7 @@ SmartPanel {
}
NText {
text: `${Math.round(SystemStatService.memPercent)}% ${SystemStatService.formatMemoryGb(SystemStatService.memGb).replace(/[^0-9.]/g, "")} GB`
text: `${Math.round(SystemStatService.memPercent)}% ${SystemStatService.formatGigabytes(SystemStatService.memGb).replace(/[^0-9.]/g, "")} GB`
pointSize: Style.fontSizeXS
color: Color.mPrimary
}
@@ -398,7 +398,7 @@ SmartPanel {
}
NText {
text: `${SystemStatService.formatMemoryGb(SystemStatService.swapGb).replace(/[^0-9.]/g, "")} / ${SystemStatService.formatMemoryGb(SystemStatService.swapTotalGb).replace(/[^0-9.]/g, "")} GB`
text: `${SystemStatService.formatGigabytes(SystemStatService.swapGb).replace(/[^0-9.]/g, "")} / ${SystemStatService.formatGigabytes(SystemStatService.swapTotalGb).replace(/[^0-9.]/g, "")} GB`
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
+34 -10
View File
@@ -32,7 +32,9 @@ Singleton {
property real swapPercent: 0
property real swapTotalGb: 0
property var diskPercents: ({})
property var diskAvailPercents: ({}) // available disk space in percent
property var diskUsedGb: ({}) // Used space in GB per mount point
property var diskAvailableGb: ({}) // available space in GB per mount point
property var diskSizeGb: ({}) // Total size in GB per mount point
property var diskAvailGb: ({})
property real rxSpeed: 0
@@ -181,6 +183,8 @@ Singleton {
readonly property int swapCriticalThreshold: Settings.data.systemMonitor.swapCriticalThreshold
readonly property int diskWarningThreshold: Settings.data.systemMonitor.diskWarningThreshold
readonly property int diskCriticalThreshold: Settings.data.systemMonitor.diskCriticalThreshold
readonly property int diskAvailWarningThreshold: Settings.data.systemMonitor.diskAvailWarningThreshold
readonly property int diskAvailCriticalThreshold: Settings.data.systemMonitor.diskAvailCriticalThreshold
// Computed warning/critical states (uses >= inclusive comparison)
readonly property bool cpuWarning: cpuUsage >= cpuWarningThreshold
@@ -195,12 +199,12 @@ Singleton {
readonly property bool swapCritical: swapPercent >= swapCriticalThreshold
// Helper functions for disk (disk path is dynamic)
function isDiskWarning(diskPath) {
return (diskPercents[diskPath] || 0) >= diskWarningThreshold;
function isDiskWarning(diskPath, available = false) {
return available ? (diskAvailPercents[diskPath] || 0) <= diskAvailWarningThreshold : (diskPercents[diskPath] || 0) >= diskWarningThreshold;
}
function isDiskCritical(diskPath) {
return (diskPercents[diskPath] || 0) >= diskCriticalThreshold;
function isDiskCritical(diskPath, available = false) {
return available ? (diskAvailPercents[diskPath] || 0) <= diskAvailCriticalThreshold : (diskPercents[diskPath] || 0) >= diskCriticalThreshold;
}
// Ready-to-use stat colors (for gauges, panels, icons)
@@ -210,8 +214,8 @@ Singleton {
readonly property color memColor: memCritical ? criticalColor : (memWarning ? warningColor : Color.mPrimary)
readonly property color swapColor: swapCritical ? criticalColor : (swapWarning ? warningColor : Color.mPrimary)
function getDiskColor(diskPath) {
return isDiskCritical(diskPath) ? criticalColor : (isDiskWarning(diskPath) ? warningColor : Color.mPrimary);
function getDiskColor(diskPath, available = false) {
return isDiskCritical(diskPath, available) ? criticalColor : (isDiskWarning(diskPath, available) ? warningColor : Color.mPrimary);
}
// Helper function for color resolution based on value and thresholds
@@ -444,9 +448,10 @@ Singleton {
onStreamFinished: {
const lines = text.trim().split('\n');
const newPercents = {};
const newAvailPercents = {};
const newUsedGb = {};
const newSizeGb = {};
const newAvailGb = {};
const newAvailableGb = {};
const bytesPerGb = 1024 * 1024 * 1024;
// Start from line 1 (skip header)
for (var i = 1; i < lines.length; i++) {
@@ -457,16 +462,19 @@ Singleton {
const usedBytes = parseFloat(parts[2]) || 0;
const sizeBytes = parseFloat(parts[3]) || 0;
const availBytes = parseFloat(parts[4]) || 0;
const availPercent = sizeBytes > 0 ? (availBytes / sizeBytes) * 100 : 0;
newPercents[target] = percent;
newAvailPercents[target] = Math.round(availPercent);
newUsedGb[target] = usedBytes / bytesPerGb;
newSizeGb[target] = sizeBytes / bytesPerGb;
newAvailGb[target] = availBytes / bytesPerGb;
newAvailableGb[target] = availBytes / bytesPerGb;
}
}
root.diskPercents = newPercents;
root.diskAvailPercents = newAvailPercents;
root.diskUsedGb = newUsedGb;
root.diskSizeGb = newSizeGb;
root.diskAvailGb = newAvailGb;
root.diskAvailableGb = newAvailableGb;
root.pushDiskHistory();
}
}
@@ -1014,7 +1022,7 @@ Singleton {
// -------------------------------------------------------
// Smart formatter for memory values (GB) - max 4 chars
// Uses decimal for < 10GB, integer otherwise
function formatMemoryGb(memGb) {
function formatGigabytes(memGb) {
const value = parseFloat(memGb);
if (isNaN(value))
return "0G";
@@ -1024,6 +1032,22 @@ Singleton {
return Math.round(value) + "G"; // "10G" to "999G"
}
// -------------------------------------------------------
// Formatting disk usage
function formatDiskDisplay(diskPath, {
percent = false,
available = false
} = {}) {
if (percent) {
const raw = available ? root.diskAvailPercents[diskPath] : root.diskPercents[diskPath];
const value = (raw === null) ? 0 : raw;
return `${value}%`;
} else {
const rawGb = available ? root.diskAvailableGb[diskPath] : root.diskUsedGb[diskPath];
return formatGigabytes(rawGb === null ? 0 : rawGb);
}
}
// -------------------------------------------------------
// Function to start fetching and computing the cpu temperature
function updateCpuTemperature() {
+2 -1
View File
@@ -208,7 +208,8 @@ Singleton {
"showSwapUsage": false,
"showNetworkStats": false,
"showDiskUsage": false,
"showDiskAsFree": false,
"showDiskUsageAsPercent": false,
"showDiskAvailable": false,
"diskPath": "/"
},
"Taskbar": {