diff --git a/Resource_Monitor@Ory0n/extension.js b/Resource_Monitor@Ory0n/extension.js index 155ee6c..25382db 100644 --- a/Resource_Monitor@Ory0n/extension.js +++ b/Resource_Monitor@Ory0n/extension.js @@ -53,6 +53,7 @@ import { applySecondarySeparatorStyle, buildMainGui, createMainGui, + syncMainGuiVisibility, } from "./panel/mainGui.js"; import { detectCapabilities, @@ -1679,6 +1680,10 @@ const ResourceMonitor = GObject.registerClass( syncThermalCpuVisibility(this); } + _syncMainGuiVisibility() { + syncMainGuiVisibility(this); + } + _refreshHandler(forceGpu = false) { return refreshHandler(this, forceGpu); } @@ -1839,6 +1844,8 @@ const ResourceMonitor = GObject.registerClass( element.hide(); }); } + + this._syncMainGuiVisibility(); } _basicItemWidth(width, element) { diff --git a/Resource_Monitor@Ory0n/panel/mainGui.js b/Resource_Monitor@Ory0n/panel/mainGui.js index df0a6e0..ca1ff60 100644 --- a/Resource_Monitor@Ory0n/panel/mainGui.js +++ b/Resource_Monitor@Ory0n/panel/mainGui.js @@ -3,6 +3,7 @@ import Gio from "gi://Gio"; import St from "gi://St"; import { DiskContainerSpace, DiskContainerStats, GpuContainer } from "./containers.js"; +import { getPanelGroupVisibility } from "../services/visibility.js"; function _addStyleClasses(actor, classes) { classes.forEach((cssClass) => actor.add_style_class_name(cssClass)); @@ -325,8 +326,35 @@ export function buildMainGui(indicator) { }); applySecondarySeparatorStyle(indicator); + syncMainGuiVisibility(indicator); if (indicator._box.get_parent() !== indicator) { indicator.add_child(indicator._box); } } + +export function syncMainGuiVisibility(indicator) { + const visibility = getPanelGroupVisibility(indicator); + const groupsByItem = { + cpu: indicator._cpuGroup, + ram: indicator._ramGroup, + swap: indicator._swapGroup, + stats: indicator._diskStatsGroup, + space: indicator._diskSpaceGroup, + eth: indicator._ethGroup, + wlan: indicator._wlanGroup, + gpu: indicator._gpuGroup, + }; + + Object.entries(groupsByItem).forEach(([item, group]) => { + if (!group) { + return; + } + + if (visibility[item]) { + group.show(); + } else { + group.hide(); + } + }); +} diff --git a/Resource_Monitor@Ory0n/services/visibility.js b/Resource_Monitor@Ory0n/services/visibility.js index d68563f..b0b9a68 100644 --- a/Resource_Monitor@Ory0n/services/visibility.js +++ b/Resource_Monitor@Ory0n/services/visibility.js @@ -36,6 +36,27 @@ export function hasVisibleGpu(indicator) { ); } +export function getPanelGroupVisibility(indicator) { + return { + cpu: + indicator._cpuStatus || + hasVisibleCpuFrequency(indicator) || + indicator._cpuLoadAverageStatus || + hasVisibleThermalCpuTemperature(indicator), + ram: indicator._ramStatus, + swap: indicator._swapStatus, + stats: indicator._diskStatsStatus, + space: indicator._diskSpaceStatus, + eth: + indicator._netEthStatus && + (indicator._nmEthStatus || !indicator._netAutoHideStatus), + wlan: + indicator._netWlanStatus && + (indicator._nmWlanStatus || !indicator._netAutoHideStatus), + gpu: hasVisibleGpu(indicator), + }; +} + export function syncCpuFrequencyVisibility(indicator) { indicator._basicItemStatus( hasVisibleCpuFrequency(indicator), diff --git a/tests/runtime-smoke.js b/tests/runtime-smoke.js index 700054b..153d9e5 100644 --- a/tests/runtime-smoke.js +++ b/tests/runtime-smoke.js @@ -16,6 +16,7 @@ import { parseLoadAverage, } from "../Resource_Monitor@Ory0n/runtime/metrics.js"; import { buildNetworkSample } from "../Resource_Monitor@Ory0n/runtime/network.js"; +import { getPanelGroupVisibility } from "../Resource_Monitor@Ory0n/services/visibility.js"; function assert(condition, message) { if (!condition) { @@ -42,6 +43,43 @@ function assertThrows(callback, message) { } } +function createVisibilityIndicator(overrides = {}) { + const defaults = { + _capabilities: { + cpuFrequency: false, + gpu: false, + thermalHwmon: false, + }, + _cpuStatus: false, + _cpuFrequencyStatus: false, + _cpuLoadAverageStatus: false, + _thermalCpuTemperatureStatus: false, + _thermalCpuTemperatureDevices: [], + _ramStatus: false, + _swapStatus: false, + _diskStatsStatus: false, + _diskSpaceStatus: false, + _netEthStatus: false, + _netWlanStatus: false, + _netAutoHideStatus: false, + _nmEthStatus: false, + _nmWlanStatus: false, + _gpuStatus: false, + _thermalGpuTemperatureStatus: false, + _gpuDevices: [], + _thermalGpuTemperatureDevices: [], + }; + + return { + ...defaults, + ...overrides, + _capabilities: { + ...defaults._capabilities, + ...(overrides._capabilities ?? {}), + }, + }; +} + function testDiskSerializationRoundtrip() { const serialized = serializeDiskEntry({ device: "/dev/nvme0n1p2", @@ -340,6 +378,68 @@ function testLoadAverageInvalidInputFallback() { ); } +function testPanelGroupVisibilityRamOnly() { + const visibility = getPanelGroupVisibility( + createVisibilityIndicator({ + _ramStatus: true, + }) + ); + + assert(visibility.ram === true, "RAM group should be visible"); + assert(visibility.cpu === false, "CPU group should be hidden"); + assert(visibility.swap === false, "Swap group should be hidden"); + assert(visibility.stats === false, "Disk stats group should be hidden"); + assert(visibility.space === false, "Disk space group should be hidden"); + assert(visibility.eth === false, "Ethernet group should be hidden"); + assert(visibility.wlan === false, "Wi-Fi group should be hidden"); + assert(visibility.gpu === false, "GPU group should be hidden"); +} + +function testPanelGroupVisibilityCpuSecondaryMetric() { + const visibility = getPanelGroupVisibility( + createVisibilityIndicator({ + _capabilities: { + cpuFrequency: true, + }, + _cpuFrequencyStatus: true, + }) + ); + + assert( + visibility.cpu === true, + "CPU group should be visible for CPU frequency without CPU usage" + ); + assert(visibility.ram === false, "RAM group should be hidden"); +} + +function testPanelGroupVisibilityNetworkAutoHide() { + const disconnected = getPanelGroupVisibility( + createVisibilityIndicator({ + _netAutoHideStatus: true, + _netEthStatus: true, + _nmEthStatus: false, + }) + ); + + assert( + disconnected.eth === false, + "Ethernet group should be hidden when auto-hide is enabled and disconnected" + ); + + const connected = getPanelGroupVisibility( + createVisibilityIndicator({ + _netAutoHideStatus: true, + _netEthStatus: true, + _nmEthStatus: true, + }) + ); + + assert( + connected.eth === true, + "Ethernet group should be visible when auto-hide is enabled and connected" + ); +} + testDiskSerializationRoundtrip(); testLegacySettingsEntriesAreRejected(); testGpuSerializationRoundtrip(); @@ -352,5 +452,8 @@ testDiskStatsSectorConversion(); testNetworkCounterReset(); testNetworkParsingWithoutTrailingNewline(); testLoadAverageInvalidInputFallback(); +testPanelGroupVisibilityRamOnly(); +testPanelGroupVisibilityCpuSecondaryMetric(); +testPanelGroupVisibilityNetworkAutoHide(); console.log("Runtime smoke tests passed.");