diff --git a/data/icons/gpu-vram-symbolic.svg b/data/icons/gpu-vram-symbolic.svg
deleted file mode 100644
index 5b97cf1a6..000000000
--- a/data/icons/gpu-vram-symbolic.svg
+++ /dev/null
@@ -1,151 +0,0 @@
-
-
diff --git a/data/icons/icons.indicator.gresource.xml b/data/icons/icons.indicator.gresource.xml
index ad678d28b..15601ef1b 100644
--- a/data/icons/icons.indicator.gresource.xml
+++ b/data/icons/icons.indicator.gresource.xml
@@ -4,12 +4,10 @@
bug-symbolic.svg
cpu-symbolic.svg
gpu-symbolic.svg
+ network-symbolic.svg
ram-symbolic.svg
- gpu-vram-symbolic.svg
swap-symbolic.svg
file-deleted-symbolic.svg
- temperature-sensor-symbolic.svg
- temperature-gpu-symbolic.svg
process-attention-symbolic.svg
process-critical-symbolic.svg
process-information-symbolic.svg
diff --git a/data/icons/network-symbolic.svg b/data/icons/network-symbolic.svg
new file mode 100644
index 000000000..b5f05eb73
--- /dev/null
+++ b/data/icons/network-symbolic.svg
@@ -0,0 +1,19 @@
+
diff --git a/data/icons/temperature-gpu-symbolic.svg b/data/icons/temperature-gpu-symbolic.svg
deleted file mode 100644
index 138823fbe..000000000
--- a/data/icons/temperature-gpu-symbolic.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
diff --git a/data/icons/temperature-sensor-symbolic.svg b/data/icons/temperature-sensor-symbolic.svg
deleted file mode 100644
index acf316a2f..000000000
--- a/data/icons/temperature-sensor-symbolic.svg
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
diff --git a/src/Indicator/Indicator.vala b/src/Indicator/Indicator.vala
index ef8f16730..96f42dcdf 100644
--- a/src/Indicator/Indicator.vala
+++ b/src/Indicator/Indicator.vala
@@ -82,6 +82,10 @@ public class Monitor.Indicator : Wingpanel.Indicator {
.composited-indicator > revealer label.monitor-indicator-label-critical {
color: @error_color;
}
+ .monitor-indicator-icon {
+ margin-right: 0.4em;
+ margin-left: 0.7em;
+ }
""";
provider.load_from_string (css);
diff --git a/src/Indicator/Widgets/DisplayWidget.vala b/src/Indicator/Widgets/DisplayWidget.vala
index 9a8becd72..2e2571719 100644
--- a/src/Indicator/Widgets/DisplayWidget.vala
+++ b/src/Indicator/Widgets/DisplayWidget.vala
@@ -7,42 +7,126 @@ public class Monitor.Widgets.DisplayWidget : Gtk.Box {
construct {
valign = Gtk.Align.CENTER;
- var cpu_widget = new IndicatorWidgetPercentage ("cpu-symbolic");
- var cpu_frequency_widget = new IndicatorWidgetFrequency ("cpu-symbolic");
- var cpu_temperature_widget = new IndicatorWidgetTemperature ("temperature-sensor-symbolic");
+ var cpu_widget = new IndicatorWidgetPercentage () {
+ tooltip_text = _("Processor usage")
+ };
- var memory_widget = new IndicatorWidgetPercentage ("ram-symbolic");
+ var cpu_frequency_widget = new IndicatorWidgetFrequency () {
+ tooltip_text = _("Processor frequency")
+ };
- var network_up_widget = new IndicatorWidgetBandwidth ("go-up-symbolic");
- var network_down_widget = new IndicatorWidgetBandwidth ("go-down-symbolic");
+ var cpu_temperature_widget = new IndicatorWidgetTemperature () {
+ tooltip_text = _("Processor temperature")
+ };
- var gpu_widget = new IndicatorWidgetPercentage ("gpu-symbolic");
- var gpu_memory_widget = new IndicatorWidgetPercentage ("gpu-vram-symbolic");
- var gpu_temperature_widget = new IndicatorWidgetTemperature ("temperature-gpu-symbolic");
+ var cpu_group_widget = new IndicatorGroupWidget ("cpu-symbolic");
+ cpu_group_widget.append (cpu_widget);
+ cpu_group_widget.append (cpu_frequency_widget);
+ cpu_group_widget.append (cpu_temperature_widget);
+
+ var memory_widget = new IndicatorWidgetPercentage () {
+ tooltip_text = _("Memory usage")
+ };
+
+ var memory_group_widget = new IndicatorGroupWidget ("ram-symbolic");
+ memory_group_widget.append (memory_widget);
+
+ var gpu_widget = new IndicatorWidgetPercentage () {
+ tooltip_text = _("Graphics processor usage")
+ };
+
+ var gpu_memory_widget = new IndicatorWidgetPercentage () {
+ tooltip_text = _("Graphics memory usage")
+ };
+
+ var gpu_temperature_widget = new IndicatorWidgetTemperature () {
+ tooltip_text = _("Graphics processor temperature")
+ };
+
+ var gpu_group_widget = new IndicatorGroupWidget ("gpu-symbolic");
+ gpu_group_widget.append (gpu_widget);
+ gpu_group_widget.append (gpu_memory_widget);
+ gpu_group_widget.append (gpu_temperature_widget);
+
+ var network_up_widget = new IndicatorWidgetBandwidth () {
+ tooltip_text = _("Network upload speed")
+ };
+
+ var network_down_widget = new IndicatorWidgetBandwidth () {
+ tooltip_text = _("Network download speed")
+ };
+
+ var network_group_widget = new IndicatorGroupWidget ("network-symbolic");
+ network_group_widget.append (network_up_widget);
+ network_group_widget.append (network_down_widget);
+
+ append (cpu_group_widget);
+ append (memory_group_widget);
+ append (gpu_group_widget);
+ append (network_group_widget);
unowned var dbusclient = DBusClient.get_default ();
dbusclient.monitor_appeared.connect (() => {
- cpu_widget.visible = Indicator.settings.get_boolean ("indicator-cpu-state");
- cpu_frequency_widget.visible = Indicator.settings.get_boolean ("indicator-cpu-frequency-state");
- cpu_temperature_widget.visible = Indicator.settings.get_boolean ("indicator-cpu-temperature-state");
- memory_widget.visible = Indicator.settings.get_boolean ("indicator-memory-state");
- network_up_widget.visible = Indicator.settings.get_boolean ("indicator-network-upload-state");
- network_down_widget.visible = Indicator.settings.get_boolean ("indicator-network-download-state");
- gpu_widget.visible = Indicator.settings.get_boolean ("indicator-gpu-state");
- gpu_memory_widget.visible = Indicator.settings.get_boolean ("indicator-gpu-memory-state");
- gpu_temperature_widget.visible = Indicator.settings.get_boolean ("indicator-gpu-temperature-state");
+ cpu_widget.revealed = Indicator.settings.get_boolean ("indicator-cpu-state");
+ cpu_frequency_widget.revealed = Indicator.settings.get_boolean ("indicator-cpu-frequency-state");
+ cpu_temperature_widget.revealed = Indicator.settings.get_boolean ("indicator-cpu-temperature-state");
+ cpu_group_widget.revealed = cpu_widget.revealed || cpu_frequency_widget.revealed || cpu_temperature_widget.revealed;
+
+ memory_widget.revealed = Indicator.settings.get_boolean ("indicator-memory-state");
+ memory_group_widget.revealed = memory_widget.revealed;
+
+ network_up_widget.revealed = Indicator.settings.get_boolean ("indicator-network-upload-state");
+ network_down_widget.revealed = Indicator.settings.get_boolean ("indicator-network-download-state");
+ network_group_widget.revealed = network_up_widget.revealed || network_down_widget.revealed;
+
+ gpu_widget.revealed = Indicator.settings.get_boolean ("indicator-gpu-state");
+ gpu_memory_widget.revealed = Indicator.settings.get_boolean ("indicator-gpu-memory-state");
+ gpu_temperature_widget.revealed = Indicator.settings.get_boolean ("indicator-gpu-temperature-state");
+ gpu_group_widget.revealed = gpu_widget.revealed || gpu_memory_widget.revealed || gpu_temperature_widget.revealed;
+ });
+
+ dbusclient.interface.indicator_cpu_state.connect ((state) => {
+ cpu_widget.revealed = state;
+ cpu_group_widget.revealed = cpu_widget.revealed || cpu_frequency_widget.revealed || cpu_temperature_widget.revealed;
+
+ });
+ dbusclient.interface.indicator_cpu_frequency_state.connect ((state) => {
+ cpu_frequency_widget.revealed = state;
+ cpu_group_widget.revealed = cpu_widget.revealed || cpu_frequency_widget.revealed || cpu_temperature_widget.revealed;
});
- dbusclient.interface.indicator_cpu_state.connect ((state) => cpu_widget.visible = state);
- dbusclient.interface.indicator_cpu_frequency_state.connect ((state) => cpu_frequency_widget.visible = state);
- dbusclient.interface.indicator_cpu_temperature_state.connect ((state) => cpu_temperature_widget.visible = state);
- dbusclient.interface.indicator_memory_state.connect ((state) => memory_widget.visible = state);
- dbusclient.interface.indicator_network_up_state.connect ((state) => network_up_widget.visible = state);
- dbusclient.interface.indicator_network_down_state.connect ((state) => network_down_widget.visible = state);
- dbusclient.interface.indicator_gpu_state.connect ((state) => gpu_widget.visible = state);
- dbusclient.interface.indicator_gpu_memory_state.connect ((state) => gpu_memory_widget.visible = state);
- dbusclient.interface.indicator_gpu_temperature_state.connect ((state) => gpu_temperature_widget.visible = state);
+ dbusclient.interface.indicator_cpu_temperature_state.connect ((state) => {
+ cpu_temperature_widget.revealed = state;
+ cpu_group_widget.revealed = cpu_widget.revealed || cpu_frequency_widget.revealed || cpu_temperature_widget.revealed;
+ });
+
+ dbusclient.interface.indicator_memory_state.connect ((state) => {
+ memory_widget.revealed = state;
+ memory_group_widget.revealed = memory_widget.revealed;
+ });
+
+ dbusclient.interface.indicator_gpu_state.connect ((state) => {
+ gpu_widget.revealed = state;
+ gpu_group_widget.revealed = gpu_widget.revealed || gpu_memory_widget.revealed || gpu_temperature_widget.revealed;
+ });
+ dbusclient.interface.indicator_gpu_memory_state.connect ((state) => {
+ gpu_memory_widget.revealed = state;
+ gpu_group_widget.revealed = gpu_widget.revealed || gpu_memory_widget.revealed || gpu_temperature_widget.revealed;
+ });
+ dbusclient.interface.indicator_gpu_temperature_state.connect ((state) => {
+ gpu_temperature_widget.revealed = state;
+ gpu_group_widget.revealed = gpu_widget.revealed || gpu_memory_widget.revealed || gpu_temperature_widget.revealed;
+ });
+
+ dbusclient.interface.indicator_network_up_state.connect ((state) => {
+ network_up_widget.revealed = state;
+ network_group_widget.revealed = network_up_widget.revealed || network_down_widget.revealed;
+ });
+ dbusclient.interface.indicator_network_down_state.connect ((state) => {
+ network_down_widget.revealed = state;
+ network_group_widget.revealed = network_up_widget.revealed || network_down_widget.revealed;
+ });
dbusclient.interface.update.connect ((sysres) => {
var cpu_percentage = Value (typeof (uint));
@@ -61,14 +145,6 @@ public class Monitor.Widgets.DisplayWidget : Gtk.Box {
memory_percentage.set_uint (sysres.memory_percentage);
memory_widget.update_label (memory_percentage);
- var network_up = Value (typeof (uint64));
- network_up.set_uint64 (sysres.network_up);
- network_up_widget.update_label (network_up);
-
- var network_down = Value (typeof (uint64));
- network_down.set_uint64 (sysres.network_down);
- network_down_widget.update_label (network_down);
-
var gpu_percentage = Value (typeof (uint));
gpu_percentage.set_uint (sysres.gpu_percentage);
gpu_widget.update_label (gpu_percentage);
@@ -80,16 +156,25 @@ public class Monitor.Widgets.DisplayWidget : Gtk.Box {
var gpu_temperature = Value (typeof (int));
gpu_temperature.set_int ((int) Math.round (sysres.gpu_temperature));
gpu_temperature_widget.update_label (gpu_temperature);
+
+ var network_up = Value (typeof (uint64));
+ network_up.set_uint64 (sysres.network_up);
+ network_up_widget.update_label (network_up);
+
+ var network_down = Value (typeof (uint64));
+ network_down.set_uint64 (sysres.network_down);
+ network_down_widget.update_label (network_down);
+
});
+ }
- append (cpu_widget);
- append (cpu_frequency_widget);
- append (cpu_temperature_widget);
- append (memory_widget);
- append (gpu_widget);
- append (gpu_memory_widget);
- append (gpu_temperature_widget);
- append (network_down_widget);
- append (network_up_widget);
+ public new void append (IndicatorGroupWidget widget) {
+ var revealer = new Gtk.Revealer () {
+ child = widget,
+ transition_type = Gtk.RevealerTransitionType.SLIDE_LEFT,
+ };
+ widget.bind_property ("revealed", revealer, "reveal-child", DEFAULT);
+ base.append (revealer);
}
+
}
diff --git a/src/Indicator/Widgets/IndicatorGroupWidget.vala b/src/Indicator/Widgets/IndicatorGroupWidget.vala
new file mode 100644
index 000000000..df32b7303
--- /dev/null
+++ b/src/Indicator/Widgets/IndicatorGroupWidget.vala
@@ -0,0 +1,35 @@
+/*
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ * SPDX-FileCopyrightText: 2026 elementary, Inc. (https://elementary.io)
+ */
+
+public class Monitor.IndicatorGroupWidget : Gtk.Box {
+
+ public string icon_name { get; construct; }
+ public bool revealed { get; set; }
+
+ protected Gtk.Label label;
+
+ public IndicatorGroupWidget (string icon_name) {
+ Object (
+ orientation: Gtk.Orientation.HORIZONTAL,
+ icon_name: icon_name
+ );
+ }
+
+ construct {
+ var icon = new Gtk.Image.from_icon_name (icon_name);
+ icon.add_css_class ("monitor-indicator-icon");
+ base.append (icon);
+ }
+
+ public new void append (IndicatorWidget widget) {
+ var revealer = new Gtk.Revealer () {
+ child = widget,
+ transition_type = Gtk.RevealerTransitionType.SLIDE_LEFT,
+ };
+ widget.bind_property ("revealed", revealer, "reveal-child", DEFAULT);
+ base.append (revealer);
+ }
+
+}
diff --git a/src/Indicator/Widgets/IndicatorWidget.vala b/src/Indicator/Widgets/IndicatorWidget.vala
index 80301e90c..299c4e663 100644
--- a/src/Indicator/Widgets/IndicatorWidget.vala
+++ b/src/Indicator/Widgets/IndicatorWidget.vala
@@ -5,21 +5,16 @@
public class Monitor.IndicatorWidget : Gtk.Box {
- public string icon_name { get; construct; }
-
protected Gtk.Label label;
+ public bool revealed { get; set; }
- public IndicatorWidget (string icon_name) {
+ public IndicatorWidget () {
Object (
- orientation: Gtk.Orientation.HORIZONTAL,
- icon_name: icon_name,
- visible: false
+ orientation: Gtk.Orientation.HORIZONTAL
);
}
construct {
- var icon = new Gtk.Image.from_icon_name (icon_name);
-
label = new Gtk.Label (Utils.NOT_AVAILABLE) {
margin_start = 2,
margin_end = 2,
@@ -28,7 +23,6 @@ public class Monitor.IndicatorWidget : Gtk.Box {
width_chars = 4,
};
- append (icon);
append (label);
}
diff --git a/src/Indicator/Widgets/IndicatorWidgetBandwidth.vala b/src/Indicator/Widgets/IndicatorWidgetBandwidth.vala
index 75bdad803..78b8823c7 100644
--- a/src/Indicator/Widgets/IndicatorWidgetBandwidth.vala
+++ b/src/Indicator/Widgets/IndicatorWidgetBandwidth.vala
@@ -4,13 +4,12 @@
*/
public class Monitor.IndicatorWidgetBandwidth : Monitor.IndicatorWidget {
- public IndicatorWidgetBandwidth (string icon_name) {
- base (icon_name);
- }
public override void update_label (Value value) {
uint64 bandwidth = value.get_uint64 ();
- label.label = Utils.Strings.format_network_speed (bandwidth);
+ label.add_css_class (Granite.CssClass.NUMERIC);
+ label.width_chars = 9;
+ label.label = "%s".printf (Utils.Strings.format_network_speed (bandwidth));
}
}
diff --git a/src/Indicator/Widgets/IndicatorWidgetFrequency.vala b/src/Indicator/Widgets/IndicatorWidgetFrequency.vala
index 5aabb5def..4293150d8 100644
--- a/src/Indicator/Widgets/IndicatorWidgetFrequency.vala
+++ b/src/Indicator/Widgets/IndicatorWidgetFrequency.vala
@@ -4,13 +4,12 @@
*/
public class Monitor.IndicatorWidgetFrequency : Monitor.IndicatorWidget {
- public IndicatorWidgetFrequency (string icon_name) {
- base (icon_name);
- }
- public override void update_label (Value value) {
+public override void update_label (Value value) {
double frequency = value.get_double ();
- label.label = Utils.Strings.format_frequency (frequency);
+ label.add_css_class (Granite.CssClass.NUMERIC);
+ label.width_chars = 7;
+ label.label = "%s".printf (Utils.Strings.format_frequency (frequency));
}
}
diff --git a/src/Indicator/Widgets/IndicatorWidgetPercentage.vala b/src/Indicator/Widgets/IndicatorWidgetPercentage.vala
index f1bb98a46..4e35cb952 100644
--- a/src/Indicator/Widgets/IndicatorWidgetPercentage.vala
+++ b/src/Indicator/Widgets/IndicatorWidgetPercentage.vala
@@ -4,14 +4,13 @@
*/
public class Monitor.IndicatorWidgetPercentage : Monitor.IndicatorWidget {
- public IndicatorWidgetPercentage (string icon_name) {
- base (icon_name);
- }
public override void update_label (Value value) {
uint percentage = value.get_uint ();
+ label.add_css_class (Granite.CssClass.NUMERIC);
label.label = "%u%%".printf (percentage);
+
label.remove_css_class ("monitor-indicator-label-warning");
label.remove_css_class ("monitor-indicator-label-critical");
diff --git a/src/Indicator/Widgets/IndicatorWidgetTemperature.vala b/src/Indicator/Widgets/IndicatorWidgetTemperature.vala
index 4580559fd..a64a387e8 100644
--- a/src/Indicator/Widgets/IndicatorWidgetTemperature.vala
+++ b/src/Indicator/Widgets/IndicatorWidgetTemperature.vala
@@ -4,13 +4,12 @@
*/
public class Monitor.IndicatorWidgetTemperature : Monitor.IndicatorWidget {
- public IndicatorWidgetTemperature (string icon_name) {
- base (icon_name);
- }
public override void update_label (Value value) {
int temperature = value.get_int ();
+ label.add_css_class (Granite.CssClass.NUMERIC);
+ label.width_chars = 3;
label.label = "%i℃".printf (temperature);
}
}
diff --git a/src/Indicator/meson.build b/src/Indicator/meson.build
index 99457d978..be5e7e5fb 100644
--- a/src/Indicator/meson.build
+++ b/src/Indicator/meson.build
@@ -3,6 +3,7 @@ source_indicator_files = [
'Services/DBusClient.vala',
'Widgets/DisplayWidget.vala',
'Widgets/IndicatorWidget.vala',
+ 'Widgets/IndicatorGroupWidget.vala',
'Widgets/IndicatorWidgetPercentage.vala',
'Widgets/IndicatorWidgetTemperature.vala',
'Widgets/IndicatorWidgetFrequency.vala',
@@ -14,11 +15,11 @@ source_indicator_files = [
]
wingpanel_dep = dependency('wingpanel-9')
-gtk_dep = dependency('gtk4', version: '>= 4.12')
indicator_dependencies = [
wingpanel_dep,
- gtk_dep
+ dependency('gtk4', version: '>= 4.12'),
+ dependency('granite-7', version: '>=7.7.0'),
]
shared_module(