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 @@ - -image/svg+xml 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 @@ - -image/svg+xml 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 @@ - - - - - - image/svg+xml - - - - - - - - - - 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(