add cpu module with /proc/stat collector, visible grid cells, dark background, and fullscreen dashboard

This commit is contained in:
Eric Smith 2026-05-20 12:59:50 -04:00
parent 5aabc1f7ef
commit 499df2846c
6 changed files with 190 additions and 3 deletions

View file

@ -0,0 +1,51 @@
extends RefCounted
class_name CpuCollector
var _previous_total: int = 0
var _previous_idle: int = 0
var _has_previous: bool = false
func collect() -> float:
var stats: PackedStringArray = _read_stats()
if stats.is_empty():
return 0.0
var total: int = 0
var idle: int = 0
for i in range(1, stats.size()):
var val: int = stats[i].to_int()
total += val
if i == 4: # idle is the 4th token (index 4)
idle = val
if not _has_previous:
_previous_total = total
_previous_idle = idle
_has_previous = true
return 0.0
var total_delta: int = total - _previous_total
var idle_delta: int = idle - _previous_idle
_previous_total = total
_previous_idle = idle
if total_delta == 0:
return 0.0
return 100.0 * (1.0 - float(idle_delta) / float(total_delta))
func _read_stats() -> PackedStringArray:
var file := FileAccess.open("/proc/stat", FileAccess.READ)
if file == null:
return PackedStringArray()
var line: String = file.get_line()
if not line.begins_with("cpu "):
return PackedStringArray()
return line.split(" ", false)

49
panels/cpu/cpu_module.gd Normal file
View file

@ -0,0 +1,49 @@
extends ModuleBase
class_name CpuModule
@onready var title_label: Label = %Title
@onready var label: Label = %Label
@onready var progress: ProgressBar = %ProgressBar
var _collector: CpuCollector
func initialize() -> void:
module_title = "CPU"
_collector = CpuCollector.new()
_style()
func refresh(data: Dictionary) -> void:
var usage: float = _collector.collect()
if usage < 0.0:
return
var pct: int = roundi(usage)
label.text = "%d%%" % pct
progress.value = pct
func _style() -> void:
title_label.add_theme_color_override("font_color", Color(0.7, 0.7, 0.8, 1.0))
label.add_theme_color_override("font_color", Color(0.9, 0.9, 1.0, 1.0))
label.add_theme_font_size_override("font_size", 48)
var fg := StyleBoxFlat.new()
fg.bg_color = Color(0.2, 0.5, 0.8, 1.0)
fg.corner_radius_top_left = 4
fg.corner_radius_top_right = 4
fg.corner_radius_bottom_right = 4
fg.corner_radius_bottom_left = 4
var bg := StyleBoxFlat.new()
bg.bg_color = Color(0.1, 0.1, 0.14, 1.0)
bg.corner_radius_top_left = 4
bg.corner_radius_top_right = 4
bg.corner_radius_bottom_right = 4
bg.corner_radius_bottom_left = 4
progress.add_theme_stylebox_override("fill", fg)
progress.add_theme_stylebox_override("background", bg)

View file

@ -0,0 +1,40 @@
[gd_scene format=3 uid="uid://bq3bs2hb4r7fb"]
[ext_resource type="Script" path="res://panels/cpu/cpu_module.gd" id="1"]
[node name="CpuModule" type="PanelContainer"]
anchors_preset = 0
script = ExtResource("1")
[node name="MarginContainer" type="MarginContainer" parent="."]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
theme_constant_overrides/margin_left = 12
theme_constant_overrides/margin_top = 12
theme_constant_overrides/margin_right = 12
theme_constant_overrides/margin_bottom = 12
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
[node name="Title" type="Label" parent="MarginContainer/VBoxContainer"]
unique_name_in_owner = true
text = "CPU"
[node name="Spacer" type="Control" parent="MarginContainer/VBoxContainer"]
size_flags_vertical = 3
[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"]
unique_name_in_owner = true
horizontal_alignment = 1
size_flags_horizontal = 4
[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/VBoxContainer"]
unique_name_in_owner = true
size_flags_horizontal = 4
max_value = 100.0
value = 0.0
show_percentage = false